commit c4336b038c23fa37ee19bdd7d27bfa29b575a4a4 Author: Mike Krüger Date: Tue Jan 4 10:25:48 2005 +0000 created trunk folder. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin new file mode 100644 index 0000000000..ffb412ed5b --- /dev/null +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -0,0 +1,1852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/setup/BuildHelpIndex.pdb b/bin/setup/BuildHelpIndex.pdb new file mode 100644 index 0000000000..bc9851dcb4 Binary files /dev/null and b/bin/setup/BuildHelpIndex.pdb differ diff --git a/bin/setup/PostInstallTasks.bat b/bin/setup/PostInstallTasks.bat new file mode 100644 index 0000000000..a142e8fd69 --- /dev/null +++ b/bin/setup/PostInstallTasks.bat @@ -0,0 +1,15 @@ +@echo off +echo Installing NUnit assemblies into the GAC +echo. +echo NUnit.Core.dll +..\tools\gacutil2.exe /i ..\nunit.core.dll +echo. +echo NUnit.Framework.dll +..\tools\gacutil2.exe /i ..\nunit.framework.dll +echo. +echo ICSharpCode.SharpZipLib.dll +..\tools\gacutil2.exe /i ..\ICSharpCode.SharpZipLib.dll +echo. +echo Installing and configuring help system +BuildHelpIndex.exe +REM pause diff --git a/bin/setup/PostInstallTasks.vbs b/bin/setup/PostInstallTasks.vbs new file mode 100644 index 0000000000..94625452f3 --- /dev/null +++ b/bin/setup/PostInstallTasks.vbs @@ -0,0 +1,40 @@ +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +WshShell.CurrentDirectory = GetSetupPath() + +WScript.Echo "Installing shared assemblies into the GAC" & vbCrLf + +WScript.Echo "ICSharpCode.SharpZipLib.dll" +RegisterInGAC "..\ICSharpCode.SharpZipLib.dll" + +WScript.Echo "NUnit.Core.dll" +RegisterInGAC "..\nunit.core.dll" + +WScript.Echo "NUnit.Framework.dll" +RegisterInGAC "..\nunit.framework.dll" + +Execute "BuildHelpIndex.exe" + +' SHARED FUNCTIONS + +Public Sub RegisterInGAC(strAssemblyRelativePath) + Execute "..\tools\gacutil2.exe /i:" & strAssemblyRelativePath +End Sub + +Public Sub Execute(strProgram) + Dim oExec + + Set oExec = WshShell.Exec(strProgram) + + Do While oExec.Status = 0 + WScript.Sleep 100 + Loop + + WScript.Echo oExec.StdOut.ReadAll +End Sub + +Public Function GetSetupPath() + Dim strSetupDirPath + strSetupDirPath = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\")) + GetSetupPath = strSetupDirPath +End Function diff --git a/bin/setup/PreUninstallTasks.bat b/bin/setup/PreUninstallTasks.bat new file mode 100644 index 0000000000..02ca7b0c13 --- /dev/null +++ b/bin/setup/PreUninstallTasks.bat @@ -0,0 +1,9 @@ +@echo off +echo Removing NUnit assemblies from the GAC +echo. +..\tools\gacutil2.exe /u ..\nunit.core.dll +echo. +..\tools\gacutil2.exe /u ..\nunit.framework.dll +echo. +..\tools\gacutil2.exe /u ..\ICSharpCode.SharpZipLib.dll +REM pause diff --git a/bin/setup/PreUninstallTasks.vbs b/bin/setup/PreUninstallTasks.vbs new file mode 100644 index 0000000000..9efaa14d21 --- /dev/null +++ b/bin/setup/PreUninstallTasks.vbs @@ -0,0 +1,38 @@ +Dim WshShell +Set WshShell = CreateObject("WScript.Shell") +WshShell.CurrentDirectory = GetSetupPath() + +WScript.Echo "Removing shared assemblies from the GAC" & vbCrLf + +WScript.Echo "ICSharpCode.SharpZipLib.dll" +RemoveFromGAC "..\ICSharpCode.SharpZipLib.dll" + +WScript.Echo "NUnit.Core.dll" +RemoveFromGAC "..\nunit.core.dll" + +WScript.Echo "NUnit.Framework.dll" +RemoveFromGAC "..\nunit.framework.dll" + +' SHARED FUNCTIONS + +Public Sub RemoveFromGAC(strAssemblyRelativePath) + Execute "..\tools\gacutil2.exe /u:" & strAssemblyRelativePath +End Sub + +Public Sub Execute(strProgram) + Dim oExec + + Set oExec = WshShell.Exec(strProgram) + + Do While oExec.Status = 0 + WScript.Sleep 100 + Loop + + WScript.Echo oExec.StdOut.ReadAll +End Sub + +Public Function GetSetupPath() + Dim strSetupDirPath + strSetupDirPath = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\")) + GetSetupPath = strSetupDirPath +End Function diff --git a/bin/setup/readme.txt b/bin/setup/readme.txt new file mode 100644 index 0000000000..6e335f869c --- /dev/null +++ b/bin/setup/readme.txt @@ -0,0 +1 @@ +This folder is exlusively used by the setup program of #develop \ No newline at end of file diff --git a/data/ConversionStyleSheets/CSharp_prjx2csproj.xsl b/data/ConversionStyleSheets/CSharp_prjx2csproj.xsl new file mode 100644 index 0000000000..5efcbae97b --- /dev/null +++ b/data/ConversionStyleSheets/CSharp_prjx2csproj.xsl @@ -0,0 +1,124 @@ + + + + + + + + + + + + + '$(Configuration)' == '' + + + '$(Platform)' == '' AnyCPU + 8.0.40607 + 2.0 + + + + + + + + + + + + + + + + OnSuccessfulBuild + + + + + + + + + '$(Configuration)|$(Platform)' == '|AnyCPU' + + + + + + + + + + + + + System + System.Data + System.Drawing + System.Windows.Forms + System.Xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {00000000-0000-0000-0000-000000000000} + + + + + + + $(MSBuildBinPath)\Microsoft.CSHARP.Targets + + + + + + + diff --git a/data/ConversionStyleSheets/CSharp_prjx2csproj_user.xsl b/data/ConversionStyleSheets/CSharp_prjx2csproj_user.xsl new file mode 100644 index 0000000000..f104b2f122 --- /dev/null +++ b/data/ConversionStyleSheets/CSharp_prjx2csproj_user.xsl @@ -0,0 +1,21 @@ + + + + + + + + + + + '$(Configuration)|$(Platform)' == '|AnyCPU' + + + + + + + + + + diff --git a/data/ConversionStyleSheets/ConvertPrjx10to11.xsl b/data/ConversionStyleSheets/ConvertPrjx10to11.xsl new file mode 100644 index 0000000000..d8fcc92175 --- /dev/null +++ b/data/ConversionStyleSheets/ConvertPrjx10to11.xsl @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/ConversionStyleSheets/SVNChangelogToXml.xsl b/data/ConversionStyleSheets/SVNChangelogToXml.xsl new file mode 100644 index 0000000000..ade2924d91 --- /dev/null +++ b/data/ConversionStyleSheets/SVNChangelogToXml.xsl @@ -0,0 +1,61 @@ + + + + + + + + + + + Mike Krueger + + + Roman Taranchenko + + + Georg Brandl + + + Andrea Paatz + + + Daniel Grunwald + + + Denis Erchoff + + + Markus Palme + + + Ivo Kovacka + + + John Reilly + + + Christoph Wille + + + Alexandre Semenov + + + Nikola Kavaldjiev + + + + + + + + + + + + + + + + + diff --git a/data/ConversionStyleSheets/ShowChangeLog.xsl b/data/ConversionStyleSheets/ShowChangeLog.xsl new file mode 100644 index 0000000000..0ff1a14596 --- /dev/null +++ b/data/ConversionStyleSheets/ShowChangeLog.xsl @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + +
AuthorDateChange
+ + +
+
diff --git a/data/ConversionStyleSheets/ShowXmlDocumentation.xsl b/data/ConversionStyleSheets/ShowXmlDocumentation.xsl new file mode 100644 index 0000000000..7846694a04 --- /dev/null +++ b/data/ConversionStyleSheets/ShowXmlDocumentation.xsl @@ -0,0 +1,276 @@ + + + + + + + +
+ +
+ +
+ + + + + + + +

Parameters

+
+
+ + +

Return Value

+ +
+ + +

Value

+ +
+ + +

Exceptions

+
+ + + + + + +
Exception TypeCondition
+
+
+ + +

Permission

+
+ + + + + + +
MemberDescription
+
+
+ + +

Remarks

+ +
+ + +

Example

+ +
+ + +

See Also

+ +
+

+
+ + + + + + + +
+			
+		
+
+ + + + + + + urn:member: + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+
+
+ +
    + +
  • + + + +
  • +
    +
+
+ +
    + +
  1. + + + +
  2. +
    +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + + + + + + + urn:member: + + + + + + + + + + + + + + + + + + + + + + urn:member: + + + + + + + + + + + + + + + + + + + + + + + + + + urn:member: + + + + + + + + + + + + | + + + +

+ +

+
+ + +
+			
+				[]
+				
+
+ +
+
+ +
diff --git a/data/modes/C64CSharp.xshd b/data/modes/C64CSharp.xshd new file mode 100644 index 0000000000..1576547c1f --- /dev/null +++ b/data/modes/C64CSharp.xshd @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~!%^*()-+=|\#/{}[]:;"'<&> , .? + + # + + + + /// + + + + //@!/@ + + + + /* + */ + + + + " + " + + + + @@" + " + + + + ' + ' + + + ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ~!@%^*()-+=|\#/{}[]:;"'<> , .? + + + + + + + + + + + + + ~!@%^*()-+=|\#/{}[]:;"'<> , .? + + + < + > + + + + + + + + + ~!@%^*()-+=|\#/{}[]:;"'<> , .? + + + " + " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/modes/CSharp-Mode-VSEnh.xshd b/data/modes/CSharp-Mode-VSEnh.xshd new file mode 100644 index 0000000000..c09090b617 --- /dev/null +++ b/data/modes/CSharp-Mode-VSEnh.xshd @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + &<>~!@%^*()-+=|\#/{}[]:;"' , .? + + # + + + + /// + + + + //@!/@ + + + + /* + */ + + + + " + " + + + + @@" + " + + + + ' + ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <>~!@%^*()-+=|\#/{}[]:;"' , .? + + + + + + + + + + + + <>~!@%^*()-+=|\#/{}[]:;"' , .? + + + < + > + + + + + + + + + + + + + + + <>~!@%^*()-+=|\#/{}[]:;"' , .? + + + " + " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/modes/Jay-Mode.xshd b/data/modes/Jay-Mode.xshd new file mode 100644 index 0000000000..af171c362a --- /dev/null +++ b/data/modes/Jay-Mode.xshd @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %{ + %} + + + + %% + %% + + + + // + + + + /* + */ + + + + " + " + + + + ' + ' + + + + + + + + + + + + + + /= + + + + + + + + + + + + &<>~!@%^*()-+=|\#/{}[]:;"' , .? + + + { + } + + + + // + + + + /* + */ + + + : + + + + + + + + + + + + diff --git a/data/options/SharpDevelop-templates.xml b/data/options/SharpDevelop-templates.xml new file mode 100644 index 0000000000..26215f2067 --- /dev/null +++ b/data/options/SharpDevelop-templates.xml @@ -0,0 +1,72 @@ + + + public class | +{ + ${Selection} +} + for (|; ; ) { +${Selection} +} + for (|; ; ) +${Selection} + if (|) { + ${Selection} +} + if (|) { + ${Selection} +} else { + +} + if (|) +${Selection} + switch (|) { +case: +break; +default: +${Selection} +break; +} + switch (|) { +case : +${Selection} +break; +} + try { +${Selection}| +} catch (Exception) { + +} + try { +${Selection}| +} catch (Exception) { + +} finally { + +} + try { +${Selection}| +} finally { + +} + while (|) { +${Selection} +} + while (|) +${Selection} + System.Console.WriteLine(${Selection}|); + System.Console.Write(${Selection}|); + + + <b>|${Selection}</b> + <!--|${Selection}--> + <h1>|${Selection}</h1> + <h2>|${Selection}</h2> + <h3>|${Selection}</h3> + <h4>|${Selection}</h4> + <i>|${Selection}</i> + <p>|${Selection}</p> + + + <!--|${Selection}--> + + \ No newline at end of file diff --git a/data/options/SharpDevelop-tools.xml b/data/options/SharpDevelop-tools.xml new file mode 100644 index 0000000000..1cd1259812 --- /dev/null +++ b/data/options/SharpDevelop-tools.xml @@ -0,0 +1,23 @@ + + + ${ItemDir} + "${ItemPath}" + Notepad + Notepad + False + + + ${TargetDir} + "/R:${TargetPath}" "/W:${TargetDir}" + ${StartupPath}\nprof\NProf.Application.exe + NProf + True + + + ${TargetDir} + "${TargetPath}" + ILDasm.exe + IL Dasm + False + + diff --git a/data/options/SharpDevelopControlLibrary.sdcl b/data/options/SharpDevelopControlLibrary.sdcl new file mode 100644 index 0000000000..38e67778e4 --- /dev/null +++ b/data/options/SharpDevelopControlLibrary.sdcl @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/options/SharpDevelopProperties.xml b/data/options/SharpDevelopProperties.xml new file mode 100644 index 0000000000..ed82fbd7a1 --- /dev/null +++ b/data/options/SharpDevelopProperties.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/data/options/StandardHeader.xml b/data/options/StandardHeader.xml new file mode 100644 index 0000000000..c1d29d78cb --- /dev/null +++ b/data/options/StandardHeader.xml @@ -0,0 +1,29 @@ + + /* + * Created by SharpDevelop. + * User: ${USER} + * Date: ${DATE} + * Time: ${TIME} + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + + ' +' Created by SharpDevelop. +' User: ${USER} +' Date: ${DATE} +' Time: ${TIME} +' +' To change this template use Tools | Options | Coding | Edit Standard Headers. +' + + /* + * Created by SharpDevelop. + * User: ${USER} + * Date: ${DATE} + * Time: ${TIME} + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + + diff --git a/data/options/TextLib/ASCIITable.xml b/data/options/TextLib/ASCIITable.xml new file mode 100644 index 0000000000..ba77bed5e9 --- /dev/null +++ b/data/options/TextLib/ASCIITable.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/options/TextLib/CSharpDocumentationTags.xml b/data/options/TextLib/CSharpDocumentationTags.xml new file mode 100644 index 0000000000..dfb193f608 --- /dev/null +++ b/data/options/TextLib/CSharpDocumentationTags.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/options/TextLib/Licenses.xml b/data/options/TextLib/Licenses.xml new file mode 100644 index 0000000000..91b985b1bc --- /dev/null +++ b/data/options/TextLib/Licenses.xml @@ -0,0 +1,909 @@ + + + + + + + + + + + diff --git a/data/options/TextLib/SharpDevelop.xml b/data/options/TextLib/SharpDevelop.xml new file mode 100644 index 0000000000..870ad55733 --- /dev/null +++ b/data/options/TextLib/SharpDevelop.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/options/TextLib/XSLT.xml b/data/options/TextLib/XSLT.xml new file mode 100644 index 0000000000..f3bf0e74d0 --- /dev/null +++ b/data/options/TextLib/XSLT.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/options/TipsOfTheDay.xml b/data/options/TipsOfTheDay.xml new file mode 100644 index 0000000000..b1dccfd5cc --- /dev/null +++ b/data/options/TipsOfTheDay.xml @@ -0,0 +1,5 @@ + + + ${res:XML.StartupTips.Tip1} + ${res:XML.StartupTips.Tip2} + diff --git a/data/resources/InstallerBitmaps/default-banner.bmp b/data/resources/InstallerBitmaps/default-banner.bmp new file mode 100644 index 0000000000..810e8a10cf Binary files /dev/null and b/data/resources/InstallerBitmaps/default-banner.bmp differ diff --git a/data/resources/InstallerBitmaps/default-dialog.bmp b/data/resources/InstallerBitmaps/default-dialog.bmp new file mode 100644 index 0000000000..4970fa29ba Binary files /dev/null and b/data/resources/InstallerBitmaps/default-dialog.bmp differ diff --git a/data/resources/InstallerBitmaps/exclamic.bmp b/data/resources/InstallerBitmaps/exclamic.bmp new file mode 100644 index 0000000000..906ce3246d Binary files /dev/null and b/data/resources/InstallerBitmaps/exclamic.bmp differ diff --git a/data/resources/InstallerBitmaps/info.bmp b/data/resources/InstallerBitmaps/info.bmp new file mode 100644 index 0000000000..7e0ff7f14c Binary files /dev/null and b/data/resources/InstallerBitmaps/info.bmp differ diff --git a/data/resources/InstallerBitmaps/new.bmp b/data/resources/InstallerBitmaps/new.bmp new file mode 100644 index 0000000000..27881dfe97 Binary files /dev/null and b/data/resources/InstallerBitmaps/new.bmp differ diff --git a/data/resources/InstallerBitmaps/up.bmp b/data/resources/InstallerBitmaps/up.bmp new file mode 100644 index 0000000000..86f6b5a847 Binary files /dev/null and b/data/resources/InstallerBitmaps/up.bmp differ diff --git a/data/resources/MenuStyle0.png b/data/resources/MenuStyle0.png new file mode 100644 index 0000000000..a6f702884a Binary files /dev/null and b/data/resources/MenuStyle0.png differ diff --git a/data/resources/MenuStyle1.png b/data/resources/MenuStyle1.png new file mode 100644 index 0000000000..a68587675e Binary files /dev/null and b/data/resources/MenuStyle1.png differ diff --git a/data/resources/MenuStyle2.png b/data/resources/MenuStyle2.png new file mode 100644 index 0000000000..29dba0dbf2 Binary files /dev/null and b/data/resources/MenuStyle2.png differ diff --git a/data/resources/StringResources.ar.resources b/data/resources/StringResources.ar.resources new file mode 100644 index 0000000000..c84f7ecc4d Binary files /dev/null and b/data/resources/StringResources.ar.resources differ diff --git a/data/resources/StringResources.bg.resources b/data/resources/StringResources.bg.resources new file mode 100644 index 0000000000..b1394a3c2e Binary files /dev/null and b/data/resources/StringResources.bg.resources differ diff --git a/data/resources/StringResources.cn-big.resources b/data/resources/StringResources.cn-big.resources new file mode 100644 index 0000000000..e36f7b05ab Binary files /dev/null and b/data/resources/StringResources.cn-big.resources differ diff --git a/data/resources/StringResources.cn-gb.resources b/data/resources/StringResources.cn-gb.resources new file mode 100644 index 0000000000..587a89470b Binary files /dev/null and b/data/resources/StringResources.cn-gb.resources differ diff --git a/data/resources/StringResources.cz.resources b/data/resources/StringResources.cz.resources new file mode 100644 index 0000000000..e3d64273e0 Binary files /dev/null and b/data/resources/StringResources.cz.resources differ diff --git a/data/resources/StringResources.de.resources b/data/resources/StringResources.de.resources new file mode 100644 index 0000000000..9843da396f Binary files /dev/null and b/data/resources/StringResources.de.resources differ diff --git a/data/resources/StringResources.dk.resources b/data/resources/StringResources.dk.resources new file mode 100644 index 0000000000..f2ef23c525 Binary files /dev/null and b/data/resources/StringResources.dk.resources differ diff --git a/data/resources/StringResources.es-mx.resources b/data/resources/StringResources.es-mx.resources new file mode 100644 index 0000000000..c5234a13fb Binary files /dev/null and b/data/resources/StringResources.es-mx.resources differ diff --git a/data/resources/StringResources.es.resources b/data/resources/StringResources.es.resources new file mode 100644 index 0000000000..121f2c7d4b Binary files /dev/null and b/data/resources/StringResources.es.resources differ diff --git a/data/resources/StringResources.fi.resources b/data/resources/StringResources.fi.resources new file mode 100644 index 0000000000..ee7bbe115d Binary files /dev/null and b/data/resources/StringResources.fi.resources differ diff --git a/data/resources/StringResources.fr.resources b/data/resources/StringResources.fr.resources new file mode 100644 index 0000000000..b5adb477e9 Binary files /dev/null and b/data/resources/StringResources.fr.resources differ diff --git a/data/resources/StringResources.hu.resources b/data/resources/StringResources.hu.resources new file mode 100644 index 0000000000..8e3f08098f Binary files /dev/null and b/data/resources/StringResources.hu.resources differ diff --git a/data/resources/StringResources.it.resources b/data/resources/StringResources.it.resources new file mode 100644 index 0000000000..54323a5fda Binary files /dev/null and b/data/resources/StringResources.it.resources differ diff --git a/data/resources/StringResources.jp.resources b/data/resources/StringResources.jp.resources new file mode 100644 index 0000000000..2569ec3aec Binary files /dev/null and b/data/resources/StringResources.jp.resources differ diff --git a/data/resources/StringResources.kr.resources b/data/resources/StringResources.kr.resources new file mode 100644 index 0000000000..77b6380c99 Binary files /dev/null and b/data/resources/StringResources.kr.resources differ diff --git a/data/resources/StringResources.lt.resources b/data/resources/StringResources.lt.resources new file mode 100644 index 0000000000..a92dcf08fc Binary files /dev/null and b/data/resources/StringResources.lt.resources differ diff --git a/data/resources/StringResources.nl.resources b/data/resources/StringResources.nl.resources new file mode 100644 index 0000000000..4e9a5cdcaa Binary files /dev/null and b/data/resources/StringResources.nl.resources differ diff --git a/data/resources/StringResources.pl.resources b/data/resources/StringResources.pl.resources new file mode 100644 index 0000000000..0542618ed3 Binary files /dev/null and b/data/resources/StringResources.pl.resources differ diff --git a/data/resources/StringResources.pt-br.resources b/data/resources/StringResources.pt-br.resources new file mode 100644 index 0000000000..37a8d08d23 Binary files /dev/null and b/data/resources/StringResources.pt-br.resources differ diff --git a/data/resources/StringResources.pt.resources b/data/resources/StringResources.pt.resources new file mode 100644 index 0000000000..e43f84e658 Binary files /dev/null and b/data/resources/StringResources.pt.resources differ diff --git a/data/resources/StringResources.ro.resources b/data/resources/StringResources.ro.resources new file mode 100644 index 0000000000..8dee999bfd Binary files /dev/null and b/data/resources/StringResources.ro.resources differ diff --git a/data/resources/StringResources.ru.resources b/data/resources/StringResources.ru.resources new file mode 100644 index 0000000000..f83ccfb96a Binary files /dev/null and b/data/resources/StringResources.ru.resources differ diff --git a/data/resources/StringResources.se.resources b/data/resources/StringResources.se.resources new file mode 100644 index 0000000000..bbb74e7f5f Binary files /dev/null and b/data/resources/StringResources.se.resources differ diff --git a/data/resources/StringResources.sl.resources b/data/resources/StringResources.sl.resources new file mode 100644 index 0000000000..8d09d16f6e Binary files /dev/null and b/data/resources/StringResources.sl.resources differ diff --git a/data/resources/StringResources.sr.resources b/data/resources/StringResources.sr.resources new file mode 100644 index 0000000000..41254aa58e Binary files /dev/null and b/data/resources/StringResources.sr.resources differ diff --git a/data/resources/StringResources.tr.resources b/data/resources/StringResources.tr.resources new file mode 100644 index 0000000000..ce93446344 Binary files /dev/null and b/data/resources/StringResources.tr.resources differ diff --git a/data/resources/css/MsdnHelp.css b/data/resources/css/MsdnHelp.css new file mode 100644 index 0000000000..4eb43fa6cc --- /dev/null +++ b/data/resources/css/MsdnHelp.css @@ -0,0 +1,389 @@ +body /* This body tag requires the use of one of the sets of banner and/or text div ids */ + { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + background: #ffffff; + color: #000000; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 70%; + width: 100%; + } +div#scrollyes /* Allows topic to scroll with correct margins. Cannot be used with running head banner */ + { /* Must immediately follow . */ + padding: 2px 15px 2px 22px; + width: 100%; + } +div#nsbanner /* Creates Nonscrolling banner region */ + { + position: relative; + left: 0px; + padding: 0px 0px 0px 0px; + border-bottom: 1px solid #999999; + } +div#nstext /* Creates the scrolling text area for Nonscrolling region topic */ + { + padding: 5px 10px 0px 22px; + } +div#scrbanner /* Creates the running head bar in a full-scroll topic */ + { /* Allows topic to scroll. */ + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + border-bottom: 1px solid #999999; + } +div#scrtext /* Creates the text area in a full-scroll topic */ + { /* Allows topic to scroll. */ + padding: 0px 10px 0px 22px; + } +div#bannerrow1 /* provides full-width color to top row in running head (requires script) */ + { + background-color: #99ccff; + } +div#titlerow /* provides non-scroll topic title area (requires script) */ + { + width: 100%; /* Forces tables to have correct right margin */ + padding: 0px 10px 0px 22px; + background-color: #99ccff; + } + +h1, h2, h3, h4 + { + font-family: Verdana, Arial, Helvetica, sans-serif; + margin-bottom: .4em; + margin-top: 1em; + font-weight: bold; + } +h1 + { + font-size: 120%; + margin-top: 0em; + } +div#scrollyes h1 /* Changes font size for full-scrolling topic */ + { + font-size: 150%; + } +h2 + { + font-size: 130%; + } +h3 + { + font-size: 115%; + } +h4 + { + font-size: 100%; + } +.dtH1, .dtH2, .dtH3, .dtH4 + { + margin-left: -18px; + } +div#titlerow h1 + { + margin-bottom: .2em + } + +table.bannerparthead, table.bannertitle /* General values for the Running Head tables */ + { + position: relative; + left: 0px; + top: 0px; + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; + width: 100%; + height: 21px; + border-collapse: collapse; + border-style: solid; + border-width: 0px; + background-color: #99ccff; + font-size: 100%; + } +table.bannerparthead td /* General Values for cells in the top row of running head */ + { + margin: 0px 0px 0px 0px; + padding: 2px 0px 0px 4px; + vertical-align: middle; + border-width: 0px; + border-style: solid; + border-color: #999999; + background: transparent; + font-style: italic; + font-weight: normal; + } +table.bannerparthead td.product /* Values for top right cell in running head */ + { /* Allows for a second text block in the running head */ + text-align: right; + padding: 2px 5px 0px 5px; + } +table.bannertitle td /* General Values for cells in the bottom row of running head */ + { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 3px; + vertical-align: middle; + border-width: 0px 0px 1px 0px; + border-style: solid; + border-color: #999999; + background: transparent; + font-weight: bold; + } +td.button1 /* Values for button cells */ + { + width: 14px; + cursor: hand; + } + +p + { + margin: .5em 0em .5em 0em; + } +blockquote.dtBlock + { + margin: .5em 1.5em .5em 1.5em; + } +div#dtHoverText + { + color: #000066; + } +.normal + { + margin: .5em 0em .5em 0em; + } +.fineprint + { + font-size: 90%; /* 90% of 70% */ + } +.indent + { + margin: .5em 1.5em .5em 1.5em; + } +.topicstatus /* Topic Status Boilerplate class */ + { + display: block; + color: red; + } +p.label + { + margin-top: 1em; + } +p.labelproc + { + margin-top: 1em; + color: #000066; + } + +div.tablediv + { + width: 100%; /* Forces tables to have correct right margins and top spacing */ + margin-top: -.4em; + } +ol div.tablediv, ul div.tablediv, ol div.HxLinkTable, ul div.HxLinkTable + { + margin-top: 0em; /* Forces tables to have correct right margins and top spacing */ + } +table.dtTABLE + { + width: 100%; /* Forces tables to have correct right margin */ + margin-top: .6em; + margin-bottom: .3em; + border-width: 1px 1px 0px 0px; + border-style: solid; + border-color: #999999; + background-color: #999999; + font-size: 100%; /* Text in Table is same size as text outside table */ + } +table.dtTABLE th, table.dtTABLE td + { + border-style: solid; /* Creates the cell border and color */ + border-width: 0px 0px 1px 1px; + border-style: solid; + border-color: #999999; + padding: 4px 6px; + text-align: left; + } +table.dtTABLE th + { + background: #cccccc; /* Creates the shaded table header row */ + vertical-align: bottom; + } +table.dtTABLE td + { + background: #ffffff; + vertical-align: top; + } + +MSHelp\:ktable + { + disambiguator: span; + separator:  | + prefix: | + postfix:   + filterString: ; + } + +div.HxLinkTable + { + width: auto; /* Forces tables to have correct right margins and top spacing */ + margin-top: -.4em; + visibility: visible; + } +ol div.HxLinkTable, ul div.HxLinkTable + { + margin-top: 0em; /* Forces tables to have correct right margins and top spacing */ + } +table.HxLinkTable /* Keep in sync with general table settings below */ + { + width: auto; + margin-top: 1.5em; + margin-bottom: .3em; + margin-left: -1em; + border-width: 1px 1px 0px 0px; + border-style: solid; + border-color: #999999; + background-color: #999999; + font-size: 100%; /* Text in Table is same size as text outside table */ + behavior:url(hxlinktable.htc); /* Attach the behavior to link elements. */ + } +table.HxLinkTable th, table.HxLinkTable td /* Keep in sync with general table settings below */ + { + border-style: solid; /* Creates the cell border and color */ + border-width: 0px 0px 1px 1px; + border-style: solid; + border-color: #999999; + padding: 4px 6px; + text-align: left; + } +table.HxLinkTable th /* Keep in sync with general table settings below */ + { + background: #cccccc; /* Creates the shaded table header row */ + vertical-align: bottom; + } +table.HxLinkTable td /* Keep in sync with general table settings below */ + { + background: #ffffff; + vertical-align: top; + } + +pre, div.syntax + { + margin-top: .5em; + margin-bottom: .5em; + } +pre, code, .code, div.syntax + { + font: 100% Monospace, Courier New, Courier; /* This is 100% of 70% */ + color: #000066; + } +pre b, code b + { + letter-spacing: .1em; /* opens kerning on bold in Syntax/Code */ + } +pre.syntax, div.syntax + { + background: #cccccc; + padding: 4px 8px; + cursor: text; + margin-top: 1em; + margin-bottom: 1em; + color: #000000; + border-width: 1px; + border-style: solid; + border-color: #999999; +/* ------------------------------------- */ +/* BEGIN changes to dtue.css conventions */ + font-weight: bolder; + letter-spacing: .1em; + } +.syntax span.lang + { + margin: 0; + font-weight: normal; + } +.syntax span.meta + { + margin: 0; + font-weight: normal; + font-style: italic; + } +.syntax a + { + margin: 0; + font-weight: normal; + } +/* END changes to dtue.css conventions */ +/* ----------------------------------- */ + +.syntax div + { + padding-left: 24px; + text-indent: -24px; + } + +.syntax .attribute + { + font-weight: normal; + } +div.footer + { + font-style: italic; + } +div.footer hr + { + color: #999999; + height: 1px; + } + +ol, ul + { + margin: .5em 0em 0em 4em; + } +li + { + margin-bottom: .5em; + } +ul p, ol p, dl p + { + margin-left: 0em; + } +ul p.label, ol p.label + { + margin-top: .5em; + } + +dl + { + margin-top: 0em; + padding-left: 1px; /* Prevents italic-letter descenders from being cut off */ + } +dd + { + margin-bottom: 0em; + margin-left: 1.5em; + } +dt + { + margin-top: .5em; + } + +a:link + { + color: #0000ff; + } +a:visited + { + color: #0000ff; + } +a:hover + { + color: #3366ff; + } + +img + { + border: none; + } + +/* Not in dtue.css. Used by NDoc's "ShowMissing..." options. */ +.missing + { + color: Red; + font-weight: bold; + } diff --git a/data/resources/css/SharpDevelopStandard.css b/data/resources/css/SharpDevelopStandard.css new file mode 100644 index 0000000000..2c089bf2a2 --- /dev/null +++ b/data/resources/css/SharpDevelopStandard.css @@ -0,0 +1,45 @@ +body /* This body tag requires the use of one of the sets of banner and/or text div ids */ + { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + background: #ffffff; + color: #000000; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 70%; + width: 100%; + } + +table + { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + background: #ffffff; + color: #000000; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 100%; + } + +h1, h2, h3, h4 + { + font-family: Verdana, Arial, Helvetica, sans-serif; + margin-bottom: .4em; + margin-top: 1em; + font-weight: bold; + } +h1 + { + font-size: 150%; + margin-top: 0em; + } +h2 + { + font-size: 130%; + } +h3 + { + font-size: 115%; + } +h4 + { + font-size: 100%; + } diff --git a/data/resources/filetypes/Filetypes.xml b/data/resources/filetypes/Filetypes.xml new file mode 100644 index 0000000000..2738936b8c --- /dev/null +++ b/data/resources/filetypes/Filetypes.xml @@ -0,0 +1,12 @@ + + + ${res:ICSharpCode.FiletypeRegisterer.SharpDevelopCombineFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.SharpDevelopProjectFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.CSharpSourceFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.VBNetSourceFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.JavaSourceFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.XMLFormFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.ResXResourceFilesFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.BinaryResourceFilesFileAssozisation} + ${res:ICSharpCode.FiletypeRegisterer.XmlFileAssozisation} + diff --git a/data/resources/filetypes/c.ico b/data/resources/filetypes/c.ico new file mode 100644 index 0000000000..2389e7bd2f Binary files /dev/null and b/data/resources/filetypes/c.ico differ diff --git a/data/resources/filetypes/cmbx.ico b/data/resources/filetypes/cmbx.ico new file mode 100644 index 0000000000..1b5063739f Binary files /dev/null and b/data/resources/filetypes/cmbx.ico differ diff --git a/data/resources/filetypes/cs.ico b/data/resources/filetypes/cs.ico new file mode 100644 index 0000000000..2389e7bd2f Binary files /dev/null and b/data/resources/filetypes/cs.ico differ diff --git a/data/resources/filetypes/java.ico b/data/resources/filetypes/java.ico new file mode 100644 index 0000000000..3873181b3c Binary files /dev/null and b/data/resources/filetypes/java.ico differ diff --git a/data/resources/filetypes/prjx.ico b/data/resources/filetypes/prjx.ico new file mode 100644 index 0000000000..7b3b17293f Binary files /dev/null and b/data/resources/filetypes/prjx.ico differ diff --git a/data/resources/filetypes/resx.ico b/data/resources/filetypes/resx.ico new file mode 100644 index 0000000000..1bc198b033 Binary files /dev/null and b/data/resources/filetypes/resx.ico differ diff --git a/data/resources/filetypes/vb.ico b/data/resources/filetypes/vb.ico new file mode 100644 index 0000000000..b95d71ebc2 Binary files /dev/null and b/data/resources/filetypes/vb.ico differ diff --git a/data/resources/filetypes/xfrm.ico b/data/resources/filetypes/xfrm.ico new file mode 100644 index 0000000000..340f9f7a7d Binary files /dev/null and b/data/resources/filetypes/xfrm.ico differ diff --git a/data/resources/filetypes/xml.ico b/data/resources/filetypes/xml.ico new file mode 100644 index 0000000000..e5d84f07d1 Binary files /dev/null and b/data/resources/filetypes/xml.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/EmptyFile.xcf b/data/resources/image/BitmapResources/BitmapResources-data/EmptyFile.xcf new file mode 100644 index 0000000000..1fa1709732 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/EmptyFile.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/ErrorReport.png b/data/resources/image/BitmapResources/BitmapResources-data/ErrorReport.png new file mode 100644 index 0000000000..6b53f11174 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/ErrorReport.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/GeneralWizardBackground.png b/data/resources/image/BitmapResources/BitmapResources-data/GeneralWizardBackground.png new file mode 100644 index 0000000000..6ad78efa2a Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/GeneralWizardBackground.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AboutIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AboutIcon.png new file mode 100644 index 0000000000..2949f59568 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AboutIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AdjustBackgroundColor.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AdjustBackgroundColor.png new file mode 100644 index 0000000000..279fd07968 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AdjustBackgroundColor.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AdjustColor.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AdjustColor.png new file mode 100644 index 0000000000..e33dc03e9d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.AdjustColor.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Assembly.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Assembly.png new file mode 100644 index 0000000000..9837ed52d7 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Assembly.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BoldText.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BoldText.png new file mode 100644 index 0000000000..896e286d23 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BoldText.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BookMarks.xcf b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BookMarks.xcf new file mode 100644 index 0000000000..5bb70f788b Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BookMarks.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserAfter.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserAfter.png new file mode 100644 index 0000000000..c1543df939 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserAfter.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserBefore.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserBefore.png new file mode 100644 index 0000000000..c165b435ed Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserBefore.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserCancel.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserCancel.png new file mode 100644 index 0000000000..c3697c3590 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserCancel.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserRefresh.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserRefresh.png new file mode 100644 index 0000000000..70770fe953 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BrowserRefresh.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BuildCombine.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BuildCombine.png new file mode 100644 index 0000000000..2155f2fbbd Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BuildCombine.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BuildCurrentSelectedProject.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BuildCurrentSelectedProject.png new file mode 100644 index 0000000000..e9c4dc351b Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.BuildCurrentSelectedProject.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CDROM.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CDROM.png new file mode 100644 index 0000000000..e8e7156467 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CDROM.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CancelIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CancelIcon.png new file mode 100644 index 0000000000..2679b72338 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CancelIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Center.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Center.png new file mode 100644 index 0000000000..091b1d6509 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Center.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CloseAllDocuments.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CloseAllDocuments.png new file mode 100644 index 0000000000..8608b7907a Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CloseAllDocuments.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CloseFileIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CloseFileIcon.png new file mode 100644 index 0000000000..2eb1d5ed35 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CloseFileIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CommentRegion.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CommentRegion.png new file mode 100644 index 0000000000..b3e1a8dca3 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CommentRegion.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CopyIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CopyIcon.png new file mode 100644 index 0000000000..becaca143c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CopyIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CopyLeftIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CopyLeftIcon.png new file mode 100644 index 0000000000..0cda21a5e4 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CopyLeftIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CutIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CutIcon.png new file mode 100644 index 0000000000..af459186e6 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.CutIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DRIVE.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DRIVE.png new file mode 100644 index 0000000000..a59025c4c1 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DRIVE.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DeleteIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DeleteIcon.png new file mode 100644 index 0000000000..824d938dd6 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DeleteIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DesignPanel.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DesignPanel.png new file mode 100644 index 0000000000..1a6b25101f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.DesignPanel.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Desktop.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Desktop.png new file mode 100644 index 0000000000..4184d40187 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Desktop.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Error.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Error.png new file mode 100644 index 0000000000..46bf9d8987 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Error.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FLOPPY.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FLOPPY.png new file mode 100644 index 0000000000..7aba41ca29 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FLOPPY.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindIcon.png new file mode 100644 index 0000000000..e2d421efe2 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindIcon.xcf b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindIcon.xcf new file mode 100644 index 0000000000..5dbc9e002a Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindIcon.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindInFiles.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindInFiles.png new file mode 100644 index 0000000000..e178ffd7bc Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindInFiles.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindNextIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindNextIcon.png new file mode 100644 index 0000000000..f20ba4aaab Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FindNextIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignBottoms.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignBottoms.png new file mode 100644 index 0000000000..b3f75f224c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignBottoms.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignCenters.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignCenters.png new file mode 100644 index 0000000000..7ed1af02ea Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignCenters.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignLefts.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignLefts.png new file mode 100644 index 0000000000..9fa9bafedb Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignLefts.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignMiddles.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignMiddles.png new file mode 100644 index 0000000000..921cccaa03 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignMiddles.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignRights.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignRights.png new file mode 100644 index 0000000000..60946941c8 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignRights.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignToGrid.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignToGrid.png new file mode 100644 index 0000000000..d2630f8245 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignToGrid.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignTops.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignTops.png new file mode 100644 index 0000000000..d07ef7b071 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.AlignTops.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.BringToFront.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.BringToFront.png new file mode 100644 index 0000000000..0c374aa93e Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.BringToFront.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.CenterHorizontally.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.CenterHorizontally.png new file mode 100644 index 0000000000..a0ee19b2af Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.CenterHorizontally.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.CenterVertically.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.CenterVertically.png new file mode 100644 index 0000000000..288aed25dc Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.CenterVertically.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.DecreaseHorizontalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.DecreaseHorizontalSpace.png new file mode 100644 index 0000000000..e084158c5f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.DecreaseHorizontalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.DecreaseVerticalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.DecreaseVerticalSpace.png new file mode 100644 index 0000000000..00be5bee88 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.DecreaseVerticalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.EqualizeHorizontalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.EqualizeHorizontalSpace.png new file mode 100644 index 0000000000..23bd38642a Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.EqualizeHorizontalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.EqualizeVerticalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.EqualizeVerticalSpace.png new file mode 100644 index 0000000000..00a90e7d3c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.EqualizeVerticalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.IncreaseHorizontalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.IncreaseHorizontalSpace.png new file mode 100644 index 0000000000..c1f46dea40 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.IncreaseHorizontalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.IncreaseVerticalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.IncreaseVerticalSpace.png new file mode 100644 index 0000000000..22c3ea0d62 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.IncreaseVerticalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.LockControls.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.LockControls.png new file mode 100644 index 0000000000..19cf7364ea Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.LockControls.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameHeight.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameHeight.png new file mode 100644 index 0000000000..a3221bdb6f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameHeight.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameSize.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameSize.png new file mode 100644 index 0000000000..ea07a3f771 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameSize.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameWidth.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameWidth.png new file mode 100644 index 0000000000..888367f67c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.MakeSameWidth.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.PointerIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.PointerIcon.png new file mode 100644 index 0000000000..b7d2611713 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.PointerIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.RemoveHorizontalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.RemoveHorizontalSpace.png new file mode 100644 index 0000000000..c781713314 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.RemoveHorizontalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.RemoveVerticalSpace.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.RemoveVerticalSpace.png new file mode 100644 index 0000000000..1a5ff1a75c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.RemoveVerticalSpace.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.SendToBack.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.SendToBack.png new file mode 100644 index 0000000000..00c48e0033 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.SendToBack.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.ShowTabOrder.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.ShowTabOrder.png new file mode 100644 index 0000000000..99ec0d9c96 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.ShowTabOrder.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.SizeToGrid.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.SizeToGrid.png new file mode 100644 index 0000000000..b22cc48e50 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.SizeToGrid.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.ViewCode.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.ViewCode.png new file mode 100644 index 0000000000..1b8949fb6e Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FormsDesigner.ViewCode.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FullScreen.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FullScreen.png new file mode 100644 index 0000000000..22354faa71 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FullScreen.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FullScreen.xcf b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FullScreen.xcf new file mode 100644 index 0000000000..a2a8828321 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.FullScreen.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpClosedFolder.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpClosedFolder.png new file mode 100644 index 0000000000..89b1c0739b Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpClosedFolder.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpIcon.png new file mode 100644 index 0000000000..0ae2fe34d2 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpOpenFolder.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpOpenFolder.png new file mode 100644 index 0000000000..df13c79989 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpOpenFolder.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpTopic.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpTopic.png new file mode 100644 index 0000000000..5d63ab3256 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HelpTopic.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.AnchorElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.AnchorElement.png new file mode 100644 index 0000000000..587900cc2b Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.AnchorElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ButtonElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ButtonElement.png new file mode 100644 index 0000000000..eb8b167f16 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ButtonElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.DivElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.DivElement.png new file mode 100644 index 0000000000..00ab8d9232 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.DivElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.Element.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.Element.png new file mode 100644 index 0000000000..fda73d0895 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.Element.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.FieldSetElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.FieldSetElement.png new file mode 100644 index 0000000000..391a15730d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.FieldSetElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.FormElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.FormElement.png new file mode 100644 index 0000000000..64ac58d029 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.FormElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.HorizontalRuleElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.HorizontalRuleElement.png new file mode 100644 index 0000000000..f97e9d340d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.HorizontalRuleElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.IFrameElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.IFrameElement.png new file mode 100644 index 0000000000..648f1451c8 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.IFrameElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ImageElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ImageElement.png new file mode 100644 index 0000000000..8eb2df79b7 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ImageElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputButtonElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputButtonElement.png new file mode 100644 index 0000000000..eb8b167f16 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputButtonElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputCheckBoxElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputCheckBoxElement.png new file mode 100644 index 0000000000..51f2a58a72 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputCheckBoxElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputFileElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputFileElement.png new file mode 100644 index 0000000000..f57dd2c169 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputFileElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputHiddenElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputHiddenElement.png new file mode 100644 index 0000000000..55ef562103 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputHiddenElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputImageElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputImageElement.png new file mode 100644 index 0000000000..5596458b4b Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputImageElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputPasswordElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputPasswordElement.png new file mode 100644 index 0000000000..6a3101abe0 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputPasswordElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputRadioElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputRadioElement.png new file mode 100644 index 0000000000..2797d729c4 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputRadioElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputResetElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputResetElement.png new file mode 100644 index 0000000000..de3cb99a7d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputResetElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputSubmitElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputSubmitElement.png new file mode 100644 index 0000000000..0ca6193622 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputSubmitElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputTextElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputTextElement.png new file mode 100644 index 0000000000..0ed54ae27f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.InputTextElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.LabelElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.LabelElement.png new file mode 100644 index 0000000000..056a3c3a48 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.LabelElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ListBoxElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ListBoxElement.png new file mode 100644 index 0000000000..299fd4f57c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.ListBoxElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.PanelElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.PanelElement.png new file mode 100644 index 0000000000..5c63bde8cd Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.PanelElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.SelectElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.SelectElement.png new file mode 100644 index 0000000000..92008b61e1 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.SelectElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.SpanElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.SpanElement.png new file mode 100644 index 0000000000..3b7820ccee Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.SpanElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.TableElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.TableElement.png new file mode 100644 index 0000000000..f3d4782246 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.TableElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.TextAreaElement.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.TextAreaElement.png new file mode 100644 index 0000000000..290927aa49 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.HtmlElements.TextAreaElement.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ILDasm.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ILDasm.png new file mode 100644 index 0000000000..655e73ecdc Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ILDasm.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Indent.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Indent.png new file mode 100644 index 0000000000..5e452e0c6c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Indent.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Information.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Information.png new file mode 100644 index 0000000000..b87cceeedf Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Information.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ItalicText.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ItalicText.png new file mode 100644 index 0000000000..8a22ba109e Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ItalicText.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.LargeIconsIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.LargeIconsIcon.png new file mode 100644 index 0000000000..f2779119e0 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.LargeIconsIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Left.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Left.png new file mode 100644 index 0000000000..1698c19dfa Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Left.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Library.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Library.png new file mode 100644 index 0000000000..d366971ff3 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Library.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.LowerToUpperCase.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.LowerToUpperCase.png new file mode 100644 index 0000000000..b82410258e Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.LowerToUpperCase.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.MyComputer.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.MyComputer.png new file mode 100644 index 0000000000..61704f1429 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.MyComputer.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NETWORK.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NETWORK.png new file mode 100644 index 0000000000..61229df0a7 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NETWORK.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewDocumentIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewDocumentIcon.png new file mode 100644 index 0000000000..145b5e0514 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewDocumentIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewFolderIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewFolderIcon.png new file mode 100644 index 0000000000..945dc8151e Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewFolderIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewProjectIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewProjectIcon.png new file mode 100644 index 0000000000..142a3619b3 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NewProjectIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NextWindowIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NextWindowIcon.png new file mode 100644 index 0000000000..386f93a470 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.NextWindowIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenAssembly.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenAssembly.png new file mode 100644 index 0000000000..32e39de6d2 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenAssembly.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenFileIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenFileIcon.png new file mode 100644 index 0000000000..b90603f105 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenFileIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenProjectIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenProjectIcon.png new file mode 100644 index 0000000000..4ccb634697 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OpenProjectIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Options.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Options.png new file mode 100644 index 0000000000..d9ec5e97d6 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Options.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OutDent.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OutDent.png new file mode 100644 index 0000000000..2605230018 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.OutDent.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PasteIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PasteIcon.png new file mode 100644 index 0000000000..07a5c18b85 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PasteIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PersonalFiles.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PersonalFiles.png new file mode 100644 index 0000000000..d34d59291d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PersonalFiles.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PreView.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PreView.png new file mode 100644 index 0000000000..a076df73be Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PreView.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PrevWindowIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PrevWindowIcon.png new file mode 100644 index 0000000000..9089c72e15 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PrevWindowIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Print.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Print.png new file mode 100644 index 0000000000..5e4406244e Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Print.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PropertiesIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PropertiesIcon.png new file mode 100644 index 0000000000..9b821bfc22 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.PropertiesIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Question.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Question.png new file mode 100644 index 0000000000..8cd07d0a98 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Question.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RedoIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RedoIcon.png new file mode 100644 index 0000000000..9ce8542694 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RedoIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RedoIcon.xcf b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RedoIcon.xcf new file mode 100644 index 0000000000..6ae087a2e1 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RedoIcon.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ReplaceIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ReplaceIcon.png new file mode 100644 index 0000000000..c05b9d3a9f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ReplaceIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ReplaceInFiles.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ReplaceInFiles.png new file mode 100644 index 0000000000..187fa1c1b5 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ReplaceInFiles.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.bin.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.bin.ico new file mode 100644 index 0000000000..8cc34769c0 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.bin.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.bmp.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.bmp.ico new file mode 100644 index 0000000000..60200fd242 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.bmp.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.cursor.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.cursor.ico new file mode 100644 index 0000000000..e07f3506d5 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.cursor.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.icon.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.icon.ico new file mode 100644 index 0000000000..9ab94bc957 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.icon.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.obj.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.obj.ico new file mode 100644 index 0000000000..a915472770 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.obj.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.string.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.string.ico new file mode 100644 index 0000000000..1e454f5138 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.ResourceEditor.string.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Right.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Right.png new file mode 100644 index 0000000000..0b542d231f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Right.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RunProgramIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RunProgramIcon.png new file mode 100644 index 0000000000..e6b703b834 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.RunProgramIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SaveAllIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SaveAllIcon.png new file mode 100644 index 0000000000..9efefecca8 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SaveAllIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SaveIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SaveIcon.png new file mode 100644 index 0000000000..81acdcb989 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SaveIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SelectionArrow.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SelectionArrow.png new file mode 100644 index 0000000000..39ec4f499a Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SelectionArrow.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SideBarDocument.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SideBarDocument.png new file mode 100644 index 0000000000..2d88407191 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SideBarDocument.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SmallIconsIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SmallIconsIcon.png new file mode 100644 index 0000000000..a2c2910abd Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SmallIconsIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SplitWindow.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SplitWindow.png new file mode 100644 index 0000000000..aaeed6a387 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SplitWindow.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.StopProcess.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.StopProcess.png new file mode 100644 index 0000000000..4cc4a7c08c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.StopProcess.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SubTypes.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SubTypes.png new file mode 100644 index 0000000000..82bfe26d71 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SubTypes.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SuperTypes.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SuperTypes.png new file mode 100644 index 0000000000..831e43bb11 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.SuperTypes.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Gray.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Gray.png new file mode 100644 index 0000000000..b25daf4a56 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Gray.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Green.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Green.png new file mode 100644 index 0000000000..cd664a8ee3 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Green.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Red.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Red.png new file mode 100644 index 0000000000..b532001219 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Red.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Yellow.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Yellow.png new file mode 100644 index 0000000000..6c65b2ce34 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TestRunner.Yellow.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TipOfTheDay.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TipOfTheDay.png new file mode 100644 index 0000000000..72cdd913fa Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.TipOfTheDay.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLClass.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLClass.png new file mode 100644 index 0000000000..675722c4a8 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLClass.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLImplementation.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLImplementation.png new file mode 100644 index 0000000000..1eeb2d3b44 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLImplementation.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLNote.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLNote.png new file mode 100644 index 0000000000..a5675b8a44 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLNote.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLStructure.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLStructure.png new file mode 100644 index 0000000000..bf2cf4d083 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UMLStructure.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UnderlineText.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UnderlineText.png new file mode 100644 index 0000000000..0012aac521 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UnderlineText.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UndoIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UndoIcon.png new file mode 100644 index 0000000000..dba9b3a735 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UndoIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UndoIcon.xcf b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UndoIcon.xcf new file mode 100644 index 0000000000..7513e839d7 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UndoIcon.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UpperToLowerCase.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UpperToLowerCase.png new file mode 100644 index 0000000000..0577402f6f Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.UpperToLowerCase.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Warning.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Warning.png new file mode 100644 index 0000000000..3dc66814f0 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.Warning.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.WebSearchIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.WebSearchIcon.png new file mode 100644 index 0000000000..26e1760ac3 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.16x16.WebSearchIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Error.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Error.png new file mode 100644 index 0000000000..28ba9c4e13 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Error.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Information.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Information.png new file mode 100644 index 0000000000..1af48b2d6d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Information.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Question.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Question.png new file mode 100644 index 0000000000..5daf76b217 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Question.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Warning.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Warning.png new file mode 100644 index 0000000000..3d12316635 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.32x32.Warning.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.AboutImage.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.AboutImage.png new file mode 100644 index 0000000000..a64b7251f2 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.AboutImage.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.ClassBrowserIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.ClassBrowserIcon.png new file mode 100644 index 0000000000..9d3998bea8 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.ClassBrowserIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.FileScoutIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.FileScoutIcon.png new file mode 100644 index 0000000000..6dd0091d5d Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.FileScoutIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.ProjectScoutIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.ProjectScoutIcon.png new file mode 100644 index 0000000000..cd4935982c Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.ProjectScoutIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.SharpDevelopIcon.ico b/data/resources/image/BitmapResources/BitmapResources-data/Icons.SharpDevelopIcon.ico new file mode 100644 index 0000000000..107562d216 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.SharpDevelopIcon.ico differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/Icons.TipOfTheDayIcon.png b/data/resources/image/BitmapResources/BitmapResources-data/Icons.TipOfTheDayIcon.png new file mode 100644 index 0000000000..703bc5fa26 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/Icons.TipOfTheDayIcon.png differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/NewMarker.xcf b/data/resources/image/BitmapResources/BitmapResources-data/NewMarker.xcf new file mode 100644 index 0000000000..c6b74749f7 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/NewMarker.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/SplashScreen.xcf b/data/resources/image/BitmapResources/BitmapResources-data/SplashScreen.xcf new file mode 100644 index 0000000000..7223cc0d85 Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/SplashScreen.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources-data/deleteMarker.xcf b/data/resources/image/BitmapResources/BitmapResources-data/deleteMarker.xcf new file mode 100644 index 0000000000..5e1e2196ca Binary files /dev/null and b/data/resources/image/BitmapResources/BitmapResources-data/deleteMarker.xcf differ diff --git a/data/resources/image/BitmapResources/BitmapResources.res b/data/resources/image/BitmapResources/BitmapResources.res new file mode 100644 index 0000000000..018a7eb66e --- /dev/null +++ b/data/resources/image/BitmapResources/BitmapResources.res @@ -0,0 +1,402 @@ +# this file was automatically generated by ResAsm + +Icons.Svn.StatusImages = SubversionIcons\StatusImages.bmp + +# Nes project browser icons +ProjectBrowser.Folder.Closed = ProjectBrowserIcons\Folder.Closed.png +ProjectBrowser.Folder.Open = ProjectBrowserIcons\Folder.Open.png +ProjectBrowser.GhostFolder.Closed = ProjectBrowserIcons\GhostFolder.Closed.png +ProjectBrowser.GhostFolder.Open = ProjectBrowserIcons\GhostFolder.Open.png +ProjectBrowser.PropertyFolder.Closed = ProjectBrowserIcons\PropertyFolder.Closed.png +ProjectBrowser.PropertyFolder.Open = ProjectBrowserIcons\PropertyFolder.Open.png +ProjectBrowser.ReferenceFolder.Closed = ProjectBrowserIcons\ReferenceFolder.Closed.png +ProjectBrowser.ReferenceFolder.Open = ProjectBrowserIcons\ReferenceFolder.Open.png +ProjectBrowser.GhostFile = ProjectBrowserIcons\GhostFile.png +ProjectBrowser.CodeBehind = ProjectBrowserIcons\CodeBehind.png +ProjectBrowser.MissingFile = ProjectBrowserIcons\MissingFile.png +ProjectBrowser.ProjectWarning = ProjectBrowserIcons\ProjectWarning.png +ProjectBrowser.MissingProject = ProjectBrowserIcons\MissingProject.png +ProjectBrowser.MissingSolution = ProjectBrowserIcons\MissingSolution.png +ProjectBrowser.Solution = ProjectBrowserIcons\Solution.png +ProjectBrowser.Toolbar.Refresh = ProjectBrowserIcons\Toolbar.Refresh.png +ProjectBrowser.Toolbar.ShowHiddenFiles = ProjectBrowserIcons\Toolbar.ShowHiddenFiles.png +ProjectBrowser.SolutionFolder.Closed = ProjectBrowserIcons\SolutionFolder.Closed.png +ProjectBrowser.SolutionFolder.Open = ProjectBrowserIcons\SolutionFolder.Open.png +ProjectBrowser.SolutionFolder.CreateNew = ProjectBrowserIcons\SolutionFolder.CreateNew.png + +ProjectBrowser.WebReferenceFolder.Closed = ProjectBrowserIcons\WebReferenceFolder.Closed.png +ProjectBrowser.WebReferenceFolder.Open = ProjectBrowserIcons\WebReferenceFolder.Open.png +ProjectBrowser.WebReference = ProjectBrowserIcons\WebReference.png + +#Output pad + +OutputPad.Toolbar.ClearOutputWindow = OutputPadIcons\ClearOutputWindow.png +OutputPad.Toolbar.ToggleWordWrap = OutputPadIcons\ToggleWordWrap.png + + +Icons.16x16.OpenFolderBitmap = ProjectBrowserIcons\Folder.Open.png +Icons.16x16.ClosedFolderBitmap = ProjectBrowserIcons\Folder.Closed.png + +Icons.16x16.OpenReferenceFolder = ProjectBrowserIcons\GhostFolder.Open.png +Icons.16x16.ClosedReferenceFolder = ProjectBrowserIcons\GhostFolder.Closed.png + +Icons.16x16.OpenResourceFolder = ProjectBrowserIcons\PropertyFolder.Open.png +Icons.16x16.ClosedResourceFolder = ProjectBrowserIcons\PropertyFolder.Closed.png + + +Icons.16x16.Debug.Start = DebuggerIcons\Icons.16x16.Debug.Start.png +Icons.16x16.Debug.StartWithoutDebugging = DebuggerIcons\Icons.16x16.Debug.StartWithoutDebugging.png +Icons.16x16.Debug.StopProcess = DebuggerIcons\Icons.16x16.Debug.StopProcess.png +Icons.16x16.Debug.Break = DebuggerIcons\Icons.16x16.Debug.Break.png +Icons.16x16.Debug.Continue = DebuggerIcons\Icons.16x16.Debug.Continue.png +Icons.16x16.Debug.StepOver = DebuggerIcons\Icons.16x16.Debug.StepOver.png +Icons.16x16.Debug.StepInto = DebuggerIcons\Icons.16x16.Debug.StepInto.png +Icons.16x16.Debug.StepOut = DebuggerIcons\Icons.16x16.Debug.StepOut.png + +Icons.16x16.TestRunner.Yellow = BitmapResources-data\Icons.16x16.TestRunner.Yellow.png +Icons.16x16.TestRunner.Red = BitmapResources-data\Icons.16x16.TestRunner.Red.png +Icons.16x16.TestRunner.Green = BitmapResources-data\Icons.16x16.TestRunner.Green.png +Icons.16x16.TestRunner.Gray = BitmapResources-data\Icons.16x16.TestRunner.Gray.png +ErrorReport = BitmapResources-data\ErrorReport.png +Icons.16x16.Shell = Icons.16x16.Shell.png +Icons.16x16.StopProcess = BitmapResources-data\Icons.16x16.StopProcess.png +Icons.16x16.Desktop = BitmapResources-data\Icons.16x16.Desktop.png +Icons.16x16.MyComputer = BitmapResources-data\Icons.16x16.MyComputer.png +Icons.16x16.PersonalFiles = BitmapResources-data\Icons.16x16.PersonalFiles.png +Icons.16x16.NewProjectIcon = BitmapResources-data\Icons.16x16.NewProjectIcon.png +Icons.TipOfTheDayIcon = BitmapResources-data\Icons.TipOfTheDayIcon.png +Icons.16x16.Indent = BitmapResources-data\Icons.16x16.Indent.png +Icons.16x16.ResourceEditor.icon = BitmapResources-data\Icons.16x16.ResourceEditor.icon.ico +Icons.16x16.FullScreen = BitmapResources-data\Icons.16x16.FullScreen.png +Icons.16x16.AdjustBackgroundColor = BitmapResources-data\Icons.16x16.AdjustBackgroundColor.png +Icons.16x16.HelpOpenFolder = BitmapResources-data\Icons.16x16.HelpOpenFolder.png +Icons.16x16.SmallIconsIcon = BitmapResources-data\Icons.16x16.SmallIconsIcon.png +Icons.16x16.HtmlElements.AnchorElement = BitmapResources-data\Icons.16x16.HtmlElements.AnchorElement.png +Icons.16x16.Assembly = BitmapResources-data\Icons.16x16.Assembly.png +Icons.16x16.TipOfTheDay = BitmapResources-data\Icons.16x16.TipOfTheDay.png +Icons.16x16.Right = BitmapResources-data\Icons.16x16.Right.png +Icons.16x16.CDROM = BitmapResources-data\Icons.16x16.CDROM.png +Icons.16x16.RedoIcon = BitmapResources-data\Icons.16x16.RedoIcon.png +Icons.16x16.CloseAllDocuments = BitmapResources-data\Icons.16x16.CloseAllDocuments.png +Icons.16x16.HtmlElements.InputRadioElement = BitmapResources-data\Icons.16x16.HtmlElements.InputRadioElement.png +Icons.16x16.FormsDesigner.SendToBack = BitmapResources-data\Icons.16x16.FormsDesigner.SendToBack.png +Icons.16x16.BrowserAfter = BitmapResources-data\Icons.16x16.BrowserAfter.png +Icons.SharpDevelopIcon = BitmapResources-data\Icons.SharpDevelopIcon.ico +Icons.16x16.HtmlElements.InputPasswordElement = BitmapResources-data\Icons.16x16.HtmlElements.InputPasswordElement.png +Icons.16x16.HtmlElements.InputCheckBoxElement = BitmapResources-data\Icons.16x16.HtmlElements.InputCheckBoxElement.png +Icons.16x16.FormsDesigner.AlignCenters = BitmapResources-data\Icons.16x16.FormsDesigner.AlignCenters.png +Icons.16x16.Center = BitmapResources-data\Icons.16x16.Center.png +Icons.16x16.FormsDesigner.CenterHorizontally = BitmapResources-data\Icons.16x16.FormsDesigner.CenterHorizontally.png +Icons.16x16.FormsDesigner.LockControls = BitmapResources-data\Icons.16x16.FormsDesigner.LockControls.png +Icons.16x16.FormsDesigner.DecreaseVerticalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.DecreaseVerticalSpace.png +Icons.16x16.NewFolderIcon = BitmapResources-data\Icons.16x16.NewFolderIcon.png +Icons.16x16.UnderlineText = BitmapResources-data\Icons.16x16.UnderlineText.png +Icons.16x16.RunProgramIcon = BitmapResources-data\Icons.16x16.RunProgramIcon.png +Icons.16x16.HtmlElements.TableElement = BitmapResources-data\Icons.16x16.HtmlElements.TableElement.png +Icons.16x16.ResourceEditor.obj = BitmapResources-data\Icons.16x16.ResourceEditor.obj.ico +Icons.16x16.ResourceEditor.bin = BitmapResources-data\Icons.16x16.ResourceEditor.bin.ico +Icons.16x16.DesignPanel = BitmapResources-data\Icons.16x16.DesignPanel.png +Icons.ClassBrowserIcon = BitmapResources-data\Icons.ClassBrowserIcon.png +Icons.16x16.HtmlElements.InputImageElement = BitmapResources-data\Icons.16x16.HtmlElements.InputImageElement.png +Icons.16x16.FormsDesigner.AlignBottoms = BitmapResources-data\Icons.16x16.FormsDesigner.AlignBottoms.png +Icons.16x16.FormsDesigner.RemoveVerticalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.RemoveVerticalSpace.png +Icons.16x16.ResourceEditor.string = BitmapResources-data\Icons.16x16.ResourceEditor.string.ico +Icons.32x32.Error = BitmapResources-data\Icons.32x32.Error.png +Icons.16x16.LargeIconsIcon = BitmapResources-data\Icons.16x16.LargeIconsIcon.png +Icons.16x16.NextWindowIcon = BitmapResources-data\Icons.16x16.NextWindowIcon.png +Icons.16x16.FormsDesigner.CenterVertically = BitmapResources-data\Icons.16x16.FormsDesigner.CenterVertically.png +Icons.16x16.Options = BitmapResources-data\Icons.16x16.Options.png +Icons.16x16.FormsDesigner.EqualizeHorizontalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.EqualizeHorizontalSpace.png +Icons.16x16.FormsDesigner.IncreaseHorizontalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.IncreaseHorizontalSpace.png +Icons.16x16.HtmlElements.ImageElement = BitmapResources-data\Icons.16x16.HtmlElements.ImageElement.png +Icons.16x16.HtmlElements.LabelElement = BitmapResources-data\Icons.16x16.HtmlElements.LabelElement.png +Icons.16x16.WebSearchIcon = BitmapResources-data\Icons.16x16.WebSearchIcon.png +Icons.16x16.FormsDesigner.AlignToGrid = BitmapResources-data\Icons.16x16.FormsDesigner.AlignToGrid.png +Icons.16x16.HtmlElements.InputResetElement = BitmapResources-data\Icons.16x16.HtmlElements.InputResetElement.png +Icons.16x16.CommentRegion = BitmapResources-data\Icons.16x16.CommentRegion.png +Icons.16x16.PreView = BitmapResources-data\Icons.16x16.PreView.png +Icons.16x16.UMLNote = BitmapResources-data\Icons.16x16.UMLNote.png +Icons.16x16.FormsDesigner.AlignRights = BitmapResources-data\Icons.16x16.FormsDesigner.AlignRights.png +Icons.FileScoutIcon = BitmapResources-data\Icons.FileScoutIcon.png +Icons.ProjectScoutIcon = BitmapResources-data\Icons.ProjectScoutIcon.png +Icons.16x16.HtmlElements.PanelElement = BitmapResources-data\Icons.16x16.HtmlElements.PanelElement.png +Icons.16x16.AdjustColor = BitmapResources-data\Icons.16x16.AdjustColor.png +Icons.16x16.SideBarDocument = BitmapResources-data\Icons.16x16.SideBarDocument.png +Icons.16x16.Information = BitmapResources-data\Icons.16x16.Information.png +Icons.16x16.CopyLeftIcon = BitmapResources-data\Icons.16x16.CopyLeftIcon.png +Icons.16x16.FormsDesigner.AlignLefts = BitmapResources-data\Icons.16x16.FormsDesigner.AlignLefts.png +Icons.16x16.FormsDesigner.MakeSameHeight = BitmapResources-data\Icons.16x16.FormsDesigner.MakeSameHeight.png +Icons.16x16.BrowserCancel = BitmapResources-data\Icons.16x16.BrowserCancel.png +Icons.16x16.HtmlElements.DivElement = BitmapResources-data\Icons.16x16.HtmlElements.DivElement.png +Icons.16x16.BuildCurrentSelectedProject = BitmapResources-data\Icons.16x16.BuildCurrentSelectedProject.png +Icons.16x16.HelpTopic = BitmapResources-data\Icons.16x16.HelpTopic.png +Icons.16x16.PrevWindowIcon = BitmapResources-data\Icons.16x16.PrevWindowIcon.png +Icons.16x16.HtmlElements.SelectElement = BitmapResources-data\Icons.16x16.HtmlElements.SelectElement.png +Icons.16x16.OpenAssembly = BitmapResources-data\Icons.16x16.OpenAssembly.png +Icons.16x16.HtmlElements.InputSubmitElement = BitmapResources-data\Icons.16x16.HtmlElements.InputSubmitElement.png +Icons.16x16.CancelIcon = BitmapResources-data\Icons.16x16.CancelIcon.png +Icons.16x16.ItalicText = BitmapResources-data\Icons.16x16.ItalicText.png +Icons.16x16.BrowserBefore = BitmapResources-data\Icons.16x16.BrowserBefore.png +Icons.16x16.HtmlElements.InputTextElement = BitmapResources-data\Icons.16x16.HtmlElements.InputTextElement.png +Icons.16x16.HelpClosedFolder = BitmapResources-data\Icons.16x16.HelpClosedFolder.png +Icons.16x16.CutIcon = BitmapResources-data\Icons.16x16.CutIcon.png +Icons.16x16.BoldText = BitmapResources-data\Icons.16x16.BoldText.png +GeneralWizardBackground = BitmapResources-data\GeneralWizardBackground.png +Icons.16x16.HtmlElements.TextAreaElement = BitmapResources-data\Icons.16x16.HtmlElements.TextAreaElement.png +Icons.16x16.SaveAllIcon = BitmapResources-data\Icons.16x16.SaveAllIcon.png +Icons.16x16.UMLClass = BitmapResources-data\Icons.16x16.UMLClass.png +Icons.16x16.Left = BitmapResources-data\Icons.16x16.Left.png +Icons.16x16.FormsDesigner.SizeToGrid = BitmapResources-data\Icons.16x16.FormsDesigner.SizeToGrid.png +Icons.16x16.HtmlElements.FormElement = BitmapResources-data\Icons.16x16.HtmlElements.FormElement.png +Icons.16x16.HtmlElements.InputFileElement = BitmapResources-data\Icons.16x16.HtmlElements.InputFileElement.png +Icons.16x16.NewDocumentIcon = BitmapResources-data\Icons.16x16.NewDocumentIcon.png +Icons.16x16.UMLImplementation = BitmapResources-data\Icons.16x16.UMLImplementation.png +Icons.16x16.SelectionArrow = BitmapResources-data\Icons.16x16.SelectionArrow.png +Icons.16x16.Question = BitmapResources-data\Icons.16x16.Question.png +Icons.16x16.PasteIcon = BitmapResources-data\Icons.16x16.PasteIcon.png +Icons.32x32.Warning = BitmapResources-data\Icons.32x32.Warning.png +Icons.16x16.FormsDesigner.MakeSameSize = BitmapResources-data\Icons.16x16.FormsDesigner.MakeSameSize.png +Icons.16x16.Error = BitmapResources-data\Icons.16x16.Error.png +Icons.16x16.HtmlElements.InputButtonElement = BitmapResources-data\Icons.16x16.HtmlElements.InputButtonElement.png +Icons.16x16.NETWORK = BitmapResources-data\Icons.16x16.NETWORK.png +Icons.16x16.Library = BitmapResources-data\Icons.16x16.Library.png +Icons.16x16.AboutIcon = BitmapResources-data\Icons.16x16.AboutIcon.png +Icons.16x16.LowerToUpperCase = BitmapResources-data\Icons.16x16.LowerToUpperCase.png +Icons.16x16.UndoIcon = BitmapResources-data\Icons.16x16.UndoIcon.png +Icons.16x16.FormsDesigner.AlignMiddles = BitmapResources-data\Icons.16x16.FormsDesigner.AlignMiddles.png +Icons.16x16.ReplaceIcon = BitmapResources-data\Icons.16x16.ReplaceIcon.png +Icons.16x16.FormsDesigner.MakeSameWidth = BitmapResources-data\Icons.16x16.FormsDesigner.MakeSameWidth.png +Icons.16x16.OpenProjectIcon = BitmapResources-data\Icons.16x16.OpenProjectIcon.png +Icons.16x16.HtmlElements.InputHiddenElement = BitmapResources-data\Icons.16x16.HtmlElements.InputHiddenElement.png +Icons.16x16.SuperTypes = BitmapResources-data\Icons.16x16.SuperTypes.png +Icons.16x16.BuildCombine = BitmapResources-data\Icons.16x16.BuildCombine.png +Icons.16x16.HelpIcon = BitmapResources-data\Icons.16x16.HelpIcon.png +Icons.16x16.ReplaceInFiles = BitmapResources-data\Icons.16x16.ReplaceInFiles.png +Icons.16x16.FLOPPY = BitmapResources-data\Icons.16x16.FLOPPY.png +Icons.AboutImage = BitmapResources-data\Icons.AboutImage.png +Icons.16x16.UMLStructure = BitmapResources-data\Icons.16x16.UMLStructure.png +Icons.16x16.HtmlElements.HorizontalRuleElement = BitmapResources-data\Icons.16x16.HtmlElements.HorizontalRuleElement.png +Icons.16x16.FormsDesigner.ShowTabOrder = BitmapResources-data\Icons.16x16.FormsDesigner.ShowTabOrder.png +Icons.16x16.FindInFiles = BitmapResources-data\Icons.16x16.FindInFiles.png +Icons.16x16.ResourceEditor.cursor = BitmapResources-data\Icons.16x16.ResourceEditor.cursor.ico +Icons.16x16.FormsDesigner.PointerIcon = BitmapResources-data\Icons.16x16.FormsDesigner.PointerIcon.png +Icons.16x16.CopyIcon = BitmapResources-data\Icons.16x16.CopyIcon.png +Icons.16x16.PropertiesIcon = BitmapResources-data\Icons.16x16.PropertiesIcon.png +Icons.16x16.OutDent = BitmapResources-data\Icons.16x16.OutDent.png +Icons.16x16.DeleteIcon = BitmapResources-data\Icons.16x16.DeleteIcon.png +Icons.16x16.FormsDesigner.IncreaseVerticalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.IncreaseVerticalSpace.png +Icons.16x16.UpperToLowerCase = BitmapResources-data\Icons.16x16.UpperToLowerCase.png +Icons.16x16.FindNextIcon = BitmapResources-data\Icons.16x16.FindNextIcon.png +Icons.32x32.Information = BitmapResources-data\Icons.32x32.Information.png +Icons.16x16.FormsDesigner.BringToFront = BitmapResources-data\Icons.16x16.FormsDesigner.BringToFront.png +Icons.16x16.BrowserRefresh = BitmapResources-data\Icons.16x16.BrowserRefresh.png +Icons.16x16.HtmlElements.ListBoxElement = BitmapResources-data\Icons.16x16.HtmlElements.ListBoxElement.png +Icons.16x16.FormsDesigner.DecreaseHorizontalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.DecreaseHorizontalSpace.png +Icons.16x16.ResourceEditor.bmp = BitmapResources-data\Icons.16x16.ResourceEditor.bmp.ico +Icons.16x16.SubTypes = BitmapResources-data\Icons.16x16.SubTypes.png +Icons.16x16.DRIVE = BitmapResources-data\Icons.16x16.DRIVE.png +Icons.16x16.HtmlElements.ButtonElement = BitmapResources-data\Icons.16x16.HtmlElements.ButtonElement.png +Icons.16x16.Print = BitmapResources-data\Icons.16x16.Print.png +Icons.32x32.Question = BitmapResources-data\Icons.32x32.Question.png +Icons.16x16.FormsDesigner.ViewCode = BitmapResources-data\Icons.16x16.FormsDesigner.ViewCode.png +Icons.16x16.FormsDesigner.AlignTops = BitmapResources-data\Icons.16x16.FormsDesigner.AlignTops.png +Icons.16x16.Warning = BitmapResources-data\Icons.16x16.Warning.png +Icons.16x16.HtmlElements.SpanElement = BitmapResources-data\Icons.16x16.HtmlElements.SpanElement.png +Icons.16x16.FormsDesigner.RemoveHorizontalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.RemoveHorizontalSpace.png +Icons.16x16.HtmlElements.IFrameElement = BitmapResources-data\Icons.16x16.HtmlElements.IFrameElement.png +Icons.16x16.FormsDesigner.EqualizeVerticalSpace = BitmapResources-data\Icons.16x16.FormsDesigner.EqualizeVerticalSpace.png +Icons.16x16.FindIcon = BitmapResources-data\Icons.16x16.FindIcon.png +Icons.16x16.HtmlElements.Element = BitmapResources-data\Icons.16x16.HtmlElements.Element.png +Icons.16x16.SaveIcon = BitmapResources-data\Icons.16x16.SaveIcon.png +Icons.16x16.ILDasm = BitmapResources-data\Icons.16x16.ILDasm.png +Icons.16x16.CloseFileIcon = BitmapResources-data\Icons.16x16.CloseFileIcon.png +Icons.16x16.OpenFileIcon = BitmapResources-data\Icons.16x16.OpenFileIcon.png +Icons.16x16.HtmlElements.FieldSetElement = BitmapResources-data\Icons.16x16.HtmlElements.FieldSetElement.png +Icons.16x16.SplitWindow = BitmapResources-data\Icons.16x16.SplitWindow.png + +#pad icons +PadIcons.ErrorList = PadIcons\ErrorList.png +PadIcons.TaskList = PadIcons\TaskList.png +PadIcons.Output = PadIcons\Output.png +PadIcons.Toolbar = PadIcons\Toolbar.png +PadIcons.UnitTest = PadIcons\UnitTest.png +PadIcons.FindResults = PadIcons\FindResults.png +PadIcons.FileBrowser = PadIcons\FileBrowser.png +PadIcons.ClassBrowser = PadIcons\ClassBrowser.png +PadIcons.ProjectBrowser = PadIcons\ProjectBrowser.png +PadIcons.Bookmarks = PadIcons\Bookmarks.png + +#classbrowser icons +Icons.16x16.NameSpace = ClassBrowserIcons\Icons.16x16.NameSpace.png +Icons.16x16.Literal = ClassBrowserIcons\Icons.16x16.Literal.png +Icons.16x16.Reference = ClassBrowserIcons\Icons.16x16.Reference.png + + +Icons.16x16.Class = ClassBrowserIcons\Icons.16x16.Class.png +Icons.16x16.Struct = ClassBrowserIcons\Icons.16x16.Struct.png +Icons.16x16.Enum = ClassBrowserIcons\Icons.16x16.Enum.png +Icons.16x16.Interface = ClassBrowserIcons\Icons.16x16.Interface.png +Icons.16x16.Delegate = ClassBrowserIcons\Icons.16x16.Delegate.png +Icons.16x16.Method = ClassBrowserIcons\Icons.16x16.Method.png +Icons.16x16.Property = ClassBrowserIcons\Icons.16x16.Property.png +Icons.16x16.Indexer = ClassBrowserIcons\Icons.16x16.Indexer.png +Icons.16x16.Field = ClassBrowserIcons\Icons.16x16.Field.png +Icons.16x16.Event = ClassBrowserIcons\Icons.16x16.Event.png + +Icons.16x16.PrivateClass = ClassBrowserIcons\Icons.16x16.PrivateClass.png +Icons.16x16.PrivateStruct = ClassBrowserIcons\Icons.16x16.PrivateStruct.png +Icons.16x16.PrivateEnum = ClassBrowserIcons\Icons.16x16.PrivateEnum.png +Icons.16x16.PrivateInterface = ClassBrowserIcons\Icons.16x16.PrivateInterface.png +Icons.16x16.PrivateDelegate = ClassBrowserIcons\Icons.16x16.PrivateDelegate.png +Icons.16x16.PrivateMethod = ClassBrowserIcons\Icons.16x16.PrivateMethod.png +Icons.16x16.PrivateProperty = ClassBrowserIcons\Icons.16x16.PrivateProperty.png +Icons.16x16.PrivateIndexer = ClassBrowserIcons\Icons.16x16.PrivateIndexer.png +Icons.16x16.PrivateField = ClassBrowserIcons\Icons.16x16.PrivateField.png +Icons.16x16.PrivateEvent = ClassBrowserIcons\Icons.16x16.PrivateEvent.png + +Icons.16x16.ProtectedClass = ClassBrowserIcons\Icons.16x16.ProtectedClass.png +Icons.16x16.ProtectedStruct = ClassBrowserIcons\Icons.16x16.ProtectedStruct.png +Icons.16x16.ProtectedEnum = ClassBrowserIcons\Icons.16x16.ProtectedEnum.png +Icons.16x16.ProtectedInterface = ClassBrowserIcons\Icons.16x16.ProtectedInterface.png +Icons.16x16.ProtectedDelegate = ClassBrowserIcons\Icons.16x16.ProtectedDelegate.png +Icons.16x16.ProtectedMethod = ClassBrowserIcons\Icons.16x16.ProtectedMethod.png +Icons.16x16.ProtectedProperty = ClassBrowserIcons\Icons.16x16.ProtectedProperty.png +Icons.16x16.ProtectedIndexer = ClassBrowserIcons\Icons.16x16.ProtectedIndexer.png +Icons.16x16.ProtectedField = ClassBrowserIcons\Icons.16x16.ProtectedField.png +Icons.16x16.ProtectedEvent = ClassBrowserIcons\Icons.16x16.ProtectedEvent.png + +Icons.16x16.InternalClass = ClassBrowserIcons\Icons.16x16.InternalClass.png +Icons.16x16.InternalStruct = ClassBrowserIcons\Icons.16x16.InternalStruct.png +Icons.16x16.InternalEnum = ClassBrowserIcons\Icons.16x16.InternalEnum.png +Icons.16x16.InternalInterface = ClassBrowserIcons\Icons.16x16.InternalInterface.png +Icons.16x16.InternalDelegate = ClassBrowserIcons\Icons.16x16.InternalDelegate.png +Icons.16x16.InternalMethod = ClassBrowserIcons\Icons.16x16.InternalMethod.png +Icons.16x16.InternalProperty = ClassBrowserIcons\Icons.16x16.InternalProperty.png +Icons.16x16.InternalIndexer = ClassBrowserIcons\Icons.16x16.InternalIndexer.png +Icons.16x16.InternalField = ClassBrowserIcons\Icons.16x16.InternalField.png +Icons.16x16.InternalEvent = ClassBrowserIcons\Icons.16x16.InternalEvent.png + +#bookmark icons +Bookmarks.ClearAll = Bookmarks\ClearAll.png +Bookmarks.GotoNext = Bookmarks\GotoNext.png +Bookmarks.GotoNextInFile = Bookmarks\GotoNextInFile.png +Bookmarks.GotoNextInFolder = Bookmarks\GotoNextInFolder.png +Bookmarks.GotoPrev = Bookmarks\GotoPrev.png +Bookmarks.GotoPrevInFile = Bookmarks\GotoPrevInFile.png +Bookmarks.GotoPrevInFolder = Bookmarks\GotoPrevInFolder.png +Bookmarks.ToggleMark = Bookmarks\ToggleMark.png +Bookmarks.DeleteMark = Bookmarks\DeleteMark.png +Bookmarks.EnableDisableAll = Bookmarks\EnableDisableAll.png +Bookmarks.EnableDisableMark = Bookmarks\EnableDisableMark.png + +#backend icons +C#.ProjectIcon = backendicons\CSharp\SmallProject.png +C#.FileIcon = backendicons\CSharp\SmallFile.png + +C#.File.EmptyFile = backendicons\CSharp\file\EmptyFile.png +C#.File.Form = backendicons\CSharp\file\Form.png +C#.File.FullFile = backendicons\CSharp\file\FullFile.png +C#.File.NewClass = backendicons\CSharp\file\NewClass.png +C#.File.WebFile = backendicons\CSharp\file\WebFile.png +C#.Project.EmptyProject = backendicons\CSharp\project\EmptyProject.png +C#.Project.DOSProject = backendicons\CSharp\project\DOSProject.png +C#.Project.Form = backendicons\CSharp\project\Form.png +C#.Project.FullProject = backendicons\CSharp\project\FullProject.png +C#.Project.ServiceProject = backendicons\CSharp\project\ServiceProject.png +C#.Project.UserControl = backendicons\CSharp\project\UserControl.png +C#.Project.WebProject = backendicons\CSharp\project\WebProject.png +C#.Project.Library = backendicons\CSharp\project\Library.png +C#.Project.ControlLibrary = backendicons\CSharp\project\ControlLibrary.png + +VB.ProjectIcon = backendicons\VBNet\SmallProject.png +VB.FileIcon = backendicons\VBNet\SmallFile.png + +VB.File.EmptyFile = backendicons\VBNet\file\EmptyFile.png +VB.File.Form = backendicons\VBNet\file\Form.png +VB.File.FullFile = backendicons\VBNet\file\FullFile.png +VB.File.NewClass = backendicons\VBNet\file\NewClass.png +VB.File.WebFile = backendicons\VBNet\file\WebFile.png +VB.Project.EmptyProject = backendicons\VBNet\project\EmptyProject.png +VB.Project.DOSProject = backendicons\VBNet\project\DOSProject.png +VB.Project.Form = backendicons\VBNet\project\Form.png +VB.Project.FullProject = backendicons\VBNet\project\FullProject.png +VB.Project.ServiceProject = backendicons\VBNet\project\ServiceProject.png +VB.Project.UserControl = backendicons\VBNet\project\UserControl.png +VB.Project.WebProject = backendicons\VBNet\project\WebProject.png +VB.Project.Library = backendicons\VBNet\project\Library.png +VB.Project.ControlLibrary = backendicons\VBNet\project\ControlLibrary.png + +Java.ProjectIcon = backendicons\Java\SmallProject.png +Java.FileIcon = backendicons\Java\SmallFile.png + +Java.File.EmptyFile = backendicons\Java\file\EmptyFile.png +Java.File.Form = backendicons\Java\file\Form.png +Java.File.FullFile = backendicons\Java\file\FullFile.png +Java.File.NewClass = backendicons\Java\file\NewClass.png +Java.File.WebFile = backendicons\Java\file\WebFile.png +Java.Project.EmptyProject = backendicons\Java\project\EmptyProject.png +Java.Project.DOSProject = backendicons\Java\project\DOSProject.png +Java.Project.Form = backendicons\Java\project\Form.png +Java.Project.FullProject = backendicons\Java\project\FullProject.png +Java.Project.ServiceProject = backendicons\Java\project\ServiceProject.png +Java.Project.UserControl = backendicons\Java\project\UserControl.png +Java.Project.WebProject = backendicons\Java\project\WebProject.png +Java.Project.Library = backendicons\Java\project\Library.png +Java.Project.ControlLibrary = backendicons\Java\project\ControlLibrary.png + + +JScript.ProjectIcon = backendicons\JScript\SmallProject.png +JScript.FileIcon = backendicons\JScript\SmallFile.png + +JScript.File.EmptyFile = backendicons\JScript\file\EmptyFile.png +JScript.File.Form = backendicons\JScript\file\Form.png +JScript.File.FullFile = backendicons\JScript\file\FullFile.png +JScript.File.NewClass = backendicons\JScript\file\NewClass.png +JScript.File.WebFile = backendicons\JScript\file\WebFile.png +JScript.Project.EmptyProject = backendicons\JScript\project\EmptyProject.png +JScript.Project.DOSProject = backendicons\JScript\project\DOSProject.png +JScript.Project.Form = backendicons\JScript\project\Form.png +JScript.Project.FullProject = backendicons\JScript\project\FullProject.png +JScript.Project.ServiceProject = backendicons\JScript\project\ServiceProject.png +JScript.Project.UserControl = backendicons\JScript\project\UserControl.png +JScript.Project.WebProject = backendicons\JScript\project\WebProject.png +JScript.Project.Library = backendicons\JScript\project\Library.png +JScript.Project.ControlLibrary = backendicons\JScript\project\ControlLibrary.png + +C++.ProjectIcon = backendicons\cpp\SmallProject.png +C++.FileIcon = backendicons\cpp\SmallFile.png + +C++.File.EmptyFile = backendicons\cpp\file\EmptyFile.png +C++.File.Form = backendicons\cpp\file\Form.png +C++.File.FullFile = backendicons\cpp\file\FullFile.png +C++.File.NewClass = backendicons\cpp\file\NewClass.png +C++.File.WebFile = backendicons\cpp\file\WebFile.png +C++.Project.EmptyProject = backendicons\cpp\project\EmptyProject.png +C++.Project.DOSProject = backendicons\cpp\project\DOSProject.png +C++.Project.Form = backendicons\cpp\project\Form.png +C++.Project.FullProject = backendicons\cpp\project\FullProject.png +C++.Project.ServiceProject = backendicons\cpp\project\ServiceProject.png +C++.Project.UserControl = backendicons\cpp\project\UserControl.png +C++.Project.WebProject = backendicons\cpp\project\WebProject.png +C++.Project.Library = backendicons\cpp\project\Library.png +C++.Project.ControlLibrary = backendicons\cpp\project\ControlLibrary.png + +# misc backend icons +FileIcons.XmlIcon = backendicons\miscFiles\XmlFileIcon.png +Icons.16x16.ResourceFileIcon = backendicons\miscFiles\Icons.16x16.ResourceFileIcon.png +Icons.16x16.HTMLIcon = backendicons\miscFiles\Icons.16x16.HTMLIcon.png +Icons.16x16.XMLFileIcon = backendicons\miscFiles\Icons.16x16.XMLFileIcon.png +Icons.16x16.TextFileIcon = backendicons\miscFiles\Icons.16x16.TextFileIcon.png +Icons.16x16.CombineIcon = backendicons\miscFiles\Icons.16x16.CombineIcon.png +Icons.16x16.MiscFiles = backendicons\miscFiles\Icons.16x16.MiscFiles.png +Icons.16x16.SolutionIcon = backendicons\miscFiles\Icons.16x16.SolutionIcon.png + +Icons.32x32.EmptyFileIcon = backendicons\miscFiles\Icons.32x32.EmptyFileIcon.png +Icons.32x32.HTMLFileIcon = backendicons\miscFiles\Icons.32x32.HTMLFileIcon.png +Icons.32x32.XMLFileIcon = backendicons\miscFiles\Icons.32x32.XMLFileIcon.png +Icons.32x32.TextFileIcon = backendicons\miscFiles\Icons.32x32.TextFileIcon.png +Icons.32x32.ASPFileIcon = backendicons\miscFiles\Icons.32x32.ASPFileIcon.png +Icons.32x32.EmptyProjectIcon = backendicons\miscFiles\Icons.32x32.EmptyProjectIcon.png +Icons.32x32.CombineIcon = backendicons\miscFiles\Icons.32x32.CombineIcon.png +Icons.32x32.ResourceFileIcon = backendicons\miscFiles\Icons.32x32.ResourceFileIcon.png + diff --git a/data/resources/image/BitmapResources/Bookmarks/Bookmark.xcf b/data/resources/image/BitmapResources/Bookmarks/Bookmark.xcf new file mode 100644 index 0000000000..4f810c487e Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/Bookmark.xcf differ diff --git a/data/resources/image/BitmapResources/Bookmarks/ClearAll.png b/data/resources/image/BitmapResources/Bookmarks/ClearAll.png new file mode 100644 index 0000000000..658a899f78 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/ClearAll.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/DeleteMark.png b/data/resources/image/BitmapResources/Bookmarks/DeleteMark.png new file mode 100644 index 0000000000..f390d8c334 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/DeleteMark.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/EnableDisableAll.png b/data/resources/image/BitmapResources/Bookmarks/EnableDisableAll.png new file mode 100644 index 0000000000..6ad0a462de Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/EnableDisableAll.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/EnableDisableMark.png b/data/resources/image/BitmapResources/Bookmarks/EnableDisableMark.png new file mode 100644 index 0000000000..eef918ff0c Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/EnableDisableMark.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/GotoNext.png b/data/resources/image/BitmapResources/Bookmarks/GotoNext.png new file mode 100644 index 0000000000..2a4b34b1c6 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/GotoNext.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/GotoNextInFile.png b/data/resources/image/BitmapResources/Bookmarks/GotoNextInFile.png new file mode 100644 index 0000000000..61c7f9b171 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/GotoNextInFile.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/GotoNextInFolder.png b/data/resources/image/BitmapResources/Bookmarks/GotoNextInFolder.png new file mode 100644 index 0000000000..5b2cb76253 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/GotoNextInFolder.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/GotoPrev.png b/data/resources/image/BitmapResources/Bookmarks/GotoPrev.png new file mode 100644 index 0000000000..7dc0d1de52 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/GotoPrev.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/GotoPrevInFile.png b/data/resources/image/BitmapResources/Bookmarks/GotoPrevInFile.png new file mode 100644 index 0000000000..776f8fb3c9 Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/GotoPrevInFile.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/GotoPrevInFolder.png b/data/resources/image/BitmapResources/Bookmarks/GotoPrevInFolder.png new file mode 100644 index 0000000000..83a502c2be Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/GotoPrevInFolder.png differ diff --git a/data/resources/image/BitmapResources/Bookmarks/ToggleMark.png b/data/resources/image/BitmapResources/Bookmarks/ToggleMark.png new file mode 100644 index 0000000000..7a04fb231f Binary files /dev/null and b/data/resources/image/BitmapResources/Bookmarks/ToggleMark.png differ diff --git a/data/resources/image/BitmapResources/Chloe Periscope-Orig_2.png b/data/resources/image/BitmapResources/Chloe Periscope-Orig_2.png new file mode 100644 index 0000000000..6b53f11174 Binary files /dev/null and b/data/resources/image/BitmapResources/Chloe Periscope-Orig_2.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Class.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Class.png new file mode 100644 index 0000000000..a8d001cba4 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Class.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Class.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Class.xcf new file mode 100644 index 0000000000..9f88eea764 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Class.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Delegate.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Delegate.png new file mode 100644 index 0000000000..05707079d5 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Delegate.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Delegate.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Delegate.xcf new file mode 100644 index 0000000000..d2dbecddb6 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Delegate.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Enum.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Enum.png new file mode 100644 index 0000000000..3fbb2c1496 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Enum.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Enum.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Enum.xcf new file mode 100644 index 0000000000..0f37d95ba2 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Enum.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Event.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Event.png new file mode 100644 index 0000000000..aa3204ebc9 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Event.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Event.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Event.xcf new file mode 100644 index 0000000000..071d8069ee Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Event.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Field.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Field.png new file mode 100644 index 0000000000..05318b85eb Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Field.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Field.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Field.xcf new file mode 100644 index 0000000000..510289c28a Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Field.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Indexer.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Indexer.png new file mode 100644 index 0000000000..63cee80b14 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Indexer.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Indexer.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Indexer.xcf new file mode 100644 index 0000000000..c7c2ae260d Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Indexer.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Interface.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Interface.png new file mode 100644 index 0000000000..d8f6f4153b Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Interface.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Interface.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Interface.xcf new file mode 100644 index 0000000000..9b41c675c8 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Interface.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalClass.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalClass.png new file mode 100644 index 0000000000..0530af7e8b Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalClass.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalDelegate.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalDelegate.png new file mode 100644 index 0000000000..9ee36aff7d Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalDelegate.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalEnum.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalEnum.png new file mode 100644 index 0000000000..f5f901693e Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalEnum.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalEvent.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalEvent.png new file mode 100644 index 0000000000..fedc452454 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalEvent.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalField.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalField.png new file mode 100644 index 0000000000..ca17b0fcaf Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalField.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalIndexer.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalIndexer.png new file mode 100644 index 0000000000..b082979827 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalIndexer.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalInterface.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalInterface.png new file mode 100644 index 0000000000..fd818fe2ab Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalInterface.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalMethod.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalMethod.png new file mode 100644 index 0000000000..16fa1738fd Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalMethod.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalProperty.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalProperty.png new file mode 100644 index 0000000000..504b531d11 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalProperty.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalStruct.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalStruct.png new file mode 100644 index 0000000000..e067f1b544 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.InternalStruct.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Literal.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Literal.png new file mode 100644 index 0000000000..077075c132 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Literal.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Method.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Method.png new file mode 100644 index 0000000000..3ba3a9952d Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Method.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Method.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Method.xcf new file mode 100644 index 0000000000..2c480b5759 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Method.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.NameSpace.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.NameSpace.png new file mode 100644 index 0000000000..9660524ad3 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.NameSpace.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateClass.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateClass.png new file mode 100644 index 0000000000..370aa1c768 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateClass.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateDelegate.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateDelegate.png new file mode 100644 index 0000000000..b6d6528114 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateDelegate.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateEnum.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateEnum.png new file mode 100644 index 0000000000..968aabfbb1 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateEnum.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateEvent.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateEvent.png new file mode 100644 index 0000000000..faec01aff3 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateEvent.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateField.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateField.png new file mode 100644 index 0000000000..47455f9174 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateField.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateIndexer.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateIndexer.png new file mode 100644 index 0000000000..2c43c46ea1 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateIndexer.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateInterface.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateInterface.png new file mode 100644 index 0000000000..c81bb655f4 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateInterface.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateMethod.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateMethod.png new file mode 100644 index 0000000000..503df5e644 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateMethod.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateProperty.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateProperty.png new file mode 100644 index 0000000000..a4e2e4485d Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateProperty.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateStruct.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateStruct.png new file mode 100644 index 0000000000..a8812254f6 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.PrivateStruct.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Property.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Property.png new file mode 100644 index 0000000000..091e7ab2c5 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Property.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Property.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Property.xcf new file mode 100644 index 0000000000..5ba6ac544b Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Property.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedClass.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedClass.png new file mode 100644 index 0000000000..6f97213ea9 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedClass.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedDelegate.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedDelegate.png new file mode 100644 index 0000000000..9bb2f88155 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedDelegate.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedEnum.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedEnum.png new file mode 100644 index 0000000000..1912ed8837 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedEnum.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedEvent.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedEvent.png new file mode 100644 index 0000000000..819376531c Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedEvent.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedField.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedField.png new file mode 100644 index 0000000000..7849a426a8 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedField.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedIndexer.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedIndexer.png new file mode 100644 index 0000000000..d894f9516b Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedIndexer.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedInterface.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedInterface.png new file mode 100644 index 0000000000..d8fedab143 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedInterface.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedMethod.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedMethod.png new file mode 100644 index 0000000000..53f15bd5a2 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedMethod.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedProperty.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedProperty.png new file mode 100644 index 0000000000..af9647316c Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedProperty.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedStruct.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedStruct.png new file mode 100644 index 0000000000..fec00cced6 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.ProtectedStruct.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Reference.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Reference.png new file mode 100644 index 0000000000..85a4dfa0b5 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Reference.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Struct.png b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Struct.png new file mode 100644 index 0000000000..4a1928a798 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Struct.png differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Struct.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Struct.xcf new file mode 100644 index 0000000000..0f1d9b300b Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/Icons.16x16.Struct.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/InternalMarker.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/InternalMarker.xcf new file mode 100644 index 0000000000..33823c1806 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/InternalMarker.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/PrivateMarker.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/PrivateMarker.xcf new file mode 100644 index 0000000000..0787d154a2 Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/PrivateMarker.xcf differ diff --git a/data/resources/image/BitmapResources/ClassBrowserIcons/ProtectedMarker.xcf b/data/resources/image/BitmapResources/ClassBrowserIcons/ProtectedMarker.xcf new file mode 100644 index 0000000000..cda7cec0bf Binary files /dev/null and b/data/resources/image/BitmapResources/ClassBrowserIcons/ProtectedMarker.xcf differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Break.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Break.png new file mode 100644 index 0000000000..2f5ff8c890 Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Break.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Continue.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Continue.png new file mode 100644 index 0000000000..c72a5a085a Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Continue.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Start.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Start.png new file mode 100644 index 0000000000..e6b703b834 Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.Start.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StartWithoutDebugging.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StartWithoutDebugging.png new file mode 100644 index 0000000000..36ad70d997 Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StartWithoutDebugging.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepInto.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepInto.png new file mode 100644 index 0000000000..df1dc42a3d Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepInto.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepOut.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepOut.png new file mode 100644 index 0000000000..a31ebd53e0 Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepOut.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepOver.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepOver.png new file mode 100644 index 0000000000..3531ac8f68 Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StepOver.png differ diff --git a/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StopProcess.png b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StopProcess.png new file mode 100644 index 0000000000..4cc4a7c08c Binary files /dev/null and b/data/resources/image/BitmapResources/DebuggerIcons/Icons.16x16.Debug.StopProcess.png differ diff --git a/data/resources/image/BitmapResources/Icons.16x16.Shell.png b/data/resources/image/BitmapResources/Icons.16x16.Shell.png new file mode 100644 index 0000000000..4ea52e6d0b Binary files /dev/null and b/data/resources/image/BitmapResources/Icons.16x16.Shell.png differ diff --git a/data/resources/image/BitmapResources/ImageResources.build b/data/resources/image/BitmapResources/ImageResources.build new file mode 100644 index 0000000000..9a4b9e0786 --- /dev/null +++ b/data/resources/image/BitmapResources/ImageResources.build @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources/image/BitmapResources/OpenCloseFiles.xcf b/data/resources/image/BitmapResources/OpenCloseFiles.xcf new file mode 100644 index 0000000000..23aa46da27 Binary files /dev/null and b/data/resources/image/BitmapResources/OpenCloseFiles.xcf differ diff --git a/data/resources/image/BitmapResources/OutputPadIcons/ClearOutputWindow.png b/data/resources/image/BitmapResources/OutputPadIcons/ClearOutputWindow.png new file mode 100644 index 0000000000..47e7d601a9 Binary files /dev/null and b/data/resources/image/BitmapResources/OutputPadIcons/ClearOutputWindow.png differ diff --git a/data/resources/image/BitmapResources/OutputPadIcons/OutputPadIcons.xcf b/data/resources/image/BitmapResources/OutputPadIcons/OutputPadIcons.xcf new file mode 100644 index 0000000000..1dc64e60e6 Binary files /dev/null and b/data/resources/image/BitmapResources/OutputPadIcons/OutputPadIcons.xcf differ diff --git a/data/resources/image/BitmapResources/OutputPadIcons/ToggleWordWrap.png b/data/resources/image/BitmapResources/OutputPadIcons/ToggleWordWrap.png new file mode 100644 index 0000000000..7f630347d9 Binary files /dev/null and b/data/resources/image/BitmapResources/OutputPadIcons/ToggleWordWrap.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/Bookmarks.png b/data/resources/image/BitmapResources/PadIcons/Bookmarks.png new file mode 100644 index 0000000000..dcd1423ad6 Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/Bookmarks.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/ClassBrowser.png b/data/resources/image/BitmapResources/PadIcons/ClassBrowser.png new file mode 100644 index 0000000000..82285fcc3d Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/ClassBrowser.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/ErrorList.png b/data/resources/image/BitmapResources/PadIcons/ErrorList.png new file mode 100644 index 0000000000..85e55b351d Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/ErrorList.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/FileBrowser.png b/data/resources/image/BitmapResources/PadIcons/FileBrowser.png new file mode 100644 index 0000000000..6b86ebaacc Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/FileBrowser.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/FindResults.png b/data/resources/image/BitmapResources/PadIcons/FindResults.png new file mode 100644 index 0000000000..bd03b2724e Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/FindResults.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/Output.png b/data/resources/image/BitmapResources/PadIcons/Output.png new file mode 100644 index 0000000000..63020020fb Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/Output.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/PadIcons.xcf b/data/resources/image/BitmapResources/PadIcons/PadIcons.xcf new file mode 100644 index 0000000000..91a5f6575e Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/PadIcons.xcf differ diff --git a/data/resources/image/BitmapResources/PadIcons/ProjectBrowser.png b/data/resources/image/BitmapResources/PadIcons/ProjectBrowser.png new file mode 100644 index 0000000000..e46fd7b49c Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/ProjectBrowser.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/TaskList.png b/data/resources/image/BitmapResources/PadIcons/TaskList.png new file mode 100644 index 0000000000..f930a7cc65 Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/TaskList.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/Toolbar.png b/data/resources/image/BitmapResources/PadIcons/Toolbar.png new file mode 100644 index 0000000000..640ddfb9e1 Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/Toolbar.png differ diff --git a/data/resources/image/BitmapResources/PadIcons/UnitTest.png b/data/resources/image/BitmapResources/PadIcons/UnitTest.png new file mode 100644 index 0000000000..522b9d60bb Binary files /dev/null and b/data/resources/image/BitmapResources/PadIcons/UnitTest.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/CodeBehind.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/CodeBehind.png new file mode 100644 index 0000000000..2b820fb35c Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/CodeBehind.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/Folder.Closed.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/Folder.Closed.png new file mode 100644 index 0000000000..e503810835 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/Folder.Closed.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/Folder.Open.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/Folder.Open.png new file mode 100644 index 0000000000..0ec92f1c2b Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/Folder.Open.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFile.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFile.png new file mode 100644 index 0000000000..75d5f6f6aa Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFile.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFolder.Closed.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFolder.Closed.png new file mode 100644 index 0000000000..fa10b699bf Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFolder.Closed.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFolder.Open.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFolder.Open.png new file mode 100644 index 0000000000..5a4351964f Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/GhostFolder.Open.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingFile.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingFile.png new file mode 100644 index 0000000000..df09c1b03e Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingFile.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingProject.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingProject.png new file mode 100644 index 0000000000..61eb5c0800 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingProject.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingSolution.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingSolution.png new file mode 100644 index 0000000000..45f08278d0 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/MissingSolution.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/ProjectWarning.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/ProjectWarning.png new file mode 100644 index 0000000000..cfa1d14e72 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/ProjectWarning.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/PropertyFolder.Closed.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/PropertyFolder.Closed.png new file mode 100644 index 0000000000..1deadf6427 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/PropertyFolder.Closed.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/PropertyFolder.Open.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/PropertyFolder.Open.png new file mode 100644 index 0000000000..1dec2af1cb Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/PropertyFolder.Open.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/ReferenceFolder.Closed.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/ReferenceFolder.Closed.png new file mode 100644 index 0000000000..1a016792f1 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/ReferenceFolder.Closed.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/ReferenceFolder.Open.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/ReferenceFolder.Open.png new file mode 100644 index 0000000000..7ca89c2047 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/ReferenceFolder.Open.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/Solution.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/Solution.png new file mode 100644 index 0000000000..ea4b7636ca Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/Solution.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.Closed.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.Closed.png new file mode 100644 index 0000000000..2870436975 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.Closed.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.CreateNew.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.CreateNew.png new file mode 100644 index 0000000000..4e0f6090b5 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.CreateNew.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.Open.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.Open.png new file mode 100644 index 0000000000..1b84065daf Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/SolutionFolder.Open.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/Toolbar.Refresh.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/Toolbar.Refresh.png new file mode 100644 index 0000000000..16957297e1 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/Toolbar.Refresh.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/Toolbar.ShowHiddenFiles.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/Toolbar.ShowHiddenFiles.png new file mode 100644 index 0000000000..0d792d37a7 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/Toolbar.ShowHiddenFiles.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReference.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReference.png new file mode 100644 index 0000000000..e32ddd031d Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReference.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReferenceFolder.Closed.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReferenceFolder.Closed.png new file mode 100644 index 0000000000..05dc58f54e Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReferenceFolder.Closed.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReferenceFolder.Open.png b/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReferenceFolder.Open.png new file mode 100644 index 0000000000..c9de61e525 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/WebReferenceFolder.Open.png differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/Folder.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/Folder.xcf new file mode 100644 index 0000000000..c4f41cc916 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/Folder.xcf differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/GhostFile.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/GhostFile.xcf new file mode 100644 index 0000000000..3b7f2891a0 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/GhostFile.xcf differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/GhostFolder.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/GhostFolder.xcf new file mode 100644 index 0000000000..74ae1daf07 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/GhostFolder.xcf differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/PropertyFolder.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/PropertyFolder.xcf new file mode 100644 index 0000000000..b738586c51 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/PropertyFolder.xcf differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/ReferenceFolder.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/ReferenceFolder.xcf new file mode 100644 index 0000000000..0b4cc14693 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/ReferenceFolder.xcf differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/SolutionFolder.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/SolutionFolder.xcf new file mode 100644 index 0000000000..5fd49ef8df Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/SolutionFolder.xcf differ diff --git a/data/resources/image/BitmapResources/ProjectBrowserIcons/work/WebReferenceFolder.xcf b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/WebReferenceFolder.xcf new file mode 100644 index 0000000000..4be79d6014 Binary files /dev/null and b/data/resources/image/BitmapResources/ProjectBrowserIcons/work/WebReferenceFolder.xcf differ diff --git a/data/resources/image/BitmapResources/ResAsm.exe b/data/resources/image/BitmapResources/ResAsm.exe new file mode 100644 index 0000000000..71f8a419d4 Binary files /dev/null and b/data/resources/image/BitmapResources/ResAsm.exe differ diff --git a/data/resources/image/BitmapResources/ResAsm.exe.config b/data/resources/image/BitmapResources/ResAsm.exe.config new file mode 100644 index 0000000000..4bf44eff84 --- /dev/null +++ b/data/resources/image/BitmapResources/ResAsm.exe.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/data/resources/image/BitmapResources/SubversionIcons/StatusImages.bmp b/data/resources/image/BitmapResources/SubversionIcons/StatusImages.bmp new file mode 100644 index 0000000000..35bfa56713 Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/StatusImages.bmp differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.ApplyPatch.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.ApplyPatch.png new file mode 100644 index 0000000000..1b79231f97 Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.ApplyPatch.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.Checkout.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.Checkout.png new file mode 100644 index 0000000000..8856bd906a Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.Checkout.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.Commit.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.Commit.png new file mode 100644 index 0000000000..97efae337c Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.Commit.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.CreatePatch.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.CreatePatch.png new file mode 100644 index 0000000000..661bf66968 Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.CreatePatch.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.Export.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.Export.png new file mode 100644 index 0000000000..85c4d23b06 Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.Export.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.Import.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.Import.png new file mode 100644 index 0000000000..2ec889251d Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.Import.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.StatusImages.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.StatusImages.png new file mode 100644 index 0000000000..429a17b59e Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.StatusImages.png differ diff --git a/data/resources/image/BitmapResources/SubversionIcons/Svn.Update.png b/data/resources/image/BitmapResources/SubversionIcons/Svn.Update.png new file mode 100644 index 0000000000..054e8653fb Binary files /dev/null and b/data/resources/image/BitmapResources/SubversionIcons/Svn.Update.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/SmallFile.png b/data/resources/image/BitmapResources/backendicons/CSharp/SmallFile.png new file mode 100644 index 0000000000..cfb4a49c69 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/SmallFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/SmallProject.png b/data/resources/image/BitmapResources/backendicons/CSharp/SmallProject.png new file mode 100644 index 0000000000..1f8df49f2f Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/SmallProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/file/EmptyFile.png b/data/resources/image/BitmapResources/backendicons/CSharp/file/EmptyFile.png new file mode 100644 index 0000000000..ebffdd0065 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/file/EmptyFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/file/Form.png b/data/resources/image/BitmapResources/backendicons/CSharp/file/Form.png new file mode 100644 index 0000000000..dbaffe90ee Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/file/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/file/FullFile.png b/data/resources/image/BitmapResources/backendicons/CSharp/file/FullFile.png new file mode 100644 index 0000000000..f0b3d76813 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/file/FullFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/file/NewClass.png b/data/resources/image/BitmapResources/backendicons/CSharp/file/NewClass.png new file mode 100644 index 0000000000..0ac892a8b2 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/file/NewClass.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/file/WebFile.png b/data/resources/image/BitmapResources/backendicons/CSharp/file/WebFile.png new file mode 100644 index 0000000000..d1c43174f3 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/file/WebFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/ControlLibrary.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/ControlLibrary.png new file mode 100644 index 0000000000..5a3cdfaa6c Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/ControlLibrary.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/DOSProject.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/DOSProject.png new file mode 100644 index 0000000000..4305ea8b81 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/DOSProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/EmptyProject.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/EmptyProject.png new file mode 100644 index 0000000000..825b90c382 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/EmptyProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/Form.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/Form.png new file mode 100644 index 0000000000..2bffbc8717 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/FullProject.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/FullProject.png new file mode 100644 index 0000000000..ba0e8fd703 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/FullProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/Library.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/Library.png new file mode 100644 index 0000000000..0aa2bd18a8 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/Library.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/ServiceProject.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/ServiceProject.png new file mode 100644 index 0000000000..42b39005f0 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/ServiceProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/UserControl.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/UserControl.png new file mode 100644 index 0000000000..a8c1683c1e Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/UserControl.png differ diff --git a/data/resources/image/BitmapResources/backendicons/CSharp/project/WebProject.png b/data/resources/image/BitmapResources/backendicons/CSharp/project/WebProject.png new file mode 100644 index 0000000000..4d0ff76414 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/CSharp/project/WebProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Empty16x16File.xcf b/data/resources/image/BitmapResources/backendicons/Empty16x16File.xcf new file mode 100644 index 0000000000..46bbaf372a Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Empty16x16File.xcf differ diff --git a/data/resources/image/BitmapResources/backendicons/Empty32x32File.xcf b/data/resources/image/BitmapResources/backendicons/Empty32x32File.xcf new file mode 100644 index 0000000000..5484fd55c6 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Empty32x32File.xcf differ diff --git a/data/resources/image/BitmapResources/backendicons/Empty32x32Project.xcf b/data/resources/image/BitmapResources/backendicons/Empty32x32Project.xcf new file mode 100644 index 0000000000..ba995c1217 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Empty32x32Project.xcf differ diff --git a/data/resources/image/BitmapResources/backendicons/Empty32x32UserControl.xcf b/data/resources/image/BitmapResources/backendicons/Empty32x32UserControl.xcf new file mode 100644 index 0000000000..301d5c79f1 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Empty32x32UserControl.xcf differ diff --git a/data/resources/image/BitmapResources/backendicons/EmptyProject.xcf b/data/resources/image/BitmapResources/backendicons/EmptyProject.xcf new file mode 100644 index 0000000000..1bf141190d Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/EmptyProject.xcf differ diff --git a/data/resources/image/BitmapResources/backendicons/FileIcon.xcf b/data/resources/image/BitmapResources/backendicons/FileIcon.xcf new file mode 100644 index 0000000000..f94d9154ff Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/FileIcon.xcf differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/SmallFile.png b/data/resources/image/BitmapResources/backendicons/JScript/SmallFile.png new file mode 100644 index 0000000000..7a8223bbed Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/SmallFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/SmallProject.png b/data/resources/image/BitmapResources/backendicons/JScript/SmallProject.png new file mode 100644 index 0000000000..8186e84e35 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/SmallProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/file/EmptyFile.png b/data/resources/image/BitmapResources/backendicons/JScript/file/EmptyFile.png new file mode 100644 index 0000000000..9ed4fc20ac Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/file/EmptyFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/file/Form.png b/data/resources/image/BitmapResources/backendicons/JScript/file/Form.png new file mode 100644 index 0000000000..56fa248e52 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/file/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/file/FullFile.png b/data/resources/image/BitmapResources/backendicons/JScript/file/FullFile.png new file mode 100644 index 0000000000..fc0efe1300 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/file/FullFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/file/NewClass.png b/data/resources/image/BitmapResources/backendicons/JScript/file/NewClass.png new file mode 100644 index 0000000000..3019ddecec Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/file/NewClass.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/file/WebFile.png b/data/resources/image/BitmapResources/backendicons/JScript/file/WebFile.png new file mode 100644 index 0000000000..b93fa927bc Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/file/WebFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/ASPProject.png b/data/resources/image/BitmapResources/backendicons/JScript/project/ASPProject.png new file mode 100644 index 0000000000..a53fe0fa77 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/ASPProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/ControlLibrary.png b/data/resources/image/BitmapResources/backendicons/JScript/project/ControlLibrary.png new file mode 100644 index 0000000000..a7cf174a4b Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/ControlLibrary.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/DOSProject.png b/data/resources/image/BitmapResources/backendicons/JScript/project/DOSProject.png new file mode 100644 index 0000000000..b4a6ef04a1 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/DOSProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/EmptyProject.png b/data/resources/image/BitmapResources/backendicons/JScript/project/EmptyProject.png new file mode 100644 index 0000000000..f231cd117c Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/EmptyProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/Form.png b/data/resources/image/BitmapResources/backendicons/JScript/project/Form.png new file mode 100644 index 0000000000..abcec3a01a Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/FullProject.png b/data/resources/image/BitmapResources/backendicons/JScript/project/FullProject.png new file mode 100644 index 0000000000..7e338c3dfe Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/FullProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/Library.png b/data/resources/image/BitmapResources/backendicons/JScript/project/Library.png new file mode 100644 index 0000000000..b9ad7218cb Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/Library.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/ServiceProject.png b/data/resources/image/BitmapResources/backendicons/JScript/project/ServiceProject.png new file mode 100644 index 0000000000..d9267b6c77 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/ServiceProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/UserControl.png b/data/resources/image/BitmapResources/backendicons/JScript/project/UserControl.png new file mode 100644 index 0000000000..4e12834736 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/UserControl.png differ diff --git a/data/resources/image/BitmapResources/backendicons/JScript/project/WebProject.png b/data/resources/image/BitmapResources/backendicons/JScript/project/WebProject.png new file mode 100644 index 0000000000..e20da70e67 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/JScript/project/WebProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/SmallFile.png b/data/resources/image/BitmapResources/backendicons/Java/SmallFile.png new file mode 100644 index 0000000000..3e89088775 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/SmallFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/SmallProject.png b/data/resources/image/BitmapResources/backendicons/Java/SmallProject.png new file mode 100644 index 0000000000..e6fb7573d0 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/SmallProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/file/EmptyFile.png b/data/resources/image/BitmapResources/backendicons/Java/file/EmptyFile.png new file mode 100644 index 0000000000..709e86a9de Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/file/EmptyFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/file/Form.png b/data/resources/image/BitmapResources/backendicons/Java/file/Form.png new file mode 100644 index 0000000000..a9b86f1552 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/file/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/file/FullFile.png b/data/resources/image/BitmapResources/backendicons/Java/file/FullFile.png new file mode 100644 index 0000000000..6504217846 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/file/FullFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/file/NewClass.png b/data/resources/image/BitmapResources/backendicons/Java/file/NewClass.png new file mode 100644 index 0000000000..1458d17a26 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/file/NewClass.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/file/WebFile.png b/data/resources/image/BitmapResources/backendicons/Java/file/WebFile.png new file mode 100644 index 0000000000..541b25c327 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/file/WebFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/ASPProject.png b/data/resources/image/BitmapResources/backendicons/Java/project/ASPProject.png new file mode 100644 index 0000000000..2a89fcc829 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/ASPProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/ControlLibrary.png b/data/resources/image/BitmapResources/backendicons/Java/project/ControlLibrary.png new file mode 100644 index 0000000000..932e645e7f Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/ControlLibrary.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/DOSProject.png b/data/resources/image/BitmapResources/backendicons/Java/project/DOSProject.png new file mode 100644 index 0000000000..91d4035068 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/DOSProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/EmptyProject.png b/data/resources/image/BitmapResources/backendicons/Java/project/EmptyProject.png new file mode 100644 index 0000000000..08b00e2b59 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/EmptyProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/Form.png b/data/resources/image/BitmapResources/backendicons/Java/project/Form.png new file mode 100644 index 0000000000..8f932f471c Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/FullProject.png b/data/resources/image/BitmapResources/backendicons/Java/project/FullProject.png new file mode 100644 index 0000000000..66bc83d8fb Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/FullProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/Library.png b/data/resources/image/BitmapResources/backendicons/Java/project/Library.png new file mode 100644 index 0000000000..46f33bb3b7 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/Library.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/ServiceProject.png b/data/resources/image/BitmapResources/backendicons/Java/project/ServiceProject.png new file mode 100644 index 0000000000..b09bc131a0 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/ServiceProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/UserControl.png b/data/resources/image/BitmapResources/backendicons/Java/project/UserControl.png new file mode 100644 index 0000000000..96ee893593 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/UserControl.png differ diff --git a/data/resources/image/BitmapResources/backendicons/Java/project/WebProject.png b/data/resources/image/BitmapResources/backendicons/Java/project/WebProject.png new file mode 100644 index 0000000000..64e9de6c27 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/Java/project/WebProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/SmallFile.png b/data/resources/image/BitmapResources/backendicons/VBNet/SmallFile.png new file mode 100644 index 0000000000..ae032a3669 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/SmallFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/SmallProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/SmallProject.png new file mode 100644 index 0000000000..69a09f63c3 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/SmallProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/file/EmptyFile.png b/data/resources/image/BitmapResources/backendicons/VBNet/file/EmptyFile.png new file mode 100644 index 0000000000..3b86f5ca60 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/file/EmptyFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/file/Form.png b/data/resources/image/BitmapResources/backendicons/VBNet/file/Form.png new file mode 100644 index 0000000000..a969fb4766 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/file/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/file/FullFile.png b/data/resources/image/BitmapResources/backendicons/VBNet/file/FullFile.png new file mode 100644 index 0000000000..d951d8c65b Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/file/FullFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/file/NewClass.png b/data/resources/image/BitmapResources/backendicons/VBNet/file/NewClass.png new file mode 100644 index 0000000000..56c9f9502c Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/file/NewClass.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/file/WebFile.png b/data/resources/image/BitmapResources/backendicons/VBNet/file/WebFile.png new file mode 100644 index 0000000000..daa9f1a159 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/file/WebFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/ASPProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/ASPProject.png new file mode 100644 index 0000000000..02ff857f93 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/ASPProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/ControlLibrary.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/ControlLibrary.png new file mode 100644 index 0000000000..43061ac3c8 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/ControlLibrary.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/DOSProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/DOSProject.png new file mode 100644 index 0000000000..aa8e809894 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/DOSProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/EmptyProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/EmptyProject.png new file mode 100644 index 0000000000..653bf01f2a Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/EmptyProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/Form.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/Form.png new file mode 100644 index 0000000000..b99e9c9608 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/FullProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/FullProject.png new file mode 100644 index 0000000000..f1227fb1d5 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/FullProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/Library.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/Library.png new file mode 100644 index 0000000000..82ff52614e Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/Library.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/ServiceProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/ServiceProject.png new file mode 100644 index 0000000000..b889179070 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/ServiceProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/UserControl.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/UserControl.png new file mode 100644 index 0000000000..c220bd669e Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/UserControl.png differ diff --git a/data/resources/image/BitmapResources/backendicons/VBNet/project/WebProject.png b/data/resources/image/BitmapResources/backendicons/VBNet/project/WebProject.png new file mode 100644 index 0000000000..9aa7b75ff0 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/VBNet/project/WebProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/SmallFile.png b/data/resources/image/BitmapResources/backendicons/cpp/SmallFile.png new file mode 100644 index 0000000000..db029658a0 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/SmallFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/SmallProject.png b/data/resources/image/BitmapResources/backendicons/cpp/SmallProject.png new file mode 100644 index 0000000000..730b78d2e9 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/SmallProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/file/EmptyFile.png b/data/resources/image/BitmapResources/backendicons/cpp/file/EmptyFile.png new file mode 100644 index 0000000000..2c40d63335 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/file/EmptyFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/file/Form.png b/data/resources/image/BitmapResources/backendicons/cpp/file/Form.png new file mode 100644 index 0000000000..033aa40844 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/file/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/file/FullFile.png b/data/resources/image/BitmapResources/backendicons/cpp/file/FullFile.png new file mode 100644 index 0000000000..9f85a9696e Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/file/FullFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/file/NewClass.png b/data/resources/image/BitmapResources/backendicons/cpp/file/NewClass.png new file mode 100644 index 0000000000..50817e8aae Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/file/NewClass.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/file/WebFile.png b/data/resources/image/BitmapResources/backendicons/cpp/file/WebFile.png new file mode 100644 index 0000000000..dea47b3c43 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/file/WebFile.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/ASPProject.png b/data/resources/image/BitmapResources/backendicons/cpp/project/ASPProject.png new file mode 100644 index 0000000000..75fc424fa3 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/ASPProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/ControlLibrary.png b/data/resources/image/BitmapResources/backendicons/cpp/project/ControlLibrary.png new file mode 100644 index 0000000000..342633de6e Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/ControlLibrary.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/DOSProject.png b/data/resources/image/BitmapResources/backendicons/cpp/project/DOSProject.png new file mode 100644 index 0000000000..4c0a6b6191 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/DOSProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/EmptyProject.png b/data/resources/image/BitmapResources/backendicons/cpp/project/EmptyProject.png new file mode 100644 index 0000000000..5b9d3e65b0 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/EmptyProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/Form.png b/data/resources/image/BitmapResources/backendicons/cpp/project/Form.png new file mode 100644 index 0000000000..68fa018c3d Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/Form.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/FullProject.png b/data/resources/image/BitmapResources/backendicons/cpp/project/FullProject.png new file mode 100644 index 0000000000..5ee4433a57 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/FullProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/Library.png b/data/resources/image/BitmapResources/backendicons/cpp/project/Library.png new file mode 100644 index 0000000000..e2fdc80bf5 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/Library.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/ServiceProject.png b/data/resources/image/BitmapResources/backendicons/cpp/project/ServiceProject.png new file mode 100644 index 0000000000..7b683a47c1 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/ServiceProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/UserControl.png b/data/resources/image/BitmapResources/backendicons/cpp/project/UserControl.png new file mode 100644 index 0000000000..e5e37a21a9 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/UserControl.png differ diff --git a/data/resources/image/BitmapResources/backendicons/cpp/project/WebProject.png b/data/resources/image/BitmapResources/backendicons/cpp/project/WebProject.png new file mode 100644 index 0000000000..e826aef927 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/cpp/project/WebProject.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.CombineIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.CombineIcon.png new file mode 100644 index 0000000000..c976ac015c Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.CombineIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.HTMLIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.HTMLIcon.png new file mode 100644 index 0000000000..fb2c6f408c Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.HTMLIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.MiscFiles.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.MiscFiles.png new file mode 100644 index 0000000000..ef779d409f Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.MiscFiles.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.ResourceFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.ResourceFileIcon.png new file mode 100644 index 0000000000..50a58e4beb Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.ResourceFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.SolutionIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.SolutionIcon.png new file mode 100644 index 0000000000..f9e3db9ab4 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.SolutionIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.TextFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.TextFileIcon.png new file mode 100644 index 0000000000..a2145faf1f Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.TextFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.XMLFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.XMLFileIcon.png new file mode 100644 index 0000000000..ddc6927adc Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.16x16.XMLFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.ASPFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.ASPFileIcon.png new file mode 100644 index 0000000000..4d619f0e5e Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.ASPFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.CombineIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.CombineIcon.png new file mode 100644 index 0000000000..55dd058429 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.CombineIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.EmptyFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.EmptyFileIcon.png new file mode 100644 index 0000000000..10e141bc19 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.EmptyFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.EmptyProjectIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.EmptyProjectIcon.png new file mode 100644 index 0000000000..275c2aa4ca Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.EmptyProjectIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.HTMLFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.HTMLFileIcon.png new file mode 100644 index 0000000000..10f802e0be Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.HTMLFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.ResourceFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.ResourceFileIcon.png new file mode 100644 index 0000000000..e1643e27ba Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.ResourceFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.TextFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.TextFileIcon.png new file mode 100644 index 0000000000..3a8e989889 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.TextFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.XMLFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.XMLFileIcon.png new file mode 100644 index 0000000000..dc58503149 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/Icons.32x32.XMLFileIcon.png differ diff --git a/data/resources/image/BitmapResources/backendicons/miscFiles/XmlFileIcon.png b/data/resources/image/BitmapResources/backendicons/miscFiles/XmlFileIcon.png new file mode 100644 index 0000000000..e20d033741 Binary files /dev/null and b/data/resources/image/BitmapResources/backendicons/miscFiles/XmlFileIcon.png differ diff --git a/data/resources/image/BitmapResources/build.bat b/data/resources/image/BitmapResources/build.bat new file mode 100644 index 0000000000..901e825301 --- /dev/null +++ b/data/resources/image/BitmapResources/build.bat @@ -0,0 +1,4 @@ +@echo off +..\..\SharpDevelop\src\Tools\nant\bin\nant + +pause \ No newline at end of file diff --git a/data/resources/languages/.xvpics/russia.png b/data/resources/languages/.xvpics/russia.png new file mode 100644 index 0000000000..8455061d91 --- /dev/null +++ b/data/resources/languages/.xvpics/russia.png @@ -0,0 +1,5 @@ +P7 332 +#IMGINFO:45x30 Indexed (199 bytes) +#END_OF_COMMENTS +45 30 255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄÄàÄÅÄÄÄÄÅÄäÄÄÁÄÄÄÄÅä¤äÄÅÄÀÄÄÅäÄÄÄÅÄÄÄÀåÄÄÄÄÅÄ \ No newline at end of file diff --git a/data/resources/languages/.xvpics/south_korea.png b/data/resources/languages/.xvpics/south_korea.png new file mode 100644 index 0000000000..8b108b9110 Binary files /dev/null and b/data/resources/languages/.xvpics/south_korea.png differ diff --git a/data/resources/languages/.xvpics/sweden.png b/data/resources/languages/.xvpics/sweden.png new file mode 100644 index 0000000000..aa351d1168 --- /dev/null +++ b/data/resources/languages/.xvpics/sweden.png @@ -0,0 +1,5 @@ +P7 332 +#IMGINFO:48x30 Indexed (201 bytes) +#END_OF_COMMENTS +48 30 255 +üøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøøüøøøøøøøøüøøøøøøøøüôüøøøøøøøüøøøøøøøøüøøøøøøøøüøüøøøøøøøøüøøøøøøøøüôüøøøøøøøüøøøøøøøøüøøøøøøøøüøüøøøøøøøøüøøøøøøøøüôüøøøøøøøüøøøøøøøøüøøøøøøøøüøüøøøøøøøøüøøøøøøøøüôüøøøøøøøüøøøøøøøøüøøøøøøøøüøüøøøøøøøøüøøøøøøøøüôüøøøøøøøüøøøøøøøøüøøøøøøøøüøüøøøøøøøøüøøøøøøøøüôüøøøøøøøüøøøøøøøøüøøøøøøøøüüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøøüøøøøø \ No newline at end of file diff --git a/data/resources/languages/Arabic.png b/data/resources/languages/Arabic.png new file mode 100644 index 0000000000..e5395ce141 Binary files /dev/null and b/data/resources/languages/Arabic.png differ diff --git a/data/resources/languages/LanguageDefinition.xml b/data/resources/languages/LanguageDefinition.xml new file mode 100644 index 0000000000..6e353f8e49 --- /dev/null +++ b/data/resources/languages/LanguageDefinition.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources/languages/Serbia.png b/data/resources/languages/Serbia.png new file mode 100644 index 0000000000..9c60dbe24b Binary files /dev/null and b/data/resources/languages/Serbia.png differ diff --git a/data/resources/languages/badgoisern.png b/data/resources/languages/badgoisern.png new file mode 100644 index 0000000000..ea307d6fad Binary files /dev/null and b/data/resources/languages/badgoisern.png differ diff --git a/data/resources/languages/brazil.png b/data/resources/languages/brazil.png new file mode 100644 index 0000000000..5c732ac181 Binary files /dev/null and b/data/resources/languages/brazil.png differ diff --git a/data/resources/languages/bulgaria.png b/data/resources/languages/bulgaria.png new file mode 100644 index 0000000000..faf8055f59 Binary files /dev/null and b/data/resources/languages/bulgaria.png differ diff --git a/data/resources/languages/chinalg.png b/data/resources/languages/chinalg.png new file mode 100644 index 0000000000..bd462570e0 Binary files /dev/null and b/data/resources/languages/chinalg.png differ diff --git a/data/resources/languages/czech.png b/data/resources/languages/czech.png new file mode 100644 index 0000000000..b3caede326 Binary files /dev/null and b/data/resources/languages/czech.png differ diff --git a/data/resources/languages/denmark.png b/data/resources/languages/denmark.png new file mode 100644 index 0000000000..ebea24cd2c Binary files /dev/null and b/data/resources/languages/denmark.png differ diff --git a/data/resources/languages/england.png b/data/resources/languages/england.png new file mode 100644 index 0000000000..06abe2cfcf Binary files /dev/null and b/data/resources/languages/england.png differ diff --git a/data/resources/languages/finnish.png b/data/resources/languages/finnish.png new file mode 100644 index 0000000000..a49f6ba2e6 Binary files /dev/null and b/data/resources/languages/finnish.png differ diff --git a/data/resources/languages/france.png b/data/resources/languages/france.png new file mode 100644 index 0000000000..d48eb6693c Binary files /dev/null and b/data/resources/languages/france.png differ diff --git a/data/resources/languages/germany.png b/data/resources/languages/germany.png new file mode 100644 index 0000000000..f249ef0d73 Binary files /dev/null and b/data/resources/languages/germany.png differ diff --git a/data/resources/languages/hungary.png b/data/resources/languages/hungary.png new file mode 100644 index 0000000000..a19f11c127 Binary files /dev/null and b/data/resources/languages/hungary.png differ diff --git a/data/resources/languages/italy.png b/data/resources/languages/italy.png new file mode 100644 index 0000000000..33ace70c8a Binary files /dev/null and b/data/resources/languages/italy.png differ diff --git a/data/resources/languages/japan.png b/data/resources/languages/japan.png new file mode 100644 index 0000000000..fe0112ca93 Binary files /dev/null and b/data/resources/languages/japan.png differ diff --git a/data/resources/languages/lithuania.png b/data/resources/languages/lithuania.png new file mode 100644 index 0000000000..58640151af Binary files /dev/null and b/data/resources/languages/lithuania.png differ diff --git a/data/resources/languages/mexico.png b/data/resources/languages/mexico.png new file mode 100644 index 0000000000..c636ef290f Binary files /dev/null and b/data/resources/languages/mexico.png differ diff --git a/data/resources/languages/netherlands.png b/data/resources/languages/netherlands.png new file mode 100644 index 0000000000..6668670f6d Binary files /dev/null and b/data/resources/languages/netherlands.png differ diff --git a/data/resources/languages/poland.png b/data/resources/languages/poland.png new file mode 100644 index 0000000000..ba36b715ef Binary files /dev/null and b/data/resources/languages/poland.png differ diff --git a/data/resources/languages/portugal.png b/data/resources/languages/portugal.png new file mode 100644 index 0000000000..56fc3b72c9 Binary files /dev/null and b/data/resources/languages/portugal.png differ diff --git a/data/resources/languages/romania.png b/data/resources/languages/romania.png new file mode 100644 index 0000000000..ea039dadce Binary files /dev/null and b/data/resources/languages/romania.png differ diff --git a/data/resources/languages/russia.png b/data/resources/languages/russia.png new file mode 100644 index 0000000000..fa10e867f8 Binary files /dev/null and b/data/resources/languages/russia.png differ diff --git a/data/resources/languages/slovenia.png b/data/resources/languages/slovenia.png new file mode 100644 index 0000000000..e4f49143c4 Binary files /dev/null and b/data/resources/languages/slovenia.png differ diff --git a/data/resources/languages/south_korea.png b/data/resources/languages/south_korea.png new file mode 100644 index 0000000000..35650cdda1 Binary files /dev/null and b/data/resources/languages/south_korea.png differ diff --git a/data/resources/languages/spain.png b/data/resources/languages/spain.png new file mode 100644 index 0000000000..91c39eebc3 Binary files /dev/null and b/data/resources/languages/spain.png differ diff --git a/data/resources/languages/sweden.png b/data/resources/languages/sweden.png new file mode 100644 index 0000000000..d06400080c Binary files /dev/null and b/data/resources/languages/sweden.png differ diff --git a/data/resources/languages/uk.png b/data/resources/languages/uk.png new file mode 100644 index 0000000000..33fec65c72 Binary files /dev/null and b/data/resources/languages/uk.png differ diff --git a/data/resources/languages/usa.png b/data/resources/languages/usa.png new file mode 100644 index 0000000000..f24c9d68b7 Binary files /dev/null and b/data/resources/languages/usa.png differ diff --git a/data/resources/layouts/Debug.xml b/data/resources/layouts/Debug.xml new file mode 100644 index 0000000000..96322b7665 Binary files /dev/null and b/data/resources/layouts/Debug.xml differ diff --git a/data/resources/layouts/Default.xml b/data/resources/layouts/Default.xml new file mode 100644 index 0000000000..041b0c2a6e Binary files /dev/null and b/data/resources/layouts/Default.xml differ diff --git a/data/resources/layouts/LayoutConfig.xml b/data/resources/layouts/LayoutConfig.xml new file mode 100644 index 0000000000..7c0a8e6d98 --- /dev/null +++ b/data/resources/layouts/LayoutConfig.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/data/resources/layouts/Plain.xml b/data/resources/layouts/Plain.xml new file mode 100644 index 0000000000..bfc780b62e Binary files /dev/null and b/data/resources/layouts/Plain.xml differ diff --git a/data/resources/startpage/Layout/blue/balken_links.gif b/data/resources/startpage/Layout/blue/balken_links.gif new file mode 100644 index 0000000000..d2e5072539 Binary files /dev/null and b/data/resources/startpage/Layout/blue/balken_links.gif differ diff --git a/data/resources/startpage/Layout/blue/balken_mitte.gif b/data/resources/startpage/Layout/blue/balken_mitte.gif new file mode 100644 index 0000000000..c1095747c3 Binary files /dev/null and b/data/resources/startpage/Layout/blue/balken_mitte.gif differ diff --git a/data/resources/startpage/Layout/blue/balken_rechts.gif b/data/resources/startpage/Layout/blue/balken_rechts.gif new file mode 100644 index 0000000000..f0394b5668 Binary files /dev/null and b/data/resources/startpage/Layout/blue/balken_rechts.gif differ diff --git a/data/resources/startpage/Layout/brown/balken_links.gif b/data/resources/startpage/Layout/brown/balken_links.gif new file mode 100644 index 0000000000..840351728b Binary files /dev/null and b/data/resources/startpage/Layout/brown/balken_links.gif differ diff --git a/data/resources/startpage/Layout/brown/balken_mitte.gif b/data/resources/startpage/Layout/brown/balken_mitte.gif new file mode 100644 index 0000000000..15c0f4d873 Binary files /dev/null and b/data/resources/startpage/Layout/brown/balken_mitte.gif differ diff --git a/data/resources/startpage/Layout/brown/balken_rechts.gif b/data/resources/startpage/Layout/brown/balken_rechts.gif new file mode 100644 index 0000000000..dc0358e760 Binary files /dev/null and b/data/resources/startpage/Layout/brown/balken_rechts.gif differ diff --git a/data/resources/startpage/Layout/common/blind.gif b/data/resources/startpage/Layout/common/blind.gif new file mode 100644 index 0000000000..35d42e808f Binary files /dev/null and b/data/resources/startpage/Layout/common/blind.gif differ diff --git a/data/resources/startpage/Layout/common/dot_listing.gif b/data/resources/startpage/Layout/common/dot_listing.gif new file mode 100644 index 0000000000..876e585c9e Binary files /dev/null and b/data/resources/startpage/Layout/common/dot_listing.gif differ diff --git a/data/resources/startpage/Layout/common/klinker_milestone.gif b/data/resources/startpage/Layout/common/klinker_milestone.gif new file mode 100644 index 0000000000..84478451e3 Binary files /dev/null and b/data/resources/startpage/Layout/common/klinker_milestone.gif differ diff --git a/data/resources/startpage/Layout/common/line_hor_black.gif b/data/resources/startpage/Layout/common/line_hor_black.gif new file mode 100644 index 0000000000..8261ca745b Binary files /dev/null and b/data/resources/startpage/Layout/common/line_hor_black.gif differ diff --git a/data/resources/startpage/Layout/common/milestone_col_head.gif b/data/resources/startpage/Layout/common/milestone_col_head.gif new file mode 100644 index 0000000000..28c6bffe4e Binary files /dev/null and b/data/resources/startpage/Layout/common/milestone_col_head.gif differ diff --git a/data/resources/startpage/Layout/common/pixel_weiss.gif b/data/resources/startpage/Layout/common/pixel_weiss.gif new file mode 100644 index 0000000000..2799b45c65 Binary files /dev/null and b/data/resources/startpage/Layout/common/pixel_weiss.gif differ diff --git a/data/resources/startpage/Layout/default.css b/data/resources/startpage/Layout/default.css new file mode 100644 index 0000000000..b2031aa8d3 --- /dev/null +++ b/data/resources/startpage/Layout/default.css @@ -0,0 +1,136 @@ +.copy { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:Black; +} +.balken { + background-color:#DCDDDE; +} +.navi { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:Black; + font-style:normal; + font-weight:bold; +} +.naviActiv { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:#DB4E2E; + font-weight:bold; +} +.text { + background-color:White; + font-family:Arial,Helvetica,sans-serif; + font-size:10px; + color:Black; +} +.head { + font-family:Arial,Helvetica,sans-serif; + font-size:14; + color:White; + font-weight:bold; +} +.naviListDevelop { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:#808285; + font-style:normal; + font-weight:bold; +} +.naviListDevelopActiv { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:#808285; + font-style:normal; + font-weight:bold; +} +.naviListSupport { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:#bb141a; + font-style:normal; + font-weight:bold; +} +.naviListSupportActiv { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:#43b4d5; + font-style:normal; + font-weight:bold; +} +.milestoneText { + font-family:Arial,Helvetica,sans-serif; + font-size:14; + color:White; + font-weight:bold; +} +.headlineDevelop { + font-size:14px; + font-family: Arial, Helvetica, sans-serif; + color:#a58229; + font-weight:bold; + font-style:normal; +} +.headlineSupport { + font-size:14px; + font-family:Arial,Helvetica,sans-serif; + color:#808285; + font-weight:bold; + font-style:normal; +} +.copyBig { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:Black; + font-weight:bold; +} +.copyUnderlineBig { + font-size:12px; + font-family:Arial,Helvetica,sans-serif; + color:Black; + text-decoration:underline; + font-weight:bold; +} + + +/* TEST */ +div.tablediv + { + width: 100%; /* Forces tables to have correct right margins and top spacing */ + margin-top: -.4em; + } +ol div.tablediv, ul div.tablediv, ol div.HxLinkTable, ul div.HxLinkTable + { + margin-top: 0em; /* Forces tables to have correct right margins and top spacing */ + } +table.dtTABLE + { + width: 100%; /* Forces tables to have correct right margin */ + margin-top: .6em; + margin-bottom: .3em; + border-width: 1px 1px 0px 0px; + border-style: solid; + border-color: #999999; + background-color: #999999; + font-size: 100%; /* Text in Table is same size as text outside table */ + } +table.dtTABLE th, table.dtTABLE td + { + border-style: solid; /* Creates the cell border and color */ + border-width: 0px 0px 1px 1px; + border-style: solid; + border-color: #999999; + padding: 4px 6px; + text-align: left; + } +table.dtTABLE th + { + background: #DDDDDD; /* Creates the shaded table header row */ + vertical-align: bottom; + } +table.dtTABLE td + { + background: #ffffff; + vertical-align: top; + } diff --git a/data/resources/startpage/Layout/green/balken_links.gif b/data/resources/startpage/Layout/green/balken_links.gif new file mode 100644 index 0000000000..f59bffc4ce Binary files /dev/null and b/data/resources/startpage/Layout/green/balken_links.gif differ diff --git a/data/resources/startpage/Layout/green/balken_mitte.gif b/data/resources/startpage/Layout/green/balken_mitte.gif new file mode 100644 index 0000000000..3ed431d4e5 Binary files /dev/null and b/data/resources/startpage/Layout/green/balken_mitte.gif differ diff --git a/data/resources/startpage/Layout/green/balken_rechts.gif b/data/resources/startpage/Layout/green/balken_rechts.gif new file mode 100644 index 0000000000..0a00a73366 Binary files /dev/null and b/data/resources/startpage/Layout/green/balken_rechts.gif differ diff --git a/data/resources/startpage/Layout/orange/balken_links.gif b/data/resources/startpage/Layout/orange/balken_links.gif new file mode 100644 index 0000000000..cb1a9c1dd6 Binary files /dev/null and b/data/resources/startpage/Layout/orange/balken_links.gif differ diff --git a/data/resources/startpage/Layout/orange/balken_mitte.gif b/data/resources/startpage/Layout/orange/balken_mitte.gif new file mode 100644 index 0000000000..002489f6b6 Binary files /dev/null and b/data/resources/startpage/Layout/orange/balken_mitte.gif differ diff --git a/data/resources/startpage/Layout/orange/balken_rechts.gif b/data/resources/startpage/Layout/orange/balken_rechts.gif new file mode 100644 index 0000000000..318e4f1657 Binary files /dev/null and b/data/resources/startpage/Layout/orange/balken_rechts.gif differ diff --git a/data/resources/startpage/Layout/red/balken_links.gif b/data/resources/startpage/Layout/red/balken_links.gif new file mode 100644 index 0000000000..07764683d3 Binary files /dev/null and b/data/resources/startpage/Layout/red/balken_links.gif differ diff --git a/data/resources/startpage/Layout/red/balken_mitte.gif b/data/resources/startpage/Layout/red/balken_mitte.gif new file mode 100644 index 0000000000..ccea8c197a Binary files /dev/null and b/data/resources/startpage/Layout/red/balken_mitte.gif differ diff --git a/data/resources/startpage/Layout/red/balken_rechts.gif b/data/resources/startpage/Layout/red/balken_rechts.gif new file mode 100644 index 0000000000..ef4ca83e14 Binary files /dev/null and b/data/resources/startpage/Layout/red/balken_rechts.gif differ diff --git a/data/templates/file/CPPNet/CPP.Empty.xft b/data/templates/file/CPPNet/CPP.Empty.xft new file mode 100644 index 0000000000..5e5d632d11 --- /dev/null +++ b/data/templates/file/CPPNet/CPP.Empty.xft @@ -0,0 +1,22 @@ + + + + diff --git a/data/templates/file/CPPNet/CPP.Header.xft b/data/templates/file/CPPNet/CPP.Header.xft new file mode 100644 index 0000000000..ec93f55ebc --- /dev/null +++ b/data/templates/file/CPPNet/CPP.Header.xft @@ -0,0 +1,22 @@ + + + + diff --git a/data/templates/file/CPPNet/CPP.Wizards.NewClass.xft b/data/templates/file/CPPNet/CPP.Wizards.NewClass.xft new file mode 100644 index 0000000000..d5f98d3c4b --- /dev/null +++ b/data/templates/file/CPPNet/CPP.Wizards.NewClass.xft @@ -0,0 +1,19 @@ + + diff --git a/data/templates/file/CSharp/CSharp.Empty.xft b/data/templates/file/CSharp/CSharp.Empty.xft new file mode 100644 index 0000000000..f962224a40 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.Empty.xft @@ -0,0 +1,31 @@ + + + + diff --git a/data/templates/file/CSharp/CSharp.EmptyClass.xft b/data/templates/file/CSharp/CSharp.EmptyClass.xft new file mode 100644 index 0000000000..71770745f9 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.EmptyClass.xft @@ -0,0 +1,45 @@ + + + diff --git a/data/templates/file/CSharp/CSharp.Forms.Form.xft b/data/templates/file/CSharp/CSharp.Forms.Form.xft new file mode 100644 index 0000000000..3b10d34a7f --- /dev/null +++ b/data/templates/file/CSharp/CSharp.Forms.Form.xft @@ -0,0 +1,72 @@ + + diff --git a/data/templates/file/CSharp/CSharp.Forms.UserControl.xft b/data/templates/file/CSharp/CSharp.Forms.UserControl.xft new file mode 100644 index 0000000000..4113c0a133 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.Forms.UserControl.xft @@ -0,0 +1,72 @@ + + + diff --git a/data/templates/file/CSharp/CSharp.Patterns.Singleton.xft b/data/templates/file/CSharp/CSharp.Patterns.Singleton.xft new file mode 100644 index 0000000000..5d3ec719a6 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.Patterns.Singleton.xft @@ -0,0 +1,54 @@ + + + + diff --git a/data/templates/file/CSharp/CSharp.UnitTest.xft b/data/templates/file/CSharp/CSharp.UnitTest.xft new file mode 100644 index 0000000000..038fa6df79 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.UnitTest.xft @@ -0,0 +1,86 @@ + + + diff --git a/data/templates/file/CSharp/CSharp.Wizards.TypedCollection.xft b/data/templates/file/CSharp/CSharp.Wizards.TypedCollection.xft new file mode 100644 index 0000000000..bbc1931a80 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.Wizards.TypedCollection.xft @@ -0,0 +1,296 @@ + + diff --git a/data/templates/file/CSharp/CSharp.Wizards.TypedHashtable.xft b/data/templates/file/CSharp/CSharp.Wizards.TypedHashtable.xft new file mode 100644 index 0000000000..c589d4dc41 --- /dev/null +++ b/data/templates/file/CSharp/CSharp.Wizards.TypedHashtable.xft @@ -0,0 +1,350 @@ + + diff --git a/data/templates/file/Misc/EmptyHTMLFile.xft b/data/templates/file/Misc/EmptyHTMLFile.xft new file mode 100644 index 0000000000..9564f3d28f --- /dev/null +++ b/data/templates/file/Misc/EmptyHTMLFile.xft @@ -0,0 +1,27 @@ + + diff --git a/data/templates/file/Misc/EmptyResourceFile.xft b/data/templates/file/Misc/EmptyResourceFile.xft new file mode 100644 index 0000000000..c50cce23f0 --- /dev/null +++ b/data/templates/file/Misc/EmptyResourceFile.xft @@ -0,0 +1,20 @@ + + + + diff --git a/data/templates/file/Misc/EmptyTextFile.xft b/data/templates/file/Misc/EmptyTextFile.xft new file mode 100644 index 0000000000..93f981b839 --- /dev/null +++ b/data/templates/file/Misc/EmptyTextFile.xft @@ -0,0 +1,18 @@ + + diff --git a/data/templates/file/Misc/EmptyXMLFile.xft b/data/templates/file/Misc/EmptyXMLFile.xft new file mode 100644 index 0000000000..499305acbf --- /dev/null +++ b/data/templates/file/Misc/EmptyXMLFile.xft @@ -0,0 +1,22 @@ + + diff --git a/data/templates/file/Misc/EmptyXmlForm.xft b/data/templates/file/Misc/EmptyXmlForm.xft new file mode 100644 index 0000000000..565b7fe86f --- /dev/null +++ b/data/templates/file/Misc/EmptyXmlForm.xft @@ -0,0 +1,25 @@ + + diff --git a/data/templates/file/Misc/EmptyXmlUserControl.xft b/data/templates/file/Misc/EmptyXmlUserControl.xft new file mode 100644 index 0000000000..3b132cc207 --- /dev/null +++ b/data/templates/file/Misc/EmptyXmlUserControl.xft @@ -0,0 +1,22 @@ + + diff --git a/data/templates/file/SharpDevelop/AddInOptions.xft b/data/templates/file/SharpDevelop/AddInOptions.xft new file mode 100644 index 0000000000..979a1fcb19 --- /dev/null +++ b/data/templates/file/SharpDevelop/AddInOptions.xft @@ -0,0 +1,68 @@ + + diff --git a/data/templates/file/SharpDevelop/ExampleMenuCommand.xft b/data/templates/file/SharpDevelop/ExampleMenuCommand.xft new file mode 100644 index 0000000000..77cd899918 --- /dev/null +++ b/data/templates/file/SharpDevelop/ExampleMenuCommand.xft @@ -0,0 +1,60 @@ + + diff --git a/data/templates/file/SharpDevelop/ExampleOptionPanel.xft b/data/templates/file/SharpDevelop/ExampleOptionPanel.xft new file mode 100644 index 0000000000..576c48c6a7 --- /dev/null +++ b/data/templates/file/SharpDevelop/ExampleOptionPanel.xft @@ -0,0 +1,60 @@ + + diff --git a/data/templates/file/SharpDevelop/ExamplePad.xft b/data/templates/file/SharpDevelop/ExamplePad.xft new file mode 100644 index 0000000000..5343436e9d --- /dev/null +++ b/data/templates/file/SharpDevelop/ExamplePad.xft @@ -0,0 +1,83 @@ + + diff --git a/data/templates/file/SharpDevelop/ExampleView.xft b/data/templates/file/SharpDevelop/ExampleView.xft new file mode 100644 index 0000000000..7debc002ad --- /dev/null +++ b/data/templates/file/SharpDevelop/ExampleView.xft @@ -0,0 +1,92 @@ + + diff --git a/data/templates/file/SharpDevelop/SimpleCommand.xft b/data/templates/file/SharpDevelop/SimpleCommand.xft new file mode 100644 index 0000000000..77317143c6 --- /dev/null +++ b/data/templates/file/SharpDevelop/SimpleCommand.xft @@ -0,0 +1,41 @@ + + diff --git a/data/templates/file/VBNet/VBNet.Empty.xft b/data/templates/file/VBNet/VBNet.Empty.xft new file mode 100644 index 0000000000..ae3c08159d --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Empty.xft @@ -0,0 +1,31 @@ + + + + diff --git a/data/templates/file/VBNet/VBNet.EmptyClass.xft b/data/templates/file/VBNet/VBNet.EmptyClass.xft new file mode 100644 index 0000000000..d65467d05a --- /dev/null +++ b/data/templates/file/VBNet/VBNet.EmptyClass.xft @@ -0,0 +1,41 @@ + + + diff --git a/data/templates/file/VBNet/VBNet.Forms.Form.xft b/data/templates/file/VBNet/VBNet.Forms.Form.xft new file mode 100644 index 0000000000..6d9129d366 --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Forms.Form.xft @@ -0,0 +1,67 @@ + + diff --git a/data/templates/file/VBNet/VBNet.Forms.UserControl.xft b/data/templates/file/VBNet/VBNet.Forms.UserControl.xft new file mode 100644 index 0000000000..c553534f3c --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Forms.UserControl.xft @@ -0,0 +1,63 @@ + + + diff --git a/data/templates/file/VBNet/VBNet.Patterns.Singleton.xft b/data/templates/file/VBNet/VBNet.Patterns.Singleton.xft new file mode 100644 index 0000000000..c78388a358 --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Patterns.Singleton.xft @@ -0,0 +1,50 @@ + + + + diff --git a/data/templates/file/VBNet/VBNet.UnitTest.xft b/data/templates/file/VBNet/VBNet.UnitTest.xft new file mode 100644 index 0000000000..8ad02fba58 --- /dev/null +++ b/data/templates/file/VBNet/VBNet.UnitTest.xft @@ -0,0 +1,71 @@ + + + diff --git a/data/templates/file/VBNet/VBNet.Wizards.TypedCollection.xft b/data/templates/file/VBNet/VBNet.Wizards.TypedCollection.xft new file mode 100644 index 0000000000..dfec0601f1 --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Wizards.TypedCollection.xft @@ -0,0 +1,304 @@ + + diff --git a/data/templates/file/VBNet/VBNet.Wizards.TypedHashtable.xft b/data/templates/file/VBNet/VBNet.Wizards.TypedHashtable.xft new file mode 100644 index 0000000000..589576ccc3 --- /dev/null +++ b/data/templates/file/VBNet/VBNet.Wizards.TypedHashtable.xft @@ -0,0 +1,327 @@ + + diff --git a/data/templates/project/CPPNet/ConsoleProject.xpt b/data/templates/project/CPPNet/ConsoleProject.xpt new file mode 100644 index 0000000000..f5a257de73 --- /dev/null +++ b/data/templates/project/CPPNet/ConsoleProject.xpt @@ -0,0 +1,84 @@ + + diff --git a/data/templates/project/CPPNet/EmptyProject.xpt b/data/templates/project/CPPNet/EmptyProject.xpt new file mode 100644 index 0000000000..ed7a5f87cb --- /dev/null +++ b/data/templates/project/CPPNet/EmptyProject.xpt @@ -0,0 +1,18 @@ + + diff --git a/data/templates/project/CPPNet/FormsProject.xpt b/data/templates/project/CPPNet/FormsProject.xpt new file mode 100644 index 0000000000..2ee96da968 --- /dev/null +++ b/data/templates/project/CPPNet/FormsProject.xpt @@ -0,0 +1,107 @@ + + diff --git a/data/templates/project/CSharp/ConsoleProject.xpt b/data/templates/project/CSharp/ConsoleProject.xpt new file mode 100644 index 0000000000..91a58b2d24 --- /dev/null +++ b/data/templates/project/CSharp/ConsoleProject.xpt @@ -0,0 +1,78 @@ + + diff --git a/data/templates/project/CSharp/ControlLibrary.xpt b/data/templates/project/CSharp/ControlLibrary.xpt new file mode 100644 index 0000000000..288bb5bc33 --- /dev/null +++ b/data/templates/project/CSharp/ControlLibrary.xpt @@ -0,0 +1,116 @@ + + diff --git a/data/templates/project/CSharp/Direct3DProject.xpt b/data/templates/project/CSharp/Direct3DProject.xpt new file mode 100644 index 0000000000..98292f95a6 --- /dev/null +++ b/data/templates/project/CSharp/Direct3DProject.xpt @@ -0,0 +1,204 @@ + + diff --git a/data/templates/project/CSharp/EmptyProject.xpt b/data/templates/project/CSharp/EmptyProject.xpt new file mode 100644 index 0000000000..5621a73e02 --- /dev/null +++ b/data/templates/project/CSharp/EmptyProject.xpt @@ -0,0 +1,18 @@ + + diff --git a/data/templates/project/CSharp/FormsProject.xpt b/data/templates/project/CSharp/FormsProject.xpt new file mode 100644 index 0000000000..dd5b01a6e7 --- /dev/null +++ b/data/templates/project/CSharp/FormsProject.xpt @@ -0,0 +1,124 @@ + + diff --git a/data/templates/project/CSharp/Library.xpt b/data/templates/project/CSharp/Library.xpt new file mode 100644 index 0000000000..9df3a1b04a --- /dev/null +++ b/data/templates/project/CSharp/Library.xpt @@ -0,0 +1,79 @@ + + diff --git a/data/templates/project/CSharp/Service.xpt b/data/templates/project/CSharp/Service.xpt new file mode 100644 index 0000000000..a3ad873948 --- /dev/null +++ b/data/templates/project/CSharp/Service.xpt @@ -0,0 +1,149 @@ + + diff --git a/data/templates/project/ComplexExample.xpt.test b/data/templates/project/ComplexExample.xpt.test new file mode 100644 index 0000000000..b91ce0bb02 --- /dev/null +++ b/data/templates/project/ComplexExample.xpt.test @@ -0,0 +1,117 @@ + + diff --git a/data/templates/project/ILAsm/ConsoleProject.xpt b/data/templates/project/ILAsm/ConsoleProject.xpt new file mode 100644 index 0000000000..69eee05dde --- /dev/null +++ b/data/templates/project/ILAsm/ConsoleProject.xpt @@ -0,0 +1,50 @@ + + diff --git a/data/templates/project/Misc/BlankCombine.xpt b/data/templates/project/Misc/BlankCombine.xpt new file mode 100644 index 0000000000..d01ff4d933 --- /dev/null +++ b/data/templates/project/Misc/BlankCombine.xpt @@ -0,0 +1,18 @@ + + diff --git a/data/templates/project/Setup/WixProject.xpt b/data/templates/project/Setup/WixProject.xpt new file mode 100644 index 0000000000..f2fd3cb333 --- /dev/null +++ b/data/templates/project/Setup/WixProject.xpt @@ -0,0 +1,451 @@ + + diff --git a/data/templates/project/VBNet/ConsoleProject.xpt b/data/templates/project/VBNet/ConsoleProject.xpt new file mode 100644 index 0000000000..540448d438 --- /dev/null +++ b/data/templates/project/VBNet/ConsoleProject.xpt @@ -0,0 +1,43 @@ + + diff --git a/data/templates/project/VBNet/ControlLibrary.xpt b/data/templates/project/VBNet/ControlLibrary.xpt new file mode 100644 index 0000000000..e2b4c7a741 --- /dev/null +++ b/data/templates/project/VBNet/ControlLibrary.xpt @@ -0,0 +1,100 @@ + + + diff --git a/data/templates/project/VBNet/Direct3DProject.xpt b/data/templates/project/VBNet/Direct3DProject.xpt new file mode 100644 index 0000000000..037f987e4a --- /dev/null +++ b/data/templates/project/VBNet/Direct3DProject.xpt @@ -0,0 +1,188 @@ + + diff --git a/data/templates/project/VBNet/EmptyProject.xpt b/data/templates/project/VBNet/EmptyProject.xpt new file mode 100644 index 0000000000..52f0e78826 --- /dev/null +++ b/data/templates/project/VBNet/EmptyProject.xpt @@ -0,0 +1,21 @@ + + diff --git a/data/templates/project/VBNet/FormsProject.xpt b/data/templates/project/VBNet/FormsProject.xpt new file mode 100644 index 0000000000..64239a4b99 --- /dev/null +++ b/data/templates/project/VBNet/FormsProject.xpt @@ -0,0 +1,112 @@ + + diff --git a/data/templates/project/VBNet/Library.xpt b/data/templates/project/VBNet/Library.xpt new file mode 100644 index 0000000000..b7f10233bb --- /dev/null +++ b/data/templates/project/VBNet/Library.xpt @@ -0,0 +1,72 @@ + + + diff --git a/data/templates/project/VBNet/Service.xpt b/data/templates/project/VBNet/Service.xpt new file mode 100644 index 0000000000..9ee4c42dd5 --- /dev/null +++ b/data/templates/project/VBNet/Service.xpt @@ -0,0 +1,134 @@ + + + diff --git a/doc/BuiltWithSharpDevelop.png b/doc/BuiltWithSharpDevelop.png new file mode 100644 index 0000000000..66b43d7746 Binary files /dev/null and b/doc/BuiltWithSharpDevelop.png differ diff --git a/doc/ChangeLog.xml b/doc/ChangeLog.xml new file mode 100644 index 0000000000..02be6db869 --- /dev/null +++ b/doc/ChangeLog.xml @@ -0,0 +1,13 @@ +Added 'test' build target. This target runs all unit tests for #Develop. Worked on assembly analyser unit tests.Updated to nant 0.85 nightly build. (mostly because of the ilasm task).Fixed bug in text editor option panel.Shift+Esc hides all pads. Status & Toolbar can be turned off.Added TreeListView library.Changed NANT buildfile: C# binding now refrences NRefactory.added missing fileAdded debugger from david. Removed ICSharpCode.Debugger.C# Binding now uses NRefactory. NRefactory still needes support for regions for the folding.Spaces & Tabs should now draw correctly with a background marker set.PropertyService.DataDirectory can now be set in the startup application.Made parts of the docu from C# external.Added PropertyObjects to StringParserService. +Added PropertyLink to PropertyService. +Fixed bug in DefaultFileService.OpenFile: Assert failed for urls. +Properties are now also saved using TypeConverterPropertySystem now uses TypeConverter +Startup application can now override the default name for the property file. +Corsavy now uses the filename 'CorsavyProperties.xml'All core exceptions now are subclasses of CoreException +Fixed core xml documentation (<code> is only for multiline codeblocks)1.Check whether to load referenced assemblies. +This change shouldn't affect #D at all. The property +is set to true. The reason of change is ETM. +2.Set Position of the ProgressBar to the end of the panelFixed linker invoking bug +Fixed bug in project converter: converted project has same project type as source project +Fixed bug SharpRefactory (NRefactory is not affected). +These are the same bugfixes as in Fidalgo rev. 1713Replaced some String.Concat calls with '+' (they're compiled to the same IL).Ported NRefactory to .NET 1.1Renamed IDialogPanelDescriptor.DialogPanelDescriptors to ChildDialogPanelDescriptors.Added forms designer bugfix from forum user AaKaa.Debugger implements the dispose pattern and as far as I see I clean up everything. But the SymbolReader is still locking the .pdb file.Debugger Position is now visible again.Added namespace lookup bugfix from #D Forum user LelliFixed some debugger issues.'language' of the method (CallStack) is now working.Removed more uneccessary stuff.Removed dll.Moved CallStackPad to #Dev main. (It's easier for now to have most debugger pads in the editor but in the long run it's better to have pads that can be 'shared'.)Worked on CallStack.Worked on the debugger (local variables).Breakpoints, Show Postion and Stepping (but not very good) is now working :)Debugger position is shown again (Debugger.Break()). Break from Breakpoint aren't shown because I'm seeming not to get the Breakpoint event ???added files.Fixed buildfile. breakpoints in the debugger are now working (don't except to see the 'current' position).Debugger: It's now possible to retrieve the currrent position in source code from a threa :) (it's highlighted too - breakpoints still not work but Debugger.Break() calls do the job too).Worked on the debugger (currently I've the problem that I don't get a valid IUnmanagedSymReader object)Fixed stupid DefaultParserService 'optimization'.fixed bug in buildfile. set version to 2.0.0made trunk treeInitial import. \ No newline at end of file diff --git a/doc/RENAMED.txt b/doc/RENAMED.txt new file mode 100644 index 0000000000..25c53ee7ab --- /dev/null +++ b/doc/RENAMED.txt @@ -0,0 +1,10 @@ +Copyright 2002-2004 by + + AlphaSierraPapa, Christoph Wille + Vordernberger Strasse 27/8 + A-8700 Leoben + Austria + + email: office@alphasierrapapa.com + court of jurisdiction: Landesgericht Leoben + diff --git a/doc/SharpDevelopTODO.txt b/doc/SharpDevelopTODO.txt new file mode 100644 index 0000000000..c387e62176 --- /dev/null +++ b/doc/SharpDevelopTODO.txt @@ -0,0 +1,29 @@ +++ ROADMAPS ++ + +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.SharpDevelop1xRoadmap +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.SharpDevelop2xRoadmap + + + +++ HELPING ++ + +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.HowCanIHelp +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.FeaturesYouCouldHelpUsWith + + + +++ WISH LIST ++ + +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.SharpDevelopWishList + + + +++ DISCUSSION FORUM ++ + +http://www.icsharpcode.net/opensource/sd/forum/ + +please also see: + +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.FrequentlyAskedQuestions1x +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.BugList1x + diff --git a/doc/copyright.txt b/doc/copyright.txt new file mode 100644 index 0000000000..25c53ee7ab --- /dev/null +++ b/doc/copyright.txt @@ -0,0 +1,10 @@ +Copyright 2002-2004 by + + AlphaSierraPapa, Christoph Wille + Vordernberger Strasse 27/8 + A-8700 Leoben + Austria + + email: office@alphasierrapapa.com + court of jurisdiction: Landesgericht Leoben + diff --git a/doc/license.txt b/doc/license.txt new file mode 100644 index 0000000000..3f5442da36 --- /dev/null +++ b/doc/license.txt @@ -0,0 +1,299 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + EXCEPTION + + 13. In addition, as a special exception, AlphaSierraPapa gives permission to +link the code of this program with the Microsoft .NET library (or with +modified versions of Microsoft .NET library that use the same license as the +Microsoft .NET library), and distribute linked combinations including the +two. As a second exception, AlphaSierraPapa gives permission to link the code +of this program with the DockPanel Suite (or with modified versions of +DockPanel Suite that use the same license as the DockPanel Suite), and +distribute linked combinations including the two. You must obey the GNU +General Public License in all respects for all of the code used other than +the Microsoft .NET library and the DockPanel Suite. +If you modify this file, you may extend this exception to your version of the +file, but you are not obliged to do so. If you do not wish to do so, delete +this exception statement from your version. + + + + END OF TERMS AND CONDITIONS + diff --git a/doc/readme.rtf b/doc/readme.rtf new file mode 100644 index 0000000000..090325ed55 --- /dev/null +++ b/doc/readme.rtf @@ -0,0 +1,4654 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f36\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Albany{\*\falt Arial};}{\f37\fnil\fcharset2\fprq0{\*\panose 00000000000000000000}StarSymbol;}{\f38\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Bitstream Vera Sans;} +{\f39\froman\fcharset238\fprq2 Times New Roman CE;}{\f40\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\froman\fcharset162\fprq2 Times New Roman Tur;} +{\f44\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\f49\fswiss\fcharset238\fprq2 Arial CE;}{\f50\fswiss\fcharset204\fprq2 Arial Cyr;}{\f52\fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\f55\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f56\fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f59\fmodern\fcharset238\fprq1 Courier New CE;}{\f60\fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f62\fmodern\fcharset161\fprq1 Courier New Greek;}{\f63\fmodern\fcharset162\fprq1 Courier New Tur;}{\f64\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f65\fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f66\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f67\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0; +\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0 +\b\fs32\cf1\lang1033\langfe255\loch\f1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 \sbasedon15 \snext15 heading 1;}{\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 +\b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid16001860 heading 2;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 +\fs24\cf1\lang1033\langfe255\cgrid\langnp1033\langfenp255 \snext15 Default;}{\s16\ql \li0\ri0\sa120\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \fs24\cf1\lang1033\langfe255\cgrid\langnp1033\langfenp255 \sbasedon15 \snext16 Text body;}{ +\s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 \sbasedon15 \snext17 Text body indent;}{\s18\ql \li0\ri0\sb240\sa120\keepn\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 +\fs28\cf1\lang1033\langfe255\loch\f36\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 \sbasedon15 \snext16 Heading;}{\*\cs19 \additive \cf1\lang0\langfe255\langnp0\langfenp255 Numbering Symbols;}{\*\cs20 \additive +\fs18\cf1\lang0\langfe255\loch\f37\langnp0\langfenp255 Bullets;}{\*\cs21 \additive \ul\cf2\lang0\langfe255\langnp0\langfenp255 \sbasedon22 Internet Link;}{\*\cs22 \additive \cf1\lang0\langfe255\langnp0\langfenp255 WW-Absatz-Standardschriftart;}{\*\cs23 +\additive \cf1\lang0\langfe255\loch\f3\langnp0\langfenp255 WW8Num5z0;}{\*\cs24 \additive \cf1\lang0\langfe255\loch\f2\langnp0\langfenp255 WW8Num5z1;}{\*\cs25 \additive \cf1\lang0\langfe255\loch\f10\langnp0\langfenp255 WW8Num5z2;}{\*\cs26 \additive +\ul\cf2 \sbasedon10 \styrsid14104483 Hyperlink;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid1{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li283\lin283 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li567\lin567 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li850\lin850 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li1134\lin1134 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 +\fi-283\li1417\lin1417 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li1701\lin1701 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li1984\lin1984 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li2268\lin2268 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li2551\lin2551 }{\listname +;}\listid1}{\list\listtemplateid2{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li283\lin283 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li567\lin567 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li850\lin850 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li1134\lin1134 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li1417\lin1417 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li1701\lin1701 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 +\fi-283\li1984\lin1984 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li2268\lin2268 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'95;}{\levelnumbers;}\f37\fs18 \fi-283\li2551\lin2551 }{\listname ;}\listid2}{\list\listtemplateid3{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2 +\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext +\'01o;}{\levelnumbers;}\f2 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10 \fi-360\li6480\lin6480 } +{\listname WW8Num5;}\listid3}}{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}}{\*\rsidtbl \rsid7266\rsid478716\rsid1529975\rsid2386661 +\rsid5311771\rsid6836014\rsid8399799\rsid8998230\rsid11820290\rsid12669354\rsid13114330\rsid14104483\rsid14353066\rsid14500044\rsid15797313\rsid16001860}{\*\generator Microsoft Word 11.0.6113;}{\info{\author Tom Verbeek}{\operator Christoph Wille} +{\creatim\yr2001\mo5\dy7\hr17\min11}{\revtim\yr2004\mo9\dy7\hr21\min46}{\printim\yr2113\mo1\dy1}{\version11}{\edmins69}{\nofpages4}{\nofwords937}{\nofchars5343}{\*\company AlphaSierraPapa}{\nofcharsws6268}{\vern24699}} +\paperw11905\paperh16837\margl1134\margr1134\margt1134\margb1134 \deftab1250\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\lytprtmet\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 +\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot6836014 \fet0\sectd \sbknone\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3 +\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain +\s15\qc \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 \fs24\cf1\lang1033\langfe255\cgrid\langnp1033\langfenp255 {\b\f38\fs132\insrsid6836014\charrsid6836014 #develop 1.0}{\f38\fs132\insrsid11820290\charrsid6836014 +\par }\pard \s15\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 {\insrsid11820290 +\par }\pard \s15\qc \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0\pararsid6836014 {\insrsid8399799 {\*\shppict{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw14115\pich7763\picwgoal8002\pichgoal4401\pngblip\bliptag-992432282{\*\blipuid c4d8af66daa9b8284dc64b16077915b5}89504e470d0a1a0a0000000d4948445200000190000000dc0802000000d13060380000002c744558744372656174696f6e2054696d6500576564203130204170 +7220323030322031383a33303a3532202b3031303006027e470000000774494d4507d2040a101f3189bdfcf4000000097048597300000b1200000b1201d2dd7e +fc0000000467414d410000b18f0bfc6105000052e64944415478daec9d097c5375b6c76f6ef63d69b6b66993745f292d50145154c071c17d149599f75ce6c10c +8cc2f040c5e5cd7b8afda880e28aa08e1bb8200e8b83204f4091a542a1b4b494d2d252a06b926e69f6756ea996dc9be4df74cd4defff4b3e25f9e77f6fff84de +5fcf39f79cf3a7f97c3e04028140a20134d20b80402090708182058140a20628581008246a8082058140a20628581008246a8082058140a20628581008246a80 +82058140a20628581008246a8082058140a20628581008246a8082058140a20628581008246a8082058140a20646a417008190974badede5d5176a2fb476f758 +bb4c163a1d958af862212f2735614a6e8a48c08df4022907142caa6377b82eb6180113b47132369b15e96506c16cb537eb3b0113521295743a7d08672eab6ef8 +e79ea3db7e28c1042bd41c4cbc664cc95afaf06d330ab368345aa43f0caa40830dfc28ce96ef7ff9afe737847a57c8e36c2e9a27c75028a43131284aa218c23b +9fef796eed57a1ded5c4cb3f5871778c4cae502a251249989a72b4bcb668fdb6032567c25fc6dc9ba73efde84d2aa552201442e51a6da08545750e979e05bc5b +90a545109fd168c01e0c06432697ab1312b95c52b842c5276b00ef4eced2783c1e83be0d7b30994c4c70b195b3d9ec50f32d36c753ab376dfaf6d06097f1f59e +63669bfdf17b2673381c4c1de3e2e3592c321aa4e30312fdc2844484e232d0653f313dbeffb9dbed6e6b6d753a1c915e722f986770042858b9c9b1fdcf5d2e57 +4b7333a65fa126373419663db272086ad5c7ae9f4f9d6bb5daedf6c64b174f9e38deddd515e98f67dc02058bd2183b4d67cfb70026646ae4fe2f319707737c22 +bdea5eaaeb9b3bbacd8009a90912ff97989115ca30347498ee7de2b533754dc359cf3b9b0ff43dc164bdea74a5c5621eced920a1808245698acb6a01414c0e9b +99a8e0f98f606a35b430f68873e424c89355ca440a11cefb1389c441034c5eaf77def2b7eb2eb60d733d350dad2e2fda7fce7335b5303a3c1a40c1a23460af6a +62868641c7fd8460977da497fc2b874b412b2fccd1114644e2e02bdff8edc163a7ce8dc8929adb2dfdcfcde61e93a93bb21fd1b8040a16a51940b0d2d5849150 +97fdd8030ebde5a6c405ac5c1438cde972af5cb775a49664b2d8fd5f7675760ef54c909040c1a22e26b3ada2e622604296564e18118944080938dfa8076760a5 +274afd5f626e2c9f2f089cb6afb8d2d061029c07f322e552a14e2de771d9c840282438f7d96eb70f780864b0c0b406ea72b4bcd6e3f1867a9741a7eb54b88b9c +2f103018a4f881011b8612214f25e6f88f603a1b3480b56defb1a067e07158b7cfc89b5d98ac9270988c5f637616bbabb456ffd9ce92a6105a29e633fd5fc218 +d668408a9f3f48443802f6aad2d46c262ebe4e9e001638e23e394787a238790ae5c956d65c0a1c54aba4457fb9592921de52e47398b3a7244fcdd1fcc7ff6c34 +5b89b91d79191a2e13e7afc06cacd1000a167539028c5be767241246c4a409608123ee1352030358c1571e589384d9532f2fba452ec21968288ac6abd5aad838 +0ea777fcfac213df1d38493870e69434c248502714324ca06051149bdd79f2cc79c084ec24056144488e00568ba1f37ca31e30215323f37f89c98d40102477cc +ebf53a9c6ec2e09c197904b5c2bce09cdc09fed9674e17f12891807b5d1ef1068558224120230d0cba5394e3a7eb032fd77e68345a722cee22e7f27824f171c0 +86219fcb56cb70c16fa15018b404121bd4c413ef2af8e7c7f791969ee1af56cdfacec04ac3c7ee9ace6511dc67519f39061959a060519423c012c20c5d1c8f8d +b3be49727f101928f45690a5a58717c0c2983a218530d265b6f9bfe470b931b22bf69acfe72b5abf9560614d2f489b3d2981709ef804e208644480824551c037 +da266591378005965affe2c73e0082f5b7876fa3e33363b7ed2fb73baf941cf279fcfee72eb7fbc9d59f13ea0d5335aa250f4c23c4f8c562494c8c0c818c0250 +b0a80876ed9554d40126e42429092324b945d8d1653e53df0c981058fc281486b40d3392e25f78e27eff91267de753efee39566368d49bac76a7c3e968efea29 +ab6e78f3b3dd13ef7afa83aff7f94fce4d4b28facb4d5c06cde3f1f63f68283d2939057be2767bb047a43fb0f1060cba5391f2ea0b161ba8e9424a3c4e9ed818 +e488c81497d700f29bd82c8646c1f71f110804418b1fad76c7fe5f4e634f92129413d2132bfcf21bce5d6cfbbff776f63d67d05177e854b5cadac6079edd0458 +2d87cddcb1e6d1b8b8588542c9e3f311c8b081824545c0690149090a110f9703291293e5861738e23e3143c364e08b1f43f883c5276bfeb0fced01bf1d40adc2 +212f3dd1e376355eba843d30c1c2644ba95291e4de4594025d422a022ec49b94a9218c042dc48b0847ca0659fc18c2933d0c0ce18d14f9195742ef568be542c3 +79b319b69d191650b02887d7eb2d2eab054cc84d21deda17932380d563b19daa06163fea028a1f435858e0c8fd4841da62cce8050a16e5387daeb1cb64014c48 +53135adfb1b83c1e42024a2aeadca1bb86d2e9a84e85cb1de3f3f9418b1fed0e5769152869764408528cc9274b3166f402058b72805ba1c7292431425c90853c +fe2038f49693a2e6108a1f439857c72beb0049b323454e6a403126695243a217285894031cbe9992ad238c9027030b1c7acbcf24e66a860a6081cf33521404ac +873c9f64f402058b72802dacdc54156184241958981f77e2743d6042b62e20772c8440802db591223b20978d24c598510d142c6a71ee426b5b3ba8756f7a428c +ff4b0683419204224cad30cd0af52e8d4623e48e71b9dca009046eb7079c343b2290b91833aa8121406a014e0b9049044a31aeb5a63044ebbbb1076c18a66955 +7c765801a34e93e53fef9cee743a1164141becf1b96cb95464b55aafac871c866ab403058b5a80132f27676b09f2449eb0cbe181b64d258c841208458ce8e5e5 +7fb4d96c06bdde68d0634f4669c1985a61261587cb753a1c76bb5d4c9a7b17510d142c6a01eed599971a50394c0ebbe0b21f07dadb262b2920f406945acc61d4 +68b5d8c36ceec1fe8caab585414351b1443afcf340a0605188c6d6f60bcd46c004c2de0d288af205a4689b79eaecc51e0b684f87b480e2c730db51090442ecd1 +6aec3a78bcfa97f2dafa4bfa8eae9e1eab3d462c50c9c4d9a909b7cdc8cfcfd291c42f8640c1a210e09632421e273e06dffa4e240adafa6eec390c340cb5f172 +c20610e1673c1d3a51bd61f3de5d07ca0829a97548efd6aa3b7f2a5df5e1b7d929ea9796dc774d7e3a491268a90c142c0a31400fac6c2d71ef0672f883c84011 +f7f00358fe34eb3b9f79ed8bedfb8e0f38b3aaaee9f74bdefaeb8337ce9d95ab5028e50a05bcdf1729a0605108b060e505b4be2349c4dde7f3818b1f73028a1f +07b4b0f615573cb2e23d9325dc883bb68677bedccf663166e5f7349caf572a55baa424069319e6e190918214063f640c30769a6a1a5a0013b2025adff9f7328f +2067ea9a3aba414d0ed21208c58f4c2e970b98ffc5ce430f2c7d337cb5eae78d4d7b9b3bec9878b5b5b596979d1cbd3b8c905040c1a20a474ed6025adf71d84c +b51c17a0c1d42a68ebbb48ac1c6418aae462b910973b8699578018f9a7db0f2c7ae123d7907a817a3cde2f7f28ef7b6eb7dbab4e57badda35e9308f1070a1655 +002734e4676a98f8eee624f1079181046b72b696300208609555373cb5faf3e1ecc97ca0e4acedb7a6ef769bade1fca8777d80f803058b2a80e3d613d3c26d7d +37f680a576424ab8dba6769bad0f3fbd0e50df130e6e8fa7dd7cc5aad2b7b53a1c8e619c0f3238a0605102ec5aada8bd049810d8fa8e2495baf597da5a0c5d80 +091989b8e247cc8de587287e5cfbc9ae8626c3f09764e8ba527083196bed46e3304e06191cf02e212538567ece13ba3d39834ed7125adf09c8d26a0eec0f4a45 +7c42f1236618060d60193a4c843d6f08e751aba47172319bc568359a5a8c5d984a7abdc13dc716a3a920f94a866d8fc984a8d508644c20c50f2564b40117e2e5 +a627b0f17b3790a427323260002b478786b76dea5b1b779bad4172e5afc94fbde3dacc094972c2790cddf68fbf3bf1534990ef8e9fd81b7d8ff4874421a04b48 +09c061a0828c80d6775112710f3380e5767b3effd7e1c0f1271ebce1f987af9b98a220a81587c3c94ad5bcb66c6e76725ce051022e2e6bd4e381370ac70e6861 +8d7f6c76e7c9aa06c0846cad82304292bd129af59de71bf58009995a5c000b455141b0e2c7236535ed5d3d84c1c7ee9e7eeb55498441b158a24d4a12fe9680f6 +d87db396af22ee3ca890e262643472542f51042858e39f92ca3aa72ba4158019174971c456734c72949e800d43018fad26143f0a83173feefcb19430c2e7b16f +29d41106e3d56a5d52b27f084c2609227f89729c603161befb18027f398c7fc0090d19ba381e1bf77b8b4c090da095176469c30c60ed39544e189931395dc0c3 +89b2542a25a81546698065aa8993f1f09d02391c50563d64648116d678a6b6e66c59e9b1ddbb0ed23c761f3d78bb95490195c3d192321a24772cd8cabb7aac81 +4d75843ce2a7a1d1127bc898ccb68d3b7e264cbb7e4a0661442020450b698a00056b1ce272b936fe63ed87efafe7306c05e9569d1bedb0b0109eec223ac98712 +fd976c5d40008b1cbd31dbbb7aaaeb9b011332b432ff9798dc0883153f569d6b0c4c6d3f53dfe2f3e5f42b149dc12074fe72bb3d4b5ffe14133bc2818559c412 +7121690c522a00056bbc51577b76e1a377666bda36fe6f8f5ae6457c088d8958dcb4f55f5bb7ecedbcc0bed643c75d99296a7ceb3b0e87cd0eabf5dd68535c06 +2a7e64b3185a05ceb4110882173f06dd74a3a2b6f1c0a9a61b26fe7a7b948ef9967ee695bebd7bf9ab9b76ec27769e4950c524e3f74665b1583cd8246b0c8182 +35ae387ef4c0d245f3562e344e4d72221ec4db671fd8100ecdb7ec2173568a6be58683f5eceb7df45fafb1e404a5888bb3b9c89381050ebde5656818f8e2c750 +012c93d91a747cd5273f545c3b617a9e56c8411512dea5667dbbc9dad4d6b1fb40d9d7df1707dd6975de6d8584a8994c2687cd48c7122858e387eaaaf2e58f3f +f4ee338654b11b213423f0219e1ee4d6c98ece874cffd871b8d2371bb97c990506b0c8938105ee329a9f1e18c00aeec92aa4213ddcdd872ab0c76fafbe02af47 +26115c93434ccb52c6aa10c81802ef128e133a3b3b163e7ac72b8b8dbd6a15c291c20cae79b36cc9b1160d7aba6f243779707b378c193d165bc55950f16390d0 +5b08db50a7562023c1d23fce64d1893725313f34921f13f58082354e58f1f89d8fdc61cc8b7581f77ff19a9117179950d30596a737b293aac6b7be63b1c0adef +c68c63a7ce119aacfbc3a0d375f858129f1fb2f85197a018bed736fbea9c492932c2a046a31dd2c92043070ad678e0cb4f5eb399aaeebbda16ce6e55b15cefe2 +3f983318c7e295d218212e17893c012c70f1634eaa9acd246c9b1ad2efe371d8d3f2d386b398745decc27b261306e50a85582219d2f92043070a56d4535f57f3 +f61b6b563ed24df38635dfe742e6dd6463d2ecb92a27e12d922434200345dcf30759fcb860eeac21af44ad92beb8e0262e0ba78f2c162b392535d21f12158182 +15ddb85cae250bee5a36b753210c4fae2ee3b3227fbedf626df87fc2384902587687ebc4e97ac084eca47003587ddc3dbbf0c6ab7286b092822ced9ac573445c +9cb389a268667636acc8890850b0a21887ddfecc920792635a6e9ee0f258185e07eaf3d0c26affeb416ebfdaded1d179eeeca9fe310683c1e3912269fb78655d +d0ac823e68345a721c4e9eb85c2e78df2dec904f5f5d9497a14106c3fd3717be387fa6988713a6cb6a95231492c514a51a50b0a2953355e5f7fc6e626cd781e7 +a6d19c1705ae669ee3bcd0562db69e8ab194c7582b25f67aa14bcff1da83ff17a30e64febd96ed9bdfeb1f118a442449292a2e03f983e9ba583e9b10c01ad830 +140b785bdf5e76eb8cfc701630252769dd33731fbd25177f57b0b7ce39277782540a379d8f18300f2bfaf0f97c1fbf57f4c567eb8a16182666ba69f4dedf3b34 +b437d9ca87f985dedeaf3e0fe2b5a02e23cb7141e073d2690c2f43e660c438688cdf0c302f72e774db9b5f188a7fde356dc66d48e81242ecdb559dae3c767047 +5bf379a3a10da57915aa58a52a71ca35b767e74d190d8d3b5c0adcf0357388b9638a18d157af2ff9ee40e947dffc78f04475a011a78c115d5f98312d37313321 +c809c562495a46069bcd0ee77b414609da707610818c3d7abd7ec99fe6f474d7e765ba1c4e9a54e88d577ae215bd5fd3b56e42694aefffad1bf13a11af1d71b5 +b2dded1c4cd4982a1b5deac474e6bba3eca7df970a78e8737f7f3541a3c99b984fe8e36e341a37ac7d76fb8eef853cfbd5b9f638854726f59a2c685b3bdaa2a7 +1fadc4fc30e68dd7e5cd5fb22a257dc248fd03dd6e8f76e6e341bb83f6b172d1ed93d37031ac298553d99cc1951375992cc72b6a1a2eb5eadbbb791ca644c011 +f1594a113ba8fc72389c44ad56a15092c402a532d0c28a26f6efd9fad4f2c50ea78fcf13fe741c31b4dbfdfb5c4945de595739fe74af2555f36b0653eff5c544 +e8d8838f60e695cfeef098116723cfd9c263489c7bcb9412096fd6ccab5e7a61c5df9e7c6edaf46bfb4fe5f57adf5df3cc860f3ebb759ae5f357ac49099e5eed +bb6cb8217dc17d5aefdf276b99fb7e39f4fb3b67cf9e91b3e4d9f589baf4e1ff1bcbab2f00d40a230d9f3b86993c83552b0c89883f7b7a01f6c462b1e8dbda8c +46833360f31b0683219648309d8a91c9a0549104285851c33bab96eddcb973cd5b9f5e7fc3ccbeeb079315835edfdcdc78a9bee4e08fdb7efcf9f4373fa05bf7 +711ebcc5f6ecfc1e363e0c8d1d41e3222817a18bad5e9bd5d5caacbac04f4d4b7d69d53a91f8ef452fbe70aa64cfa2ff7e253d23a3bdbd7df9c27b9a1bcf6c79 +ad2b05932a07e2ee467c4e2430c92b5fe52a98eb5a70afe5c36d25737e77dd3d730a57146de60e2f727f0418c0d2c6cb45f828f830ef6cf2f9fca4e464ece170 +d8ed367bdfc6a874069dc3c6fe70a04e910de8128e1d4d6d1d6f7cba6b0807fa7cdea663eb518f63fdc69f84a1b78f77381cdf6c2a5abbf64363a73727d5f5d6 +8a6e4d5cc86471cc565abc3aabf42ce3cb2d5b190c7a4343c3eaa2e72babea381c86c3e1beb1d0fefab26e36665285b7c1028d8d181de8aa8f0515e7f8f937cd +674a869ea8b9e7507960fbaa7ed2b4b15373752e976b42926c72a6fafbe2b3ed166fa87dbd468ac71f981117a762b160f42af240c11a3b367d7bf0af2f7e34e8 +c37cde42de4f3919c9abd7ed6185d1b9b8ade5e2e205b71f2dd50bf95e4cb3ae9de40c35f39f7b852bd6f2bedeba7d627e414b7313e601b95cee679f7eb2f8c8 +e15d6b8c3ad9a037734785c807ffe2bdbf858fc6e5365847b76ce585f9b30bb3131f5bb9a5b5c33caadf2855a37a6b69ef4d098944aa502a6532199d1c1ba051 +1398d6307680fb6706c7e79b26d83fe39ac9af6fd86b30e88f1c3af4cd96cdfbf6fe70b6bada62b1043d4215a7f962fbc9457f9e63b6d216ae941c2e6179ac88 +c7dcdbad01fbeab5215e17d2f74bea86296614a57dbf7b179bcdd62525c7c8e41e8f5b151b8bbdc5f8377b5702dd44b9b6bf99c9be3669ba425bbaa4a5400b5d +2814440a1415b8822c0ad7df2b82d7ab5cad5245fc510e82a8e83deacf05f4aa8822b288a0822b42050129656b0b144ae90a2d5dd226cdda2cb3fd3349da2669 +9a2ed29a7b98e7e4e464bef9bed932f3ccfbbedfbb10fd798d1106f0c48cb60dcbf590aa245e52d58f2df4123004254607b7684d03cd56c025a18556db5a7ebd +ecec99026d6beb40ef94417760de1583875385657d1d3245f15b7070a2de16919c18efc15008822425274f9c74f73df7de4789481eab56aed9161af2faabebb7 +2c7b33e03fb9ad19c3ddebb32300e601b9844c4e9415e4e73bda0402419c323e63dcf803df7c7da54a3234480bfa0e8a10a78db42ad66873debc1a2a13379a6f +4fa6040f440f918bf8dcf3a5b70662e31e181913ec768204c1ebbb8d9fc1ed0223610d12ea55ad7dad933e63c8efcd6ac1e1a397f67fb5d76c368528d84909ec +e1316c3e8ffed7701c2f2e2a7a7fd3bfe7cc9a71ff8c7bbffa720f8abab1d2a34fae5efdf2b3661bf4cca6809a46777f07da4b0b606a30390d2bbb56aad7eb3b +d6cc5ff0a0442addf56ba0ad81df3f6b0169036322d1954b8d91d81908f42160a8f718194d93c895aaa681d8b80794e16e93929456cef38f8416772618096b90 +e0bb625557cc1a7abcbedeacd3118bee33678db58d1d6593889cfc4110a0b105aebec5aaaa43ca6a58c7ce0a2e5fbab8f285dc8f3ffccfabafad9f74f7e48e8d +3cfecf9729b9ecbd8ddb723f90ee59ade17958c0489039acf6dfb8b4e8c2f9c953a63adab83cdefdb3e7ecfa6247a90ac4eba5dc2803cceb33e9106d60f644cb +2fa7b822ebd9a38de36ffbc51c694fe35532f08415112a0f10b95d353f09b7bc63c1485883843e18b048e29ea03c0947fdf85ceda92f54eb730cd3c65b3bd80a +d0e16c203c98989862fbdbfde6d7730c27b637ed7c55332dd55a5971fd6f7f5db8e6955594dad2d13967c5eb53ef1e5d56cb7e639797f03765b80586e1d2d252 +d7c6050f2ea4be779ee3f16275b63a11dad41f0d08d783558f1b9aeb5becdef7b7191461e94d969b8d036e4b4a1de13975e03f35d0ee4c30843548e825614100 +cf14e44d4ed66c7e59bf688645d01357d05eec5a903a0cdd9ca3fd6a8d7a540cd8b1fdb3552b577470160441ef7eb0273c44f4f509fed122cf89793e17848504 +545556b836a6a4a5c5c6c6fd52c05591302f5e4fdd23960a31d9d73943120c11137111d8e8c08a3e8eec011121017289e06ab56a10e6b7bb6664f59f1a687726 +18c21a0c68b446df15ab9c20c974eeb145935a97ded3d6a35c4275a027feb4c091be1de683e431d88e354d934683bd7b76afc87d0e6fcfd82993c9377ef03904 +81b7f6882c5d9c1c6222c4d5559e337af31f7c08c3c99d87042c39e044583843da2cd7a5781b02fa02c20ca64fb084f37a71e27dc1083b890c8e012b7ea85b9c +338bcde6333572fe5430843518c82fbede1b7f3725ffda8870fd4359668a832895cac708c20a300dcd080e406c808801cc012205d8f46253520cf9cdfe7d5b36 +6dece89f317ee2fc07a6d635b33ef9d1d3c7521140dcb851e3d13877fe024a55dc7b4868b2402c096087e0bc041d7a4b88aafaa61e4687e0246aeed3901ee1c8 +e63e0806ac20995821719349257e93d0e28e0563741f0c34abb599a37b4e50692a3eb2f81e674d2ad2464b4f8804401ef1cc38ed4e45bac7bd415c604341eedb +d253c59cdc478d1b9f6f99fd62f0e68dff37396bea9814a7c7c3ffaedd74242f65dbcfc20593cda1f24ef94dc423743acfca7d61e1e119e3c717e4e71f38ca7b +e42f669807d84100e6eaad37f8d61a1127cad8cbc7564c3bcb43bd3977ab0d2b2cadf1d12149395424e0e138961c178ae38480c7a67e384f1f8207a238e0c8d8 +500f7a622cee7f3a18c21a0c2c993f75d1cccc6695aaa55965367b97384c46e3aa7c3431aa339a994401d60a6001adee510f0e89d14917086f45f620189cb9c4 +09563e25abfb75c3d69b63de41572cd4addb2ec9cd79fac7c3798e8759a1502ccf7d76dd6befeefd8dffdcbc4e972e218fb05a2c56abd52371caec397329c2da +7b48401116bd0b04200180c731dbea59947ac88bd34348cf3263430b12162c79f6b1493df6fcadb0ca0761f1b9ec379f9c86b814227ce3a97b07ebdfeb84ffe4 +bcbf63c110d62081cfe7474645511fa3c1d0d2d2ece13345e1a6d91c22eb62d926e83a37d40740c04781099200284e27ae0a0909adabadfdf02be1e6e77587cf +f14f5fa97ae3b5b5eb5e7f935ac566b31f5e9cb365d3a6af8ff397cd3671daff793e97dea9d168f020ac19b366bdbafae56bd5a0a8949d92481f2d459a881070 +8761b0c060b92ee1461b615e0fa6f8d3259c91a3d283437a2ede57d950ec636db2724880ccbdc00f9bcd1af410198f72f60c061f0c610d364462b1c85b00b344 +22e5b0bb3729fa946628e12b35115db67e3b41d02acc954a36c2036b171ae7bd11b87be717919191a392921104118b250fcc9eb36dc7fe23e7b9b3c63bb54a14 +a5d5431cf3a41e994c3e2a29a9a8b030af80eb202c076036e084118840d756226587b6b1a468774765b68223677907d7ad0d0cf51e0bad53d7edfee885b3e78a +aaeb0cd7c05dd4b5e96e531949d10617ef560ad41931456bee403046777f41a042a137f7b3ae01a5274a85e4c3339dcaa6d902517facac5efad8484ab422f7ec +da4510048ee35a6d6b4ae6743602edfd594c624eeb8cd9c6812028c05bdadf84e189d47759b5e75b8dd2405932204cd7615a8eada15bb7effd27f9599951ddb1 +d5f68d4b268e4b3b79f2706ae2ad7f2c3259485f19171222dd6a0252072c12f7b382298e134d2dba92f2dad2ca3a57873506ff1560242c7f01a5e0c0707ffe0e +eb4da1b55acc8b33aefabb41a586f3ce70ef4eb75212196141e625801d57e09a9aea82d3f913ecf9f96432d9d89451670b2fabcf05cad334308768b3b22452a9 +6b1e08bd5edfac6a6a6b6b8b88a4e37ecb6a78688b3d0b33424f47c21c00d90f13e103518ac952c5b5548928f5d0c30c6f45c18ec3c23dfb36773d608daa6ac5 +9333b57ad5aeb70d2362699bdd8f859124e8d68ccfe3b22383dce88c622b04e9ad8f0586e1a72f96ff70ecc2ef17ca9ad43a8dce487116d53e2f3beda939a9d4 +7b222838f8bbdf2ecece1a4d09b9cc24a09f83212c3f0297cba15ef9701fa55e54c50724642917533cf2fe6a5d931a964908dc88508d420e98ab24769480efbf +3b38a13da16862f2d8fcf3974b6eb032845241726bab11280215547b6343c3b68fb7e41dfabea656452db26008c5491e074151e8bdbdc2fb332d4a7b323fc2ee +4501f100cca5998ba7b4622da8b954c28b3374268c0760779e202b33265299e971b405795bfffed49af491e6ddffd275704e41b92f235788d0ec510ca297eee6 +2ab56ec3c7070fe49da348aaebda51b1211886353536165f29cf7963ffde1f62572fcd0e0b0b090a0a160c70822d06fd0643587e0404e9cf0b9eb43a19ce5c2a +26302838c9404943864b4e8d69e108e8cb6bd0cd1b37cacaae25240ca75ae2126845ef723348d5f05035f7c6ad369264bff0cc23477e39366e28ba34068e4b81 +c244808b80261354a525ced693df1d177ef2934839045d7c6fdb03132d304acf6012067afa12160276108188f5a68b624e681bcca76d61fa3668e7afc2833f7f +e67a9c388ebdfffac29ddf9418cda44848ba4a48f9d77d1156736dcd9e0f9f5ef4e4661871deae3dba1750badef66f8fafdbb25f6b68ebae4f4754f3a98b3524 +094e1655beb39bf7dc82b175b5b562b1242e3e7e205c2518fc4130362c3f0202e3fd202c44d269f6b6968b3407425a0f86a0f54ed352201f9a19436b4047f3f2 +1c2d94a22715f12eab6869c8562fa8a9d31a3437239a0e1f7c80589fc99a1e054707403c16459d50a8089a30145a9e011f980fbf3d0522acc8ea4fa50bd7cb8b +2b9cb636c24ca77cc04db4239868ac81c45998965ef5c369deb83121c14346741c98aaae64c9fc148c1df5c892a7a8c55a97ec110633bba456eee30473e6d61e +ce6fd9f9fe3fc976939344e2ab2c20455233fff156ee861d3ed82a541110d8ee147ab2b8c6f1e3c8e92ba7aed2fea80683fe5271914edb9f043b0c06140c61f9 +0b5014e573b07e0c6487ba3b76113089bafdadf31268162c2e2a74d89829261a3a6448b93d70b8a18e336f8c79df5fd0454a169fdd2d59c210343912fa6226b2 +221354d4b11e7d4b76e0f7769777d299a986b4015e8c951b81e116e4c4256ed6b4198ef526bd6aebbf16af7876e94beb3e7dfee5f7e2e26827d286e64ec23a5b +198c13ddde872c845836fbd6a655babc82d6e3dfad0776df021f0e0d0693797ecebba78bcb7d5fb4b4f6a8e606b5a1a2ae3323f347fb4f62f6e485388e5fbd7a +a5bb2c890cfe2c302aa1bf40abd5ca45683f06b2022d101727addd1aa19532a090f05bf4c6eaaaaa583b5f0406855ebb5e891364301fce49e86daa728ab616c4 +43c90a72d509e2954f25ad0678c98c761186a06389080b40c42437022face4976ff9a1e0ec25084248887ddf9c271e5f3103b61be7e29474659d162ddc66018e +d0eed33ef5c1a408b58887658fc7962d347df4558972c491f4acc7baeb6c325b1f5abef17c49cfc94e93dabde41dfa6007343a63e94d6dd2307ace94c0f1eb65 +d7c6a4a4329678ff012361f90b283544c2b7f5632004036eb49e25b7b182ac5efdb5a8e76d5c084d85d74aaf3a5a0202837012687a5760c203f172684b361c24 +04efec139dbcec962b8a12b21c118e30041aea35cb577fb661cb8f6f6d3e90953d0b6e9f4a88532ac512094140c5d79c637d5bdc33e39d3183cffcd5344a897e +befd531ff9129edfb0a397593112daa39a3bf4c10e34a83ba5aa3693a9a5b96f6917190c2818c2f217e875ad12beb51f03212e108cb448b3d5d2291ac9143580 +bd70d630096d0b6f51ab1d8b0eafabe6b6beecc6056122685336cc6381555ba5cd5af75b88a4fdf2e5125a726f69f1f2a853cc959a964efdb87095b676996d48 +51b5c2c7be32954ec24210b0e231e3952abcf0c456af3d7ff9fde2973fe5f7e6f8e5525170002ddd79e8830e34aadd3c5419c2f22b3084e52f50d5950607f42d +e914c402880cb0a49d01d2ec2094a5f022a605dbe7bbb4ad1ac7a2c3ebaadf84456198147a6234ac31c01fffe8c503402ea149b3bb473d2ddd4e585768c22aac +5658b16e95590822c729551d8b194968c648dbb6ad9f74ed4910c4dacdfb7a79f06923a21c5a9e873ee880cee8661334180dfdbf4c0c6e3718c2faf3517ee9f0 +96f5f3d7af79297a482f8cee108038b433011240b3156c9faf43313a5b83035e331a73ec9c80b5c7dfb0d9f430637f14d04e2c4c043172f29b13fc5683a78927 +24803e91baba5aaf03d3d333a8efe232367538be0d58c3c3b572919bd43937db7cfe8a51a7bee9d1f3fb6385572bbdd4a4904b8559631316dd37d6b531292ecc +f1a3e8ba975c5d52919bef3e6ab331a5f0fc070c61fd39c071fcfcf1cf37bc383d3b23fc95a71f86af9e8c95d9e2127196824e29038b9c491a1c8e4ed422d548 +31144b0ea80eac003a0899f638b713c5cd06a4e2268bd31ed58369bcc4f73884a9c04067808b83b06c7d2e3ce806048666c7c2661b74e09467744ed230da0c74 +f6cc19af0347a7a4b05888c90c9756b14e9787fad845667ca347cb940c2b418013873ef268dfdb45190c0c10e5fecfd4cf56cf5ff9f084b830b7389e8408a717 +c5c2ec64b88b415d2c600aa6fa2f18c21a6c34d75fdbf8ea9c896386bcb87c855c55b47912b16912675e344b638202c40404d305b810014044744e3efa23a417 +a946474c4cc7f385e3e05c09fbd0292e25a724c63845335b3d97307a99f9add5d33282a3e620b0d701a3bead7f8cb0284c8fa6688b2cb8ea59de35258eb6e79f +3d53e0759450288c8a8aa67e9454b0cf57faaa0336de451f742030808c1d8a5d2c74dbb2c164feb5a0c4b5452a16bc9d33737a7a149b459fa96b7a52219f132e +77326c725c586652a4c72ec2146eec06f7cf9d97c1c080716b183ca81b2bde5bf7e8be9f2a2364e4d363a0694359aeaff7cc20e4e32f85cf2ef6e5f843a97e75 +4d48751dd2a446043c32738c6deca84e4f0802854cc5de3d2a2f345322153a725492b3a7dd21eb0f4a58c0ee951a26212f94b3a90363bbdc4a8951289fc76a6c +68a8aaaa8c8989ed3a302e3ebeb2b2e2e4a52093d557bcf7842e121685d040a2cde4667e3bfcfb258bd5cd2324f7e1ac7079a771ed7255e776d24644bbe6d58a +08f19c731c16ead6d29b6adb0c060d0c610d12767fb0ecad8ddf04f2c9b577c1599170574d645122f4441ebf5e43a7c5a384260197e471491483ac368885907c +9efdc325a387e289d1d8d4719ef6271205fa63815ec5ab5b06b25a83cae5f2888808470b86d112197a3b52158488409d166ed02091c19dfcc76181d404f6a98b +d8c9e3c7bd12965219ffcbcf3f5dac0df6b1e5e8207d688097648756148a8975dbe67747cfbb2e2a64e294b8ce99c7368badea96a663315919eedad96476633a +2e87152c755309f94c15427f024358030ed46659979bbdf340c5fce1504e1acc6379d72ff86c282b1c494eb7ce9864b5a140a3a3a500b190a42429df1a096e42 +ac357c4b85a03bdfd16fcb68abf15d774fee506d0c067ae64bd4cf64366e08b43fcead06d895b0288c8b6f39755178f2f86f8b972ced3a4a194fbb8fd61a837c +dc801d1e581ea8be8524264fe8bcbc187624ffb2dbae93a21d9aa00357ab5504d169351f1ed599a9062788f3a575ae63531387c1ee575bc80442fb1318c21a70 +ac7f3e7bd7c1f29599d0bcf81e2c863363a0973e178f4bb6c9a564a8c2bbfc43d28e4e08a665e3ad6c4ccbc25ad93e7cdc295830f2fb0adafb69eab4691d8d8e +52cfd2db5171bdcd4a3fdf5d270ac7255aa887bde0743e8aa20e1bbf2be2944a8a42ccb0ccc796c72bbd1096c104b5e8e011a9f775b45caf693499dd661261f7 +7c17aee52a2801ca3553cd9992da06b59bd7c2e434cff4f3fd4ebcc56020c010d6c0e2a73dafeef8b6e299f49ed98a42b818ba3f82f5c13b41cb675b61210eb1 +094a2422ac306985090bf541ecdf30c0fa3055925703745690929a1214d4a97fa9d5b4b7a4fc761096da6e4dea9a9c6a44142611b1f54663e185f3e3fe9fbd2b +016be25adb6766b2af2424ec5b20619755512c2e75af16aa42b5bdda45ed5fadf6aa95eab55aabfd6b5b6bed2ab57abdad68ad4badd695ba5bade202822ca2ec +82ec7b42c89ecc3f0316212423a058b8ffbccf3c79c29933674e86276fdeef3bdff9be61e649665c5c5c8d142e0a13b9872c2aaca232c45e080462cff696ec3c +f310878cdcfb7a4350bbc8c21456fba9601f37ca5f0eacd2aaa6ef7ebddaf1424c81867b3b9a8d46564eed57205709fb16095b7e0cb44767f9777799295a0a2e +1642ca02a63a9bab4ae7b7a4f1d5b7b99a02b6ae8c69a8a3e12eaa9eb0950945f7e7e0d6d0b809133ab617e4e1fb57bc04dd1fc92a4a5bc3c2453c733d88d142 +44eba7be7ce952d7ab184ca68146747b47418bc4ce42c4667139c547d229937265ad794e85d2cafa7de7ef1a5ab3f4697586dc9287f1ab213e2e6d6f304bf0bd +2d271b9b3bf9c8827dddd89d431a381c4e577948e26f04a9b0fa1059d70ee414e9bf1d0f777f5d9c4985a25cd08ba5609ce4094ce05411c86f042eaeae4141c1 +ed8d72b9bcaaaaca5e6c6bcb7cdc52ef0d6ab445877f345b9e050336c0a5e1ec0dcebd7bc55d4fd1e97423dd9660e44899650716a6b07c7d3a3d1a8b3964f6fe +7ee37a56f1e8c1329341afef90ae5ea3d1ee4a4abb79b73cff7e5dd7abc645789bb5086d892649e2e98324ac3e4476fa05044283ec7a16c513eb0b7d928c8e93 +3c6eec8fd6886e4bc7e5d5f4d8173bba75301b0d45d1403721008f4b586df28a82a002ae05c2b2696db496558a586159f5b8dfa74c9c12dab1c52c30bd1d4565 +b5d861d6b8ebb8e558560ccef6c251412e668d2231d13a2689a70fd224ec435494973af0506bcb82d6e0c881383490d7f0b84107bfe480aa16e0eee111317468 +c7f6b64c7e23844f604fefedd631fcddf5544b3f7c7c36fe111a1b2dd0626169b509260a281f664561352a60b15da7504f0f9727c3290b5e1c8974fe36f0f936 +644c437f0349587d088ca81a55502f76a2bdec0f7d76155fe0ebf5adb36bd11fb270a28c8d9bd1d1202d2ec250c860d04789e5bd1ebc1dd72bf1190ef3b7bc29 +91cfc6cf36355920ac2be9b904c30a391a5f27cbba4cab037456a7653b0f67a258f96e2250e612ee659ef5d4d9c5a5578391e8439084d587f0f0f255e9a1aa9e +27adc4ac48ad01bc75122d95f786b3326ad0f88b348dde14317458587878c753e7ce9ec15e47f88809f28b7613f7e4e8cd56c21aea6739efa04dabc232192d48 +c5e43422c21a2aadb1e6f4d3e82026b31361f97b390bf98f55dfd4496cb3eab5d166a9c4f87cbe4028ece58824fa0c2461f5210242c7009c3e7a73eddc10d0a4 +475e398626a49aca9bbb455b9894cba84657dd142f3809e42d5a0f0fc9fcb7167694572a95ea6af215eccd4bcee5dd199018dbd351230ab118a650a96585c562 +e0d36658b2aaae101256a4a51d396dd0ea201aa35324279d467d75eac85e7f0a5b1bcec625d136ec4e4b81300c7b4965bd1d92441f8274baf7217c42268778d3 +0fe66a267976b7885e3b46bb41bb7210572787ddb7cbf7e4a0812274901df0b3852436c08d07a888b902399807ef2de496d560f6573597cb7d6ef29429d13166 +b9cf938e1fd3683411525180b8a163bbde88761d9018174bd17325f89bb8916a869568aab6d5b9aeb567caaaea4b2beb09061f6ec5e30e5a15168a9a4bb6f839 +cf1f3a7d9d784c8b90b88857cf1d2b649b7f0ba4326f265932a75f8224acbec5ec59d3de5dbb2fab06a39b9e31020c412b23f42baf34bdbb64e11f4987d20baa +32710f37ae59283070e5a2439dc0ec4048c4c287c5e8e3f3ab06001ac78e1b3f62d4282f2f29dca5ba615666e6d12387b161dff4ae079dab969635033a823a71 +bb3b43b906dd780d9f8988677c738a558b57df5a5cbaabdf9ab8420487a10b746db07616232c93d17cd3368fc33cb4397ef2fc0d359d93851200139eb3a644ce +78d687d2c5c6f0f4f212db918b83fd14a449d8b798fafa464c646d48316a8d3df646f9da4233a5aa0b674f2d5ef7d5d61f1257bcf3f6cce7a2c60f96054bc4f5 +5a64df1d10f71b9ad15aadab6dab1cf6259cf9d2cb32997757b6fae3c2f94d1b37188dc6d782298162736292d84057cb415a557767b8e9065aaf062cba69e302 +795b72518bd0b7124b57a9426c0f4678d55210ab636a7598e58b8fabd1ea771e3cdbd0d0d0b6a621f3703cf6fd8a8820297814b0a7343c44f6ed8ab87f8c3567 +2becb9f9f8fa393a39f7f43f45e2a98154587d0b0a85b6f1eb6dd12fbcb635d3b824b4c74ffb657fa8fa66c9379fae5db47c4df0d091d8d1d66e3018f6ff9890 +743ef9e76c34780c14e502a48efc824af9e66fbf993071a28b8bab482cc6be7e980178f7ee9d23870ee5e5e11c315e4a7f63900e582a0a3fdd072466820b25a6 +b7c22016a13ffea72cf44c31b0e519b72c6d1a24214a91aad35b53584475228659b707c103931067a8b49ce2651bf7a95a94e1def62291586427f691389dfe61 +d58193d7b0e3cfd4bb6a6d27cf1a0c43ee4ea2e79e091c1deac1b11450c1e5f1304b902c9edacf4112569fc33b78d2dae5d3567ffa9b33d71027edf1035f1a6e +da915dfcd987ab17af78dfc6e641b1620a8512353e0623acb654285404da365ab1f6a6f0726646566606d6c26030b85c6e5d5d5ddbd79b46a5fc4f3098edafb3 +16738fb5cf09c6371ebe7a0c9d2041a77a4376ec4e3d754634b512ecca466f55e3e9aebe7c4bee6eff887c5a7a4b3eacba46456e7125c1559132ab1e779d1e98 +4c1042c17d66c969b906a371edd6131bfe19e3a3d7575656f06d6cfc0302673c17891d72853227bfa4b4bcbaae4161c363d8f2593c06829a2c4f18a354573777 +8ce2c9447dfd1f24613d0dfc63d1d6aacab22f12531854c3f3ee3d7ee673028d8ec5151fad8a9ff9ea1b43860eabada9292ecc3bba2f918e3c28928a814d8336 +4536ddf5868e9609336ae1d29ac6dada5a3693ee6ccb1961a78c95ea844cc8a2b6ea88711e50983d987f12dd9d0389b9745721c3818bb4687455726d41ad566d +005e0274d364d3087718ba276c2e06108c02b8ed1585a826986e841846846544f83a08412dfab092d3f30902d3b0e71326a9b37636bf047f748e6e781ac2e456 +99a6d519567f777ce392184f07aebca9e9ee9d1c5f3f7f4c5af2799cc8f000ec502a9b6b6b6a1b1aea356af3d45a0c2613fb01b01589f87c1b92aa060a48c27a +4a58b6fe784bcb988f0fdcae1e6298ebdbe3acbb9324267fa172c98e84ad09df680df8329913077c3e06f213751ac7d716f2b5c503350d265463803834fd5ffb +6fba7b3b4cb2d5a9611a933ded95b9850505558d0d6aa0a173a9baea54004cab23217f3115553d8859b24a3c308a7116d0e21c8174cee4406c0f626c45a75a0d +f1bf7493e6e30ef36ddd0c06e38dcc82b6469546f75ec2894d4b625cc5acc68686fcdc5c6f5fdff6c7cbe170b143e2e98919d15a8dc6d8eab0c7f4299dc14090 +1e2fdd92f8db4112d6d3c39aafcebbbacf59ff65525e8361d5600a9fde33ce72e34307620cffbe851ece0593bcc0c23040b0e98702e3fb7b7a81623950eb4d21 +81d2c8e1cf60475be3ef492752536e387380bfb87bab3426c8d84817aba9080c9d3d79f4d7fdbb0d469350c095486469722782eb22ad3bb06a1ae01dbfb1572e +9b8ebdcfcabfdfdcf2b00c6c738b7a65c2f12f96c63808187575b5703e2c95799bfd24602445e13c567c2989fe007295f0a9e2f5a53b7efcfebdbb0dc8ac13c6 +73653dcea98ed1d0c23078770cd4a80173934056cd932f3fd5b63dd02c6c32f9ca65ec758c47b74640b83abaa499155ae733a97acef3cda1deaa949bd75352af +eedeb9797a7450b59ca858acb52d843a3d58f5352f6ab0ddcc371380a540f94645cbca8413b50a7cf09aeaeae2a2c227fe6448f4079084f5b43172cad2d37fa4 +8e1aeebefa1cf4ee9ffafc9e6f72b66343d1fe260a0ffae03ab4f09ce144a149a57f62ccf57b092ecc4243c3da5b2a2b2b8a0af1efff580f224908310c34f766 +76440d3bbc9eeeaea4f0f598c45936ad65d2b0ca19d1c1453967a483c6dbc866a2a875558898867859d81650590bcf5a21a8a9677db6f5625b8b45bbb2a641b1 +7acbc9a6d66a8b9515152596d2da9018e840d6ad5bf777cfe1ff1d182cdec417de1c16ccbb9c92b2e58aee9eda68c780ec58ddb5106fd598b664835ba6672b21 +9f1aa3a052d5bcfb96b6a8d9c8a1000736781cff714e1dba2dcde025954e8f8d6b6f3c7deae49d9c1c091f2c08b3fcf30673f40c2f05c3474115e860aa39757a +8a8dc181baf8ffbd3c38d4efd4cd1a82a85106dad4545a5e530fcb95b0520d2994504e2175cf09e69a04def070e9e6c43fd83c7c9f338aa22b3eff59a5b1b01f +48d1a24ecbaf1a112aa15311854201c3108f4fe60bfdaf426f7209907882b8726acb8eed097fa6d67b08d1184f788207c4a511310ea6a78e94c3996864a3b643 +452fd4e84cb967672a3668b43306a153dd101adc1bedfcfe25e86cb171c1c24523468e6a6bd16ab5f18b1735ca15eb47425d5274a1884047775562af8f24c994 +fbd41f8f3a5689e65fcbb04a58a37d513bcdb5bc7b8da555a04d8841103ad89ff5f6e2c5a39e7fa7bd5b6e7145c48bab09eee523715c3f7f3c9b8efbd4259e5e +4ece6420e87f0f48c2ea1790d7979d3ab8f1c8e1a4b43bcda324e8643738cc01a274aedf925b8f26a49bdcbc1d936a8755d45bf604514d2d53bceedfcb2f9eed +0ba23d7bc65957cbd1f873c0d1d9f9e34f3f6bcf0b7cf4c8e1fd7bf7c804606734f4b034198452c41a9caab8866e0e0e33c18477c477a82fe8f4562ff97cc9d4 +000f3cab9f51af6e91976ad5f291e36608edcc0b9de6dfab1cfbfa4772a59ae07683bc5d3f9cf72c8386739654e6dd5e4196c440074958fd0bd5f7330ffffce9 +d1e3974b2b75435c506716cca342f52af45a25cae75357ad5b65239b4aac2f12d7bd4c3329777cbb2a94d9346f507739aba2197d3d096ed1830f3ffa58e2f9a0 +c4438b52b96cf122a54afdf91868846b1b5ba1143b0ddda31961f56cc500e183c9ff92a62aa3ac75c0ccb75f3e99cda23f5cb666b25861e1832d76be9e913ffd +9f5f2a551a601d11833c57bd1245a3e29ce5e3eb27123f81b45924fe76904ef7fe057bd7a0f92bf79eb87cffc4c9c3635f9cc6f00facb777731f119978f09723 +c96543272c4c4e278a63120bb8621edd46209abffcebc3445b8cf140ad96bf5cf5e5cd68fc1f1485c6383d36ae9dad301c3dfc1bc6560122108567b2c3a84acd +1e52c7f26fea295b61f2ca008312391165f8783876642b4058ae6668b06ccf178b9974a2c08d1b59459bf65d6b2b4591977bb7a1bec7b91c48f443907158fd14 +6eb2c859b2c8aeedc484151ee0d1e674471044c07b6851d2dc9b61a61135403873504c30cd04d14cd54a70399b595642df9e4e69d1eaa7c5c64d9d1edb7e4966 +c6ada4a4e32c0a581305a8b8aa5222ecee1a801d01d101cc01db0fb0687c07a0b4da2dd4d7d5ac854fe82f1f35c46fe7670b672f4f20b0312fa7e531e8d42571 +431018e4debde31710d8beb789c400054958030c5709096b90d783b27ad72fec1a23d302f0a0f420aa41681273b670b601ce2eba5bf9946bcd32275954ec8b33 +da4f6566666cfe6a1384a21f44eb02c6297a2aa9da81b115c203d905943d499c468e0800bdb59e0112f38c2e3c3e8f78f08951c1dbd7bf396fd53683d1eaf4ce +5ebdcda451e7c7840060ba93733b2070108ff7886149f4679026e140424945ddfd2a22d3c6c715cfeaab6a519e3f7726c6e9af2c9a106a68a616df65de29b1f0 +fb142233fc107f474239bc77eb272a95aaacac6cc70fdb376df844afd76e78431e13d3d84bb68200c205143ec829a42c5a6ff3c6db4b551a3d41772fe74e7a8a +ce60d0e98f2ef43a75ec90ef3e980bc3448b94c72ededa793a1b455193d198733b5ba9543e725812fd16a4c21a482096573c0ed35e80676ff875e7ea97c62a85 +280fe6e8692e2d145b0d4c45b918df5523bbcf304704e9cc122d6046e4bc29b5b78bcfbdb726a7be1932eab5cf866896c6293d1d7b2bac28b8b0c25ecf5fa77d +f01def8b0d2b6fd6f9036075f21217318fd9294931bfdbf5965f9a325cadd1bdb36117c1f2d18153a998ce7a698cafd160c8c9ce0a0c0a26d3c80c50900a6b20 +2199b0d84cb8bf0702c32997f62ae425712146866f133bbc8ee6a06e0fe6c4786ad638754e09e5603203edf29f0f90180eacbd1fe0a608f7d1c4cfe82d5b21b8 +b04204408f824d899c2f126d1213ff133539fe1133f773376be951c0e79cd8d1eb97ce24eeb3ebd8d52357f0787dbd5e7f3b2bb36bf20612030224610d245c21 +54584132a78afbf9fb7f39b871999cc2d56154d5359e136b792e423b44aa5fb78b5b8fc2301bd741eda053c1f7ef34393898b69fe6251ce7d4a9e06e67790010 +158f5da008f135c10b29b4e845b60a95e4b753d97e612f984ca66b190504d70678da9bb5f43442fded5913df7f6b1a719f6dbf5e3a7db3147ba3d3e9b2b332b5 +5a6db78626d19f4012d68041759dbca0a48aa083c49efdfd376bd62c503888f04540829e62beb15963b7ef7ce8a9543a4631145b5c16614403d1009503d62d6a +16f0f5aebe2f7c79c863cd4fbcfc460a760a58c9c582f11dc67af8200200a8980d489ff52fc17f7e157dfded964fff9dd9b699e67641599382a8d899ccb9d3e2 +1d9546eb4505d3e5f36296be3699b8cfd7bbcf5dcaaa00ad11fc98cec298eb89fe8b48f439c8bd8403066792b30e9f4db17696c5a0091a0e4a1ccbdf8855617f +9a083dcb7bceb142a266cf5b7eb0e89e76f7fecc205f2d8b03603a801900a6e12aec9950dd773bcbd66c383678d8f33ffd72fb9bbdfa826ac44483eced4d7416 +4e5218b5612c865b7f2c6042407a2e75efefcc8fb6f2eae4f6f317ad895fb7d7de25a0fd7647cea66093b73619273bc1ccb1011d5b840261efe23c9f1d1a8031 +636a7611419fe48c22a9bb93b3886d3018e44d8d2291182613630d1c9091ee8f85cadac6959bf63c9d7b65e696169559ad71e8c5afe7ca938f6c6e6033f17fa9 +c17a217a8d0efc5f7be702dd567ddf713daeaede4feb614bb2fc90e587e2f89d0025244be9c6ab40d696410bdd18e7ec71d642799df6f48c6dedb652a094aeb0 +6eac5947d7752b501a1ad2065ada24405e4e82e37712bfedf829c9d6cb926c499677150759f74afacb966cebaff0fb1c9d1ce7afebbfaeafe4af7fbfdffd3d3e +f74db569efd796d9512b8608db2433fb6fde3977db6e9a8bd4d947fce0b5e2a58a2758d17e7c0b8ac5533edb85cb97677d81b090bfac554514d288679e333dcb +f1fa39257a81a2d01c56de182492b4bb3ad335386973a63a1f83565957499bb1cc2508e22311999f9f8f2c47befae7b757949b9e7c2efda5a67ef6778eb72f06 +512963d4e6af3f7dff4ae18e442aadadddce25e0ee537e00ef53567c70eee22f7f7f2ed767112d7e96b84f3ff39887522bd6954055d4d74fe114be7e4ca450cb +de3cd213b776cb84efdc91d397efb9d5bfb3ee6af2c142903d3ce66d1b8dfd7452166b677473ceb29c1d989cf78916fc8130dfb6a40810821e4a48a35a3a79e5 +b13e266cce89d472c68a46d6b88bf7ccfdec40ef465d6abd4eb9a25614f35e6f6f6f8f755b2d3420cd0b40b0b2029d77be65ecd69cde6909b46c5b4d7462f358 +cbc962ca9479f58b0f443dec1d8cf5772fb748889acbaf7ee8fb0fb746b1e4f5b32f8ef02cd505ac044b6d7999ed5a14518f2dfbe9aa4a343c82db33349dfd56 +2bb4d4d00aaa3d6ef7acc3aed54181741e00829515380816c10afa9c730f7f8116d5e68a59e16092a6eb2f1d9490aa229f3d49487b3e2cfe9d6d376b39a2f7d8 +b52257d050f8be1d8b66522bf7107b87ed59ef14db90a94d1229a4bfe707205899e3707afa46a6b2df274b76e93b6fad0fac388331d844f4ce5d24c05a0e4793 +ced9dc2b699ce7f9bde392e3f666d4766cce6440473d72fd63ad42095628bc7471d496fd562b588ae9372579bc0c6e4a023901042b73d013abb60c25317b437d +92dbf3944871e3a62ef40c10fbdf909cf0eecdf5f9ae0f2e875d53aaed1b73044319a6dd33d016c8d452da2455995c0e63bef205c8c3ca1cf4c4aa2d83cb233a +fb79e863bafa897f7c59deb6b06721c25fdbaeb860361608f9bceea199ecb75aa1c55aca5891adb90c08c8396061654ee2ec969cf09bb1eb87478eec6e5e3468 +93dc17a44cc0d7de111e3c223eebdbeb0989737db2eb662580d5b37182b5bda288b1027ddff308b0b032c4331fe8eabf9cebb388e20d898585157ff50dc5d133 +64bc871a0cb18e9d251ffc5bc5dbadda63ee5bf251ad286acb754b91c885e10d0b60551a95f1ffe572b962715e5e998f27606165486b47ffd2d2ba27746d12c7 +276a8c52cdff1e3efbc27f872c25e1024564c6c1ede8e399f4dca1c5da4bb6e2ec5f2227b0d92c6b996e64d2e95bd8981a1a8554a453d0bad650fe2004b0f208 +10ac0cf10716eedcd3b0ccdaf4a07b24b2fcce892eeadf54076cafd0aba251e432276b8758edf14686420b2eb65266fee47511b6d0c26259d6f3721bc86230f4 +eea95ec4019f6830abe429a7317b3d1e995820970846a69c7b9acaa55269f6a7545aa46234cf4adb2610c00a28cdc99c70383ceb70d8ed36b7cbb579afd23b3c +f3e48b87533d4b19073ffde67d4a298e77e54f748e7ceb95a3a99e2579dc9f3f7d3f8fc8717ef9f6fa7a08bae7116061650e4110bac242ea115c5c74381c9b54 +faff9bb3a388674d852a865a49a452b91c8bcee523efa2ccab5ab39ea15672b97ceb133825920d30dc802d03046b0320f9fccd9bd6d93bf226e2d9ebeacc8c95 +a2a2224caa4cba0751c5343bb79733560cc662a54ab5c6cd2391c8873dc387df3f3f3c6e77cc79ec4e8f7dceebf6faffefe93fad2a376ab45abbd32f970a94e0 +f15d5b806061cdd252e44c27baf55dc2ec063c1c1cf7bcbf7b007517b5aaa480b1225ddb7888de81f1fd3f3f72f8bdf3d30ea627aed72a25246b627c9c7abcfc +e6998ba38e671ebeb3ca6cd268356be9100fe00f0816d674f58fa1471c5bf434ef8f24f9023caa4c5a3b06107751092eb7544b0bb78b2512225d8f17ffc2e273 +ff79e85f7ffa4e289c3ceb3dd66a997ae9f7da06ddf30b8f7ef7c0771ebe433a322c93cb4da612398cf9ca73200f0b6b4eb6a192e98b0b550a096d98283ef7bc +d065e1b516239fc70c60a1376cede8bfe1debffbde8f7f9d4aad58d11ba6577de1aec1694aada82fc6a6e65e7aa3757979d9e3767777754e4e4ce4fac2005901 +828535e8ea9fa684d90d697fedb70cf4d489c66a236305edc99eed1afcec232f8c4ca469d860f92829f4838e91d8e2f1b6beeed1abcee3f0d0e0d4e4ba3b7601 +f80082852f945d80b6536206450c4c025894ef76be770471404d899a79e6a9a5b6fde2c8e71e79c1eb5b40bf688142a295472b25297ff06427edd6eae1131763 +5f539ae583d184790b0816bef48d4c399c5ec4018cd90d048f27c463dcdeb9ee21c404790e875d5e44735d4522118f97bc7e7bdae1facc975f7079fd695fb4d9 +5ab292b31ef307635c189a8ca5b3537f06464786737d85800c01c1c21774004bab92a965f436293219265526e833af2e2b12f169f1758479f5d8d33f9975a154 +3b465dc5d576f2f1fee00a76a777296e6099d3e90cc28caffc04040b5f4e20c3404d1f191431f0e93a800ebd3556336b1b5379b2475b7b0ebf7f7e8d2f5a698a +e67025fa83ac2b5695679ea6501eaf27d71709c804102c7c410fa6af4b6893b2f6f1ee9b4a281c4e933b56b6d6b1a9cfee3f98749d47706b2d468376d523968a +8545ca68a655f7d00cc31f5c4140d26c3ab0b0f214c8c3c2949109fbf8cc1ce280cae284362912090b03da2f8cfa91cd1518012c8140c0e727692b786978f254 +7b3f63d15454f0d05dd73556a829cd7ae4bb6fc5d69bac262e27fad7b7c258a0534966e66861750e872de071e25bdc238ac9019c010b0b53d05e955c2a2a54d0 +1244a5d804b04e20fb1a961bb532112dbe9ecabc7aeb0873a8d70d0d152f3df1e99dd53a4aad7c81e0d0e4aaa0571aaecab75848fef567ae677ca35ea3640ce4 +e070e1939f97c0db8629e8b875b3b584d926050f7f90952e65b4d96a62aca43af383f4298406adf2897bafe77d2434bdc333f156527c62577509736ab4d5cc1c +ef4af248169087806061cac97674065642000b8f887b241269ede8471c605d5b006be8f24c571fad1471dfde3a9160d5348b6f9a2ce49306f56ad7d04842c724 +8b89296102219416e62520583832e3700f8ca25a1d549b6889971c0e47b211fdedb2a7bb7f1c9d336531d2476c9164d2115b878eb631567654d3aca4f8b114f5 +d5c5bc38172fb101bcc5486b0241f9ce422116096bc07a01c1c211745d8b48401a0a983db0381c2cde4a74e84daf55aae8c58fa9ee6c7ed83dc4581192ab3fe0 +4230dc7f7936f6df864a5aa1cf2fdfeba1bd845454a167e6a9c260fa3c058b4f39c0001d066aa82921e831634cfc4156ba49422d5666f163aa887b67df186365 +c2b16ab85d1ab5c7974057c775aa3974fc422f7d62c5de9d35f4701f4b8a4dbc0f582f2058389246b02a99cd023189b8478b1f9116d6367342f16332c1a2f6b9 +3c35cb58dc7fb035364bb57b68d55fe611dc125dd41d8e44960f1ced7ef9c069c637de58c75449053499c95b200f0b3b9c1e5fefe038e2806a13adf51d9bcd5e +63ebbbcd666074da368bca20678cd822084294acf8d1eb5b082f317bc85c189afcd2f3873e7f6b73a94ed235b02a5895a585c3e30ecae67afb74dfd834b3a59f +44c4af34d23491f29d154a250bc84f40b0b0e3747b3f22ad91e411a684d6779844644e200dc358378518a9466c1104875a4f1c8f3261733eff93df31167b0626 +1eff7eca2e570fde7d238fee4528552a4c2e179001e01262073ae2bebdd24812b4770d137f9095ae96a8c55abac6e2479180af556d80cd58a896dfb2a38cb188 +49c37b203340b0b0234d00ab8ad9fa0ea3883b526aeb2c8933e253aa52a951c3ca9abffcec4d5c36ad4db3502452823f98cf8060e1852fb0d8711135d7cb9a90 +c68d49006b6cca319610298fc7524c4b86e270b988115b8d35a5599ecf1d7b1a765432e75c984c25981430019901828517673a07103dcbb95c4e5921ed975c24 +16a76a7db7c5a0fdc15837851832a914a11d5fbc7b7736cab27767cddfec6be2d273d328db4aadd900c30dc82120587881f6076bcaf502921630c6278095ae84 +b084211fe8ee5db596e207eedc95d999ec6aaa7cecdeebd9f46a6792cfafa8accaf54502b205ee12e205da4e69ac62b6bec3298085ecde6561961fa76d37f8dc +57ef1f1ab7a17b3f30100bf98f7ce1e65ddb740ce38c3242b76dab25492878ce7bc0c2c288c560e85c42494a3cd6c4b1a978ccf5b2cdbafbd3143f26e48ea59b +4a2f12f05f7de12bb7de54bf9613a036dcd352fdc3a7fee4a65aa65a090482ed75f594ef9ceb8b046c00606161445bef70603165eb3bea77d2cc687d27149224 +3ffdbe9bcfa9f6fec4b4a91857ba29d0124429b55a4bf1a34c227ced7b8ffeea58db8bfff3f6d9aec1a4e9697aad72df271bf7d4174b054936d468b5e5e68ab4 +235a817c01de488c40fb8366935622a0bd5f98f44466a54b6868a836f1b88c00d63a0cc34fff4113f59871b88eb5768f4eccd8e73c5c2e47a3946ae442b98454 +89a369a689df2596484acbca140a4862b8a600c1c20874a678734d42eb3b3cfc4156546a513db0ea128b1fd71f7ad3a915f7de110dc37bbd1ebbcde6b0db43a1 +50e2619431a554a9b43a9d5cae800c866b0f102c5c585a8a9ce958efec062c8a785d5e7f57ff18e2809a1266004b962e8085807227a94759b9d9eff3f9037e4a +b69623110e874b92a45024120a85a053d7302058b8d0d937e6f1051007541868560949f205022cda66b676a08a1f7904b734aef8f183f6e15f9fb824fef1079b +7a4a7b5aaa1eb87d8746abc5e412011b0508162ea03b491517aa1462da5d797ca610a2131a6a2d4692b79a3b76b26bac73606ab34fe9533b2c63a323d4432a93 +69345ab54683497a2d902590d6800be85e9dcd09adefe4d804b0d082153f1e8215ed5f3ccdda7c2a3e6ac4ecf578860607dadb3eccdde5013612102c2c88b6be +43c6ad6b135bdfe1718bd0bfb0d87e610471404d5cf1e3d4acd7e1f2a7dd334bb405328d8c96ed9136e70bc81740b0b0e0d2f0e4accb8b38c062a0c5d7091e4f +28c2628cc2d9aea160289cea590e871d3f36b57b702bccab166b2963059fdba9409680606101daabd2aa646a19a3f51d2e6353d1195835e57a615cf163e23c9b +cd2071061a3ef13e204b40b0b0206de530439ef029213c95a67b17adf8b17b702b048bd18899cbe58ac5924c3703f002040b0bd082b53db1f51d1e012cca193c +db358838605bd96af1e39cc73fe9f0a4df343b1452914e41ef63838d350a640f0856ee191eb74dcccc210e48623248b03019da2f8cf817828803ccfa5561dd1a +f3aa795b2987b3a646cc403e027958b9079dd020978a0a15b4b1a9526c4c06742d91b9582b15ae7ec09c1e7fadb988e4a7acd65e5e5eeeb8349698834a099056 +25d36b146c0e7bdae19e7178183375a8abf14f5fbaaba9521f08f8481e419954e170c8efbf7a3b12136b14d81040b072cfc9b634b31b182643be04b01ae9c58f +77efd9f6e52fdeb6b41471d8edc1e022e3e0f052e45f5e3dce502b834e75cfcdf537d51b8524117f645bbffdfb3f3b4629e0ca0aa574cfbef2db179fdc57a412 +89c59248642910080804023e5f100c0525d2948d9881bc03042bf7a0878f621bc0a2a4e734f2cc6bcb99c58f1aad4e2814969695b9ddee59c76af532a5385f7f +e9ada3e768e1b0fa2ae3df3fb4375eaa56e093bc4f5d57a990891efdce1bb145af2fb0ffe0b9a7fe6c97d71b0d932995aa6aab752d1d6c80fc02042bc74c3b5c +8363a8e04e35637603878389c9d0dd7fd93d8f2a7e64e48e458b938551df96f2e01457883df5fc8f0e1d3d4bd33e8356f90f0fed15d0d58adaa1a4b44cadd150 +17a1767bdd375e3eecf2aea6a19e6cef9fbcab457fa573bcd339373a325c566ecef545023618f8139463d05e9558c837a869ad3229b5c2c4704087de0c3aa552 +422f7e4c6118f68f4c7dfb8707198bf7fc612343ad4422517d639356a75bf9f129d54b9c873ae9985ffd7a62627e7e9e055c5b60f1d1ff38838e5b37549bb8b8 +06b0d285de98c58fa9eed6fdf3bf1f481c4cdf68a1b993943c55d758e39bb29f3cdf97581b30eba6d5fdd8a6b722b11ed84a40b0720cba49434362eb3b3c0258 +d1e247a485b5ad3ca1f8319960d966dd878eb525aefb1668cdf90ad4eaf852a4c560e85b2f1f48fc2e8594763bd5e7030beb5a03042b9738ddf3178626100754 +25ce6ec0636c6affe8b47d0e95055a594ccb1d23084294acf8f157c7da96962289ebbf38d61b8e5b97c685ede65cf3f73dfee2f10f9308bd5a4613ac44c30dc8 +7720e89e4b4eb5a35adf913ca2444b4b10154b2489819b9c809ebea5564a19fd1228f32a69ee586b8a26abbf3fdd3b3066bbef9626b584a7940af892b9197768 +7c66eedd139dafbf7d3ae9a80e3e4930465d105cf8785f6bc03b9a4bd071ebbaca621e419fdd80873f98f6cc9bada50c794a75e663538e549b8c4e3a9e7de5b7 +6b3fa53d2dd5021eed720945c2b57f3b9017804b984b4eb4a12b8799012c7c22eee89b9b756bee9730ed706dd429fdd17516c68a1c8f9ef7c00602829533e6fd +0b1d17471107c4b7be5b418647008b328bc6a6661107300258941b2b4951fc682a526fc829ddd45c6535d1e489c3e12855aa4cf7033005042b679ced1a444485 +b95c4e59212d4154241613783426472734c824c24225ad5f82549ab2f8b1c66c60658d542cfc8bbb5a188b5a9d0ee6a75e7b8060e50c74dcda6a3608485a7c1d +9fb1a9e80056534d0997c3189b9af2cc6fdfd398e5c9f049e29987ef54cb6849aa944d575c6cca744b005f40b07206fad7beb1cac858c1a74d0a5a6aeb2dfa84 +334fe9c9ee6ea9d977730b2b53344ae9735fd957a61333d6cbcd1588b61040fe0282951b1683a173dd438803ac71adef56c044b06cb3ee0164f163157d6c2a87 +c341cf8078faf1cf97e8338964eddd59f383affdb145cfacac2c3699287f30d7d709d814c0c9cf0d6dbdc30b8ba154cfb2d96c7311ed975c2014c617a6e49093 +ed7dcbcb2973c7847cd258404b869248d2143f1a74aa77ffeba907bffe6fe8b6abf17ca2c1f2c06d8da55aa661455db7d2b272bd6103e262009eb0111f3e60f3 +98b63bdb7b065c2ee75238896c71d86c133d6554a72baca8acccf55947199bb4775f1af2b85d4be124c3727804d740172c63b1a9a4b4742d3b1f6dedf9d11b47 +4e9eef4f3a40482420ad15865d0de69dd5850a71929b0f1289c45c61c1a49505b0498060e512eae2bb5c2e87dd36eb702c21eb482c955558b9399148c4e574da +6db6b9b959ea6bc491d6da5aa5721de905d475e8ed1f1b1a9b9cb6cdfa0241219f10f1797231a996f3537559a544ca60341614a83169c40a6c1e20585840fd96 +c6bad92585f20731e92ab3de33e7f3f999e908b5edacc34ee1f578123fa52b8dede572855aad1689c519ec0fe423205800ee5016dce2e26228188c9a726c4aaa +08f20a604f7d0c01c10200206fc0d1cb000000480a0816000079030816000079030816000079030816000079030816000079030816000079c3ff033966da2f4a595c5d0000000049454e44ae426082}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw14115\pich7763\picwgoal8002\pichgoal4401\wmetafile8\bliptag-992432282\blipupi71{\*\blipuid c4d8af66daa9b8284dc64b16077915b5} +010009000003e60302000000c103020000000400000003010800050000000b0200000000050000000c0226011602030000001e000400000007010400c1030200 +410b2000cc00dc0090010000000025011502000000002800000090010000dc00000001001800000000004007040000000000000000000000000000000000ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f7f7f7efefeff7f7f7f7f7f7ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffefefefd6d6dec6c6c6cececec6c6c6c6cecec6c6c6cececec6c6c6cececed6d6d6e7e7eff7f7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdededec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6 +c6cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffefefefdededec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6f7 +f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeded6cebdb5b5a59cad9c94b5a5 +94bdada5bdb5adc6c6c6c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ceced6d6eff7f7ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffff7efefd6c6bdbdb5adbdb5adb5ada5bdb5adb5ada5bdb5adb5ada5bdb5adb5adadcececec6c6c6c6cecec6c6c6cececedededeffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef +e7e7cec6bdbdb5adbdb5adb5ada5bdb5adb5ada5bdb5adb5ada5bdb5adbdb5adc6cecec6c6c6cececec6c6c6c6cecee7e7e7ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffd6cec69c7b636b42216339106331106339106331106339106331106339106b39188c634aa59484 +c6bdbdc6c6c6cececec6c6c6c6cecec6c6c6cececec6c6c6d6d6d6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce6331086339106331 +08633110633108633910633108633110633108633910bdbdbdc6c6cec6c6c6c6c6cec6c6c6ceced6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcec6b56331086331106331086339106331 +086331106331086339106331086b3918c6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff7f7ef84634a6331106331086339106331086331106331086339106331086331106331086339106331086331106331088c6b4ab5ada5c6c6cec6c6c6c6 +c6cec6c6c6c6c6cec6c6c6c6cecee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b4218633110633910633110633910633110633910633110 +633910633110b5a59cc6c6c6cececec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efef633910633110633910633110633910633110633910633110633910633110 +bdb5adc6c6c6c6cecec6c6c6cececec6c6cefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efef73523163391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339108c6b52c6c6bdc6c6c6c6cecec6c6c6cececec6c6c6c6ce +cee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff84634a6331106331086339106331086331106331086339106331086331109c846bc6c6cec6c6c6c6 +c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff7b5231633910633108633110633108633910633108633110633108633910a58c7bc6c6cec6c6c6c6c6cec6c6c6c6 +c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffff94735a6331106331086339106331086331106331086339106331086331106331 +086339106331086331106331086339106331086331106331086339106b4221bdada5c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffb59c8c633110633910633110633910633110633910633110633910633110846342c6c6c6c6cecec6c6c6cececec6c6c6e7e7e7ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffa58c736331106339106331106339106331106339106331106339106331108c6b52c6c6c6cececec6c6c6c6cecec6c6c6efefefffffffffffffffffffffff +ffffffffffffffffffffffffffdecec6633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +633910633110633910633110633910633910bdb5adc6c6c6c6cecec6c6c6cececec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6cebd6339106331 +08633110633108633910633108633110633108633910633110c6c6c6c6c6c6c6c6cec6c6c6c6c6cecececeffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5a56331106331086339106331 +086331106331086339106331086331106b4218c6c6c6c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffad947b +63310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863 +39106b3918bdbdb5c6c6c6c6c6cec6c6c6c6c6cec6c6c6dee7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff633910633910633110633910633110633910633110 +633910633110633910b5a59ccececec6c6c6c6cecec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efe7633110633910633110633910633110633910633110633910633110 +633910bdb5adc6cecec6c6c6cececec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffff8c6b5263391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339108c6b4acececec6c6c6c6ce +cec6c6c6cececec6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff846342633108633910633108633110633108633910633108633110633108a58c73c6c6c6c6 +c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff7b5231633108633110633108633910633108633110633108633910633108ad9484c6c6c6c6c6cec6c6c6c6 +c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffff7b52316331086331106331086339106331086331106331086339106331086331106331 +08633910633108633110633108633910633108633110633108633910633108633110633108633910b5a59cc6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffad947b633910633110633910633110633910633110633910633110633910846342c6cecec6c6c6cececec6c6c6c6cecededee7ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff9c846b6339106331106339106331106339106331106339106331106339108c7352cececec6c6c6c6cecec6c6c6cececee7e7e7ffffffffffffffff +ffffffffffffffffffffffffff8c634a633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +63391063311063391063311063391063311063391063311094735ac6c6c6cececec6c6c6c6cecec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6bd6331 +086331106331086339106331086331106331086339106331086b3918c6bdc6c6c6cec6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5a56331086339106331 +08633110633108633910633108633110633108734a21c6c6c6c6c6cec6c6c6c6c6cec6c6c6dededeffffffffffffffffffffffffffffffffffffffffff9c846b +633108633910633108633110633108633910633108633110734a29ad9c8cada59cb5b5add6cecee7ded6cebdb5a5847363391863391063310863311063310863 +3910633108633110633910c6c6c6c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7633910633110633910633110633910633110 +633910633110633910633110bdada5c6c6c6c6cecec6c6c6cececec6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7de633910633110633910633110633910633110633910633110 +633910633110bdbdb5c6c6c6cececec6c6c6c6cecec6ceceffffffffffffffffffffffffffffffffffffffffffc6ad9c63391063311063391063311063391063 +31106339108c6b52c6c6c6c6c6c6c6cecec6c6c6efefeffffffffffffffffffffff7f78c6b52633910633110633910633110633910633110633910bdada5c6ce +cec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5a39633910633108633110633108633910633108633110633108633910a58c7bc6 +c6cec6c6c6c6c6cec6c6c6c6c6ceefeff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff6b4221633110633108633910633108633110633108633910633108633110ad948cc6c6cec6c6c6c6 +c6cec6c6c6c6c6cef7f7f7fffffffffffffffffffffffffffffffffffff7f7ef633110633110633108633910633108633110633108bdb5adc6c6c6c6c6cec6c6 +c6c6c6ced6d6deffffffffffffffffffffffffffffff8c634a633910633108633110633108633910633108b59c94c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffad947b6331106339106331106339106331106339106331106339106331108c6b4ac6c6c6cececec6c6c6c6cecec6c6c6e7e7 +efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff9c7b63633110633910633110633910633110633910633110633910633110947b63c6c6c6c6cecec6c6c6cececec6c6c6efefefffffffffff +ffffffffffffffffffffffffffffffff9c7b63633110633910633110633910633110633910bdb5b5c6cecec6c6c6cececec6c6c6cececef7f7ffffffffffffff +ffffffffffffe7d6ce633110633910633110633910633110633910a5947bcececec6c6c6c6cecec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcebd +ad6331106331086339106331086331106331086339106331086331106b3918c6c6c6c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdad9c6339106331 +08633110633108633910633108633110633108633910734a29c6c6cec6c6c6c6c6cec6c6c6c6c6ced6d6deffffffffffffffffffffffffffffffffffffffffff +e7e7de6b3910633108633110633108633910633108a59484c6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffffffffffffffffff73422163310863 +3910633108633110633108b5a594c6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef633110633910633110633910633110 +633910633110633910633110633910bdadadc6cecec6c6c6cececec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ded6633110633910633110633910633110633910633110 +633910633110633910bdbdb5cececec6c6c6c6cecec6c6c6ceced6ffffffffffffffffffffffffffffffffffffffffffffffffb59c8c63391063311063391063 +3110633910734a29c6c6c6c6c6c6c6cecec6c6c6cececec6c6c6ceced6efefefffffffffffffffffff6b4221633910633110633910633110633910bdb5adc6ce +cec6c6c6cececedee7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5231633108633110633108633910633108633110633108633910633108a5 +9484c6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff6b4221633108633910633108633110633108633910633108633110633108b5a594c6c6c6c6 +c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffefefefdedee7d6d6dedededed6d6d6dedede846b526339106331086331106331086339107b5a39c6c6bdc6c6 +c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6b5ad9c63391063310863311063310863391084634ac6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffa5846b6339106331106339106331106339106331106339106331106339108c6b52cececec6c6c6c6cecec6c6c6cece +cee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff947352633910633110633910633110633910633110633910633110633910947b63c6cecec6c6c6cececec6c6c6c6cecee7e7e7e7e7 +e7cececec6cecec6c6c6cececec6c6c6c6cecec6c6c6c6c6c6846b52633910633110633910633110633910734a29ad9484c6bdbdc6cecec6c6c6cececec6c6c6 +c6c6c6ad9c94734a216331106339106331106339106b4218bdbdb5c6c6ced6d6ded6d6d6cecececececedededececed6ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffc6b5ad6331086339106331086331106331086339106331086331106331086b4221c6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6deffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbda5946331 +086331106331086339106331086331106331086339106331087b5231c6c6c6c6c6cec6c6c6c6c6ce9484737b5a39845a42846342845a42846342845a42846342 +845a42846342845a42846342633110633910633108633110633108633910633108633910734a21846342845a42734a2963311063391063310863311063310863 +3910633108b5a594cec6c6c6c6c6c6c6c6d6d6d6cececec6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7e7633910633110633910633110 +633910633110633910633110633910633110bdb5b5c6c6c6cececec6c6c6c6cecec6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce633910633110633910633110633910633110 +633910633110633910633110c6c6bdc6c6c6c6cecec6c6c6a59c8c63311063391063311063391063311063391063311063391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331109473 +52c6c6c6cececec6c6c6c6cecec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a2963311063310863391063310863311063310863391063310863 +3110a59484c6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff633918633910633108633110633108633910633108633110633108633910ad9c94c6 +c6cec6c6c6c6c6ceb5b5b56331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331 +086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106b4218c6c6c6c6c6c6c6c6cec6c6c6c6c6ce +d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff9c846b63311063391063311063391063311063391063311063391063311094735ac6c6c6c6cecec6c6c6cece +cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff946b526331106339106331106339106331106339106331106339106331109c846bc6c6c6cececec6c6c6c6cece734a296339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +633910633110633910633110633910633110633910633110633910633110633910bdb5adc6cecec6c6c6cececec6c6c6cececeffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffbdad9c6339106331086331106331086339106331086331106331086339106b4221c6c6c6c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad9c +846331106331086339106331086331106331086339106331086331107b5a39c6c6cec6c6c6c6c6cec6c6c68c6b5a633108633110633108633910633108633110 +63310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863 +3910633108633110633108633910633108ad9c8cc6c6c6c6c6cec6c6c6c6c6cec6c6c6f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7de633110633910633110 +633910633110633910633110633910633110633910bdb5b5cececec6c6c6c6cecec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6c6633110633910633110633910633110 +6339106331106339106331106b3910c6bdbdc6cecec6c6c6cecece9c8c8463391063311063391063311063391063311063391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +1094735acececec6c6c6c6cecec6c6c6cececee7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73422163310863391063310863311063310863391063310863 +3110633108ad9c8cc6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff76b3918633108633110633108633910633108633110633108633910633108b5 +a59cc6c6c6c6c6cec6c6c6bdb5ad6331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331 +08633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108734a29c6c6c6c6c6cec6c6c6c6c6ce +c6c6c6dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff94735a633910633110633910633110633910633110633910633110633910947b63c6cecec6c6c6cece +cec6c6c6c6cecee7efefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff8463426339106331106339106331106339106331106339106331106339109c8473cececec6c6c6c6cecec6c6c6734a +29633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +633910633110633910633110633910633110633910633110633910633110633910633110c6bdb5c6c6c6cececec6c6c6c6cececececeffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffbdad9c633108633110633108633910633108633110633108633910633108734a29c6c6c6c6c6cec6c6c6c6c6cec6c6c6dededeffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffad9484633108633910633108633110633108633910633108633110633108846342c6c6c6c6c6cec6c6c6c6c6ce84634a633110633108633910633108633110 +63310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863 +3910633108633110633108633910633108633110ad9c8cc6c6cec6c6c6d6d6d6e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ded6633910633110 +633910633110633910633110633910633110633910633110c6bdbdc6c6c6c6cecec6c6c6cecececececeffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6bd633910633110633910633110 +633910633110633910633110633910633910c6c6c6c6c6c6cececec6c6c6a59c8c7b5a398c6b4a8c634a8c6b4a84634a8c6b4a8c634a8c6b4a84634a8c6b4a8c +634a8c6b4a84634a8c6b4a8c634a8c6b4a84634a8c6b4a8c634a8c6b4a84634a8c6b4a8c634a8c6b4a84634a8c6b4a8c634a8c6b4a84634a8c6b4a8c634a8c6b +4a84634ab59c8ce7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b391863391063310863311063310863391063310863 +3110633108633910ad9c94c6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f763311063311063310863391063310863311063310863391063310863 +3110b5ad9cc6c6cec6c6c6c6c6cec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefe7e7e7efefefefefefffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff94735a6331106339106331106339106331106339106331106339106331109c846bc6c6c6cece +cec6c6c6c6cecec6c6c6efeff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff846342633110633910633110633910633110633910633110633910633110a58c7bc6c6c6c6cecec6c6c6cece +cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f7ffffdededececed6c6c6c6c6cecec6c6c6cececec6c6c6c6cecec6c6c6cececedededef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffb59c8c6331106331086339106331086331106331086339106331086331107b5231c6c6cec6c6c6c6c6cec6c6c6c6c6cedededeffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffa58c73633910633108633110633108633910633108633110633108633910846342c6c6cec6c6c6c6c6cec6c6c6c6c6cedee7e7ffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7efc6b5adb59c8c9c8c73a58c7bad9c8cbdada5bdb5b5c6 +c6c6c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce633110 +6339106331106339106331106339106331106339106331106b3910c6bdbdc6cecec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6b5633110633910633110 +6339106331106339106331106339106331106b4218c6c6c6cececec6c6c6c6cecec6c6c6d6d6deffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffcec6b58c6b4a633910633910633110633910633110633910633110633910734a29ad947bc6bdbdcececec6c6c6c6ce +cec6c6c6cececec6c6c6c6cecedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b391863310863311063310863391063310863 +3110633108633910633108b5a59cc6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efef63391063310863391063310863311063310863391063310863 +3110633108bdb5adc6c6c6c6c6cec6c6c6c6c6cec6c6c6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f79473 +526339106331086331106331086339106331086331106331086339106331086331106331086339108c634ac6bdb5c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ce +cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c6b4a6339106331106339106331106339106331106339106331106339109c846bcece +cec6c6c6c6cecec6c6c6cececeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff7b5231633910633110633910633110633910633110633910633110633910a5947bc6cecec6c6c6cece +cec6c6c6c6cecef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c634a633910633110633910633110633910633110 +6339106331106339106331106339106331106339106331106339106b3918b59c8cc6c6c6c6cecec6c6c6cececec6c6c6c6cececececeffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffb59c8c633108633910633108633110633108633910633108633110633108845a39c6c6c6c6c6cec6c6c6c6c6cec6c6c6dedee7 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffa58c736331086331106331086339106331086331106331086339106331088c6b52c6c6c6c6c6cec6c6c6c6c6cec6c6c6e7e7e7ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff9c846b63391063310863311063310863391063310863311063310863391063310863311063310863 +39106331086331106331086339106331088c6b4ac6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cecececeffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6cec6 +633910633110633910633110633910633110633910633110633910633910c6c6c6c6c6c6cececec6c6c6c6cecececed6ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcebdad633910633110 +6339106331106339106331106339106331106339106b4218c6c6cec6c6c6c6cecec6c6c6cececed6d6d6ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffe7ded66b39106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110947352c6c6c6c6cecec6c6c6cececec6c6c6c6ceced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63311063311063310863391063310863 +3110633108633910633108633110b5a59cc6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe763310863391063310863311063310863391063310863 +3110633108633910b5adadc6c6cec6c6c6c6c6cec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffad947b6331086331106331 +0863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310894735ac6c6c6c6c6ce +c6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c634a633110633910633110633910633110633910633110633910633110a58c +7bc6c6c6c6cecec6c6c6cececec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7b5231633110633910633110633910633110633910633110633910633110ad9c8cc6c6c6cece +cec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffff84634a633910633110633910633110633910633110633910633110 +633910633110633910633110633910633110633910633110633910633110633910633110633910633110b5a594c6c6c6c6cecec6c6c6cececec6c6c6d6d6d6ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffad947b633910633108633110633108633910633108633110633108633910845a42c6c6cec6c6c6c6c6cec6c6c6c6c6ce +dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff9c7b636331106331086339106331086331106331086339106331086331108c6b52c6c6cec6c6c6c6c6cec6c6c6c6c6cee7e7e7ffffff +ffffffffffffffffffffffffffffffffffffffffff734a2963310863391063310863311063310863391063310863311063310863391063310863311063310863 +39106331086331106331086339106331086331106331086339106b4221c6c6c6c6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d6cebd6331106339106331106339106331106339106331106339106331106b3918c6c6c6cececec6c6c6c6cecec6c6c6d6d6d6ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5a5633110 +633910633110633910633110633910633110633910633110734a29c6c6c6c6cecec6c6c6cececec6c6c6dededeffffffffffffffffffffffffffffffffffffff +ffffffffff6331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910a58c7bcececec6c6c6c6cecec6c6c6cececedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef63391063310863391063310863 +3110633108633910633108633110633108bdada5c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7de63391063310863311063310863391063310863 +3110633108633910633108bdb5b5c6c6c6c6c6cec6c6c6c6c6cec6c6cefffffffffffffffffffffffffffffffffffffffffff7f7f76339106331086331106331 +08633910633108633110734a29ad9484b5ada57b5a426331086339106331087b5a39ada59c9c8c7b734a296331106331086339106331086331106331086b4218 +c6c6bdc6c6cec6c6c6c6c6cec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5a396339106331106339106331106339106331106339106331106339 +10a58c7bc6cecec6c6c6cececec6c6c6c6cecef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a21633910633110633910633110633910633110633910633110633910ad9c8ccece +cec6c6c6c6cecec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffff6339106339106331106339106331106339107b5239c6c6c6c6c6c6 +c6cece947b6b633910633110633910633910c6c6c6c6c6c6c6c6ce948473633910633110633910633110633910633110bdad9cc6c6c6cececec6c6c6c6cecec6 +c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffad8c7b6331086331106331086339106331086331106331086339106331088c6b4ac6c6c6c6c6cec6c6c6c6c6ce +c6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff9c7b63633108633910633108633110633108633910633108633110633108947b63c6c6c6c6c6cec6c6c6c6c6cec6c6c6efefef +ffffffffffffffffffffffffffffffffffffffffff7b5231633108633910633108633110633108b5ada5c6c6c6c6c6cec6c6c6ada59c63310863311063310863 +3910b5a59cc6c6cec6c6c6c6c6ce9c847363311063310863391063310863311094735ac6c6cec6c6c6c6c6cec6c6c6c6c6cedededeffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffcebdb56339106331106339106331106339106331106339106331106339106b3918c6c6c6c6c6c6c6cecec6c6c6cececed6d6d6ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdad9c +633910633110633910633110633910633110633910633110633910734a29c6cecec6c6c6cececec6c6c6c6cecedededeffffffffffffffffffffffffffffffff +ffffffffff94735a633910633110633910633110633910bdbdbdc6cecec6c6c6cececec6bdbd6b3918633110633910633110a58c7bc6c6c6cececec6c6c6c6ce +ce7b5239633910633110633910633110734221c6c6c6c6cecec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efef63310863391063310863 +3110633108633910633108633110633108633910b5ada5c6c6cec6c6c6c6c6cec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ded663310863311063310863391063310863 +3110633108633910633108633110bdb5b5c6c6cec6c6c6c6c6cec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffbda5946331086331106331 +08633910633108bdb5b5c6c6c6c6c6cec6c6c6c6c6ce735239633910633108633110846342c6c6cec6c6c6c6c6cec6c6c6a59c8c633108633110633108633910 +633108b5ada5c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5a396331106339106331106339106331106339106331106339 +10633110ad9484c6c6c6cececec6c6c6c6cecec6c6c6f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734221633110633910633110633910633110633910633110633910633110b5a5 +94c6c6c6c6cecec6c6c6cececec6c6c6ffffffffffffffffffffffffffffffffffffffffffefe7e7633910633110633910633110633910a58c7bcececec6c6c6 +c6cecec6c6c6947b6b6331106339106331106b4218c6c6c6c6cecec6c6c6cececebdbdb5633910633110633910633110633910a58c7bcececec6c6c6c6cecec6 +c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff9c846b6331106331086339106331086331106331086339106331086331108c6b52c6c6cec6c6c6c6c6ce +c6c6c6c6c6cee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff947352633910633108633110633108633910633108633110633108633910947b63c6c6cec6c6c6c6c6cec6c6c6c6c6ce +efefefffffffffffffffffffffffffffffffffffffffffff7b5a39633910633108633110633108734a29bdbdbdc6c6cec6c6c6c6c6cea59c8c63311063310863 +3910633108bdadadc6c6c6c6c6cec6c6c6bdbdbd63310863391063310863311063310894735ac6c6c6c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffcebdad633110633910633110633910633110633910633110633910633110734221c6c6c6c6cecec6c6c6cececec6c6c6dededeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +bda5946331106339106331106339106331106339106331106339106331107b5231c6c6c6cececec6c6c6c6cecec6c6c6dee7e7ffffffffffffffffffffffffff +ffffffffffffffffbda5946331106339106331106339106331108c6b4ac6c6c6cececec6c6c6c6bdbd6331106339106331106339109c8473cececec6c6c6c6ce +cea59c8c633910633110633910633110633910734a29c6cecec6c6c6cececec6c6c6c6cecee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7e763391063310863 +3110633108633910633108633110633108633910633108bdb5adc6c6c6c6c6cec6c6c6c6c6cec6c6ceffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce63311063310863391063310863 +3110633108633910633108633110633108c6bdbdc6c6c6c6c6cec6c6c6c6c6cecececeffffffffffffffffffffffffffffffffffffffffffe7dede6331106331 +086339106331086331106331087b5231ad9c8cc6c6c6c6c6c67b52316331086331106331088c6b52c6c6c6c6c6cebdbdbd734a29633108633110633108633910 +633108633910c6c6c6c6c6cec6c6c6c6c6cec6c6c6e7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a296339106331106339106331106339106331106339 +10633110633910ad9484cececec6c6c6c6cecec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b39186339106331106339106331106339106331106339106331106339 +10b5a594c6cecec6c6c6cececec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffff84634a633910633110633910633110633910633110 +633910633910845a42734a296339106331106339106b4218c6c6c6c6c6c6ada59c633110633910633110633910633110633910633110c6c6c6c6c6c6c6cecec6 +c6c6cececee7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff9c7b6363310863391063310863311063310863391063310863311063310894735ac6c6c6c6c6ce +c6c6c6c6c6cec6c6c6e7efefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff8c6b526331086331106331086339106331086331106331086339106331089c846bc6c6c6c6c6cec6c6c6c6c6ce +c6c6c6efefefffffffffffffffffffffffffffffffffffffffffffdecec663310863311063310863391063310863311063310863391063310863311063310863 +3910633108633110bdb5adc6c6cebdbdc66b4221633108633910633108633110633108633910bdb5b5c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffc6ada5633910633110633910633110633910633110633910633110633910734a21c6c6cec6c6c6cececec6c6c6c6ceced6d6deffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffb59c8c6339106331106339106331106339106331106339106331106339107b5a39cececec6c6c6c6cecec6c6c6cececedededeffffffffffffffffffff +ffffffffffffffffffffffffffff94735a633110633910633110633910633110633910633110633910633110633910633110633910633110ad9c8cc6c6c6c6ce +ce8c6b5a633910633110633910633110633910633110cececec6c6c6cececec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7de63310863 +3110633108633910633108633110633108633910633108633110bdb5b5c6c6cec6c6c6c6c6cec6c6c6cececeffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdecec663310863391063310863 +3110633108633910633108633110633108633910bdbdbdc6c6cec6c6c6c6c6cec6c6c6ced6d6fffffffffffffffffffffffffffffffffffffffffffffffff7ef +ef734a216331086331106331086339106331086331106331086339106331086331106331086339108c6b52c6c6cec6c6c6ada59c633108633110633108633910 +633108734a29c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a296331106339106331106339106331106339 +10633110633910633110b59c94c6c6c6c6cecec6c6c6cececec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff76b39186331106339106331106339106331106339106331106339 +10633110b5ad9cc6c6c6cececec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ded6734221633110633910633110 +633910633110633910633110633910633110633910633110734a21c6c6c6cececec6c6c66b42216331106339106331106339108c6b4acececec6c6c6c6cecec6 +c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff94735a63391063310863311063310863391063310863311063310863391094735ac6c6ce +c6c6c6c6c6cec6c6c6c6c6cee7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff8463426331106331086339106331086331106331086339106331086331109c8473c6c6cec6c6c6c6c6ce +c6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce6b422163310863311063310863391063310863311063310863 +3910633108633110633108bdb5b5c6c6c6c6c6ce8c6b5a633910633108633110633108b5a59cc6c6c6c6c6cec6c6c6efefefffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffc6ad9c6331106339106331106339106331106339106331106339106331107b5231c6c6c6cececec6c6c6c6cecec6c6c6dededeff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffb59c84633110633910633110633910633110633910633110633910633110846342c6c6c6c6cecec6c6c6cececec6c6c6e7e7e7ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffded6ce7b5231633110633910633110633910633110633910633110633910633110633910ad9c8cc6ce +cec6c6c6ada59c6331106339106331108c6b52c6c6c6c6cecec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce63 +3110633108633910633108633110633108633910633108633110633108c6bdbdc6c6c6c6c6cec6c6c6c6c6cecececeffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6bd63391063310863 +3110633108633910633108633110633108633910633110c6c6c6c6c6c6c6c6cec6c6c6c6c6cececed6ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff7b59c8463311063311063310863391063310863311063310863391063310894735ac6c6c6c6c6cebdbdc66b4221633108735231 +bdbdb5c6c6ced6d6d6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b42186339106331106339106331106339 +10633110633910633110633910ad9c94c6cecec6c6c6cececec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff76339106339106331106339106331106339106331106339 +10633110633910b5ad9ccececec6c6c6c6cecec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +efe7dea58c73734a29633110633910633110633910633110633910734a29cececec6c6c6c6cece8c735a7b5a39c6c6bdefefefffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94735a6331086331106331086339106331086331106331086339106331089c7b6b +c6c6c6c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff845a42633108633910633108633110633108633910633108633110633108a58c7bc6c6c6c6c6ce +c6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d6cead94849c +7b638c634a7b5a396b42216b3910c6bdbde7e7e7f7f7f7efefe7f7f7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7e7e7e7e7e7e7e7e7 +e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7 +e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7a59484633910633110633910633110633910633110633910633110633910734a29cececec6c6c6c6cecec6c6c6cececed6 +d6d6e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7 +e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7 +e7e7e7e7e7e7e7e7e79c7b6b633910633110633910633110633910633110633910633110633910845a42c6cecec6c6c6cececec6c6c6c6ceced6d6d6e7e7e7e7 +e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7 +e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7efd6d6d6c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ce +c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6ad +a59c633108633910633108633110633108633910633108633110633108633910bdb5b5c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6 +c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ce +c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6a59c8c63310863 +3110633108633910633108633110633108633910633108633918bdbdc6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6 +c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ce +c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffd6c6b594735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394 +735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a6b39106331106339106331106339 +10633110633910633110633910633110845a4284634a8c6b528463527b6b5a5263634a6b6b526b6b8c736394735a947b6394735a947b6394735a947b6394735a +947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394 +735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b638c6b526339106331106339106331106339106331106339 +106331106339106331108c6b4a94735a947b6394735a947b6394735a947b6394735a947b6394735a846b528c735acececeada59c8c6b5294735a947b6394735a +947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735a947b6394735aa59484c6 +c6c6cececec6c6c6c6cecec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6bd63311063310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +6331086339104a422918526310394a105a73086b7b105a6b103139184a5a42423163311063310863391063310863311063310863391063310863311063310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +633108633910633108633110633108633910633108633110633108633910bdb5b5b5ada563310863391063310863311063310863391063310863311063310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106b4218c6c6c6c6c6c6c6c6cec6c6c6c6c6ced6d6 +d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff76339106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391039524a18394a089cbd00d6ff00 +d6ff00d6ff00d6ff00d6ff089cbd104a5a21525a6339186331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110ad9c94c6c6c66b42216331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910bdb5adc6cecec6c6c6cececec6c6c6cececeffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff846342633108633110633108633910633108633110633108633910633108633110633108633910 +63310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +311063310863391063310863311063310863391063310863311063310863391052391810394200bde700d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00ce +ff088ca51042525a3921633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910 +63310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +31106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331108c73 +63c6c6ce7b5a42633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910 +633108633110633108633910633108ad9c8cc6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffad947b63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110215a6b088ca500d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff08b5d61042525a4221633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331107b5a39c6c6c69c8473633110633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391094 +735acececec6c6c6c6cecec6c6c6cececee7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6b563310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +18526308b5d600ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff08b5d61042525a391863310863391063310863311063310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +633108633910633108633110633108633910633108633110633108633910633110c6bdbdada59c63391063310863311063310863391063310863311063310863 +3910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108734a29c6c6c6c6c6cec6c6c6c6c6cec6c6 +c6dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef6b39106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110315252087b9c00d6ff00d6ff00d6ff00 +d6ff00d6ff00d6ff00d6ff00c6ff00c6ff00c6ff00ceff00ceff089cbd184a5a6339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110633910ad9c94c6c6c66339106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110c6bdb5c6c6c6cececec6c6c6c6cececececeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5231633110633108633910633108633110633108633910633108633110633108633910 +63310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +31106331086339106331086331106331086339106331086331106331086339105a311010394200c6f700d6ff00ceff00d6ff00d6ff00d6ff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf7106b84294a4a6331106331086339106331086331106331086339106331086331105a31084a4229394239523921633108633910 +63310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +31106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331 +08947b6bc6c6c67b5a42633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910 +633108633110633108633910633108633110ad9c8cc6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffa58c7363311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910214a4a10738c00d6ff00d6ff00d6ff00d6ff00c6ff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00b5f7 +18394a5a39186339106331106339106331106339106331105a3921214a5218424a104a5a104252182129314a5263311063391063311063391063311063391063 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339107b5a39c6cece947b6b633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +31109c7b63c6c6c6c6cecec6c6c6cececec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5ad63 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +63310863311010313908adce00d6ff00d6ff00ceff00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff08739c214a5263310863311063310863 +3910633108315252105a7308a5ce00ceff00d6ff00d6ff08adce1031426331106331086339106331086331106331086339105239184a42314242314a42315a31 +10633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +633108633910633108633110633108633910633108633110633108633910633108633918bdbdc6ad9c9463310863311063310863391063310863311063310863 +3910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910734a29c6c6cec6c6c6c6c6cec6c6 +c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef947b639c7b63947b639c7b63947b639c7b +63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b63 +9c7b63947b639c7b63947b639c7b63947b639c7b63947b637b5231633110633910633110633910633110633910633110633910633110524a3110314208cef700 +d6ff00d6ff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700bdf7103142947b63947b639c7b638473631863730894b500d6ff00d6ff00d6 +ff00d6ff00d6ff00adce215a63947b639c7b638c7b635a7373295a6318424a10314218394a104a5a105a73104a6318394a10313921525a42636b847b6b947b63 +9c7b63947b639c7b63947b639c7b63947b63734a296331106339106331106339106331106339106331106339106331107b523194735a94735a8c735a94735a94 +735a947b63947b639c7b63947b638c735a8c6b52d6d6cef7efef9c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b63947b639c7b +636339106339106331106339106331106339106331106339106331106339106331106b3918c6bdbdcececec6c6c6d6d6d6ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffcebdad63311063310863391063310863311063310863391063310863311063391839637308637300d6ff00d6ff00bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf708739c73a5adffffff7ba5b5106b7b00c6ef00d6ff00ceff00d6ff00d6ff00d6ff00ceff10526bcee7e7bddee7 +316b7b18424a08637b089cbd00bdef00ceff00c6ff00ceff00c6ff00d6ff00d6ff00d6ff00a5c608738c103142295a6b94bdc6ffffffffffffffffffffffffff +ffffbdad9c633910633108633110633108633910633108633110633108633910734a29c6c6cec6c6c6c6c6cec6c6c6c6c6ced6d6deffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa58c73633910633108633110633108633910 +633108633110633108633910633108633910ad9c8cc6c6cec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef6331106339 +10633110633910633110633910633110633910633110633910b5ada5183942089cb500d6ff00c6ff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff +00bdff00b5ef295a6b317b8c0894b500d6ff00d6ff00ceff00ceff00c6ff00ceff00d6ff10738c5a94ad29637310637308add600c6ff00c6ff00bdff00bdff00 +bdf700c6ff00bdff00bdff00bdf700c6ff00c6ff00d6ff00d6ff00d6ff089cbd104a5a184252b5cedeffffffffffffffffffefe7de6331106339106331106339 +10633110633910633110633910633110633910bdb5b5cececec6c6c6c6cecec6c6c6ceced6ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffad9484633910633110633910633110633910633110633910633110633910633110633910ad +948ccececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5231633108633110633108633910633108633110 +633108633910633108a594849ca5ad18313900bde700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf708adde085a7300bde700c6ff00 +c6ff00bdf700bdff00bdf700bdff00b5f710637b105a7310738c00ade700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bd +f700bdff00bdf700c6ff00ceff00d6ff00d6ff089cbd103142316b7beff7f7ffffffffffff6b4221633108633910633108633110633108633910633108633110 +633108b59c94c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffb59c8c633910633108633110633108633910633108633110633108633910633108633110a5947bc6c6cec6c6c6cececeffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffa584736339106331106339106331106339106331106339106331106339108c6b52cecece6b +8494104a5a08adf710adf700bdf700bdff00bdf700c6ff00bdff00bdff00bdf7088cb50884a500c6ff00bdf700c6ff00bdff00bdff00bdf700c6ff00b5f7104a +63104a6308adde00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf7 +00ceff00d6ff00d6ff08738c18394ab5d6deffffff94735a633910633110633910633110633910633110633910633110633910947b63c6cecec6c6c6cececec6 +c6c6c6ceceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbda5946339106331106339 +10633110633910633110633910633110633910633110633910a58c73cececec6c6c6ceced6ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffcebdad6331086339106331086331106331086339106331086331106331086b4221bdc6c6c6c6ce315a63107ba5187be7188cef08a5 +f700bdff00bdf700bdff00a5d6087b9c00a5d600bdff00bdf700bdff00bdf700bdff00bdf700bdff009cce213942182931182931084a6300a5d600bdf700bdff +00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700c6ff00ceff00d6ff009cbd18 +31398cb5c6bda5946331086331106331086339106331086331106331086339106331087b5231c6c6c6c6c6cec6c6c6c6c6cec6c6c6dededeffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ad9c633910633108633110633108633910633108633110633108633910 +6331086331109c846bc6c6cec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7e76339 +10633110633910633110633910633110633910633110633910633110bdb5b5c6c6c6bdbdc6183942187bde187bef2184ef187bef188cef0894d608a5d600bdff +00bdff00bdf700c6ff00bdff00bdff00bdf700bdff1873944a6373bdbdbdadadad5a63631821291818210884b500bdff00bdff00bdf700c6ff00bdff00bdff00 +bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00ceff00d6ff00add61831398c9c9c6339106331106339 +10633110633910633110633910633110633910633110c6c6bdc6c6c6c6cecec6c6c6cecececececeffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffc6b5ad6b3910633110633910633110633910633110633910633110633910633110633910947b63c6cecec6c6c6cececef7 +f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a29633110633108633910633108633110 +633108633910633108633110a59484c6c6cec6c6c6637b8c105a8c187bef187be7187bef1094ef00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf708 +9cce2942526b6b73c6c6c6c6c6cec6c6c6c6c6ce949494212129101821106bad00b5f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00c6f700d6ff00adce183139633918633910633108633110633108633910633108633110 +633108633910ad9c94c6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcebdb56b +391063310863311063310863391063310863311063310863391063310863311094735ac6c6c6c6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c846b63311063391063311063391063311063391063311063391063311094735ac6 +c6c6c6cecebdbdbd18394a187bef187bef187bef109cf708a5f710a5f7089cf710a5f708a5f708adf7089cde107bb5185294212131181821737373c6c6c6c6ce +cec6c6c6cecece94949c1821211821291873ce1094ef08b5ff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf7 +00c6ff00bdff00bdff00bdf700c6ff00c6ff00d6ff087b945a42316331106339106331106339106331106339106331106339106331109c846bc6c6c6cececec6 +c6c6c6cecec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6c6bd6b39186331106339106331106339106331106339 +106331106339106331106339108c6b52c6c6cec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6dee76b9cad42738439 +6b7b528494c6dee7ffffffffffffc6ad9c6339106331086331106331086339106331086331106331086339106b4221c6c6c6c6c6c6bdbdbd102131187bef187b +ef187bef187be7187bef187bef187bef187be7187bef187be7187be7187be7187bef186bce21314210181873737bc6c6c6c6c6cec6c6c6c6c6ce63636b181821 +10294a187bef187bef1094f700adf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700 +bdff00c6ff00ceff3931216331106331086339106331086331106331086339106331086331107b5239c6c6cec6c6c6c6c6cec6c6c6c6c6cedededeffffffffff +ffffffffffffffffffffffffffffffffffffffffffffd6cec66b391863310863311063310863391063310863311063310863391063310863311084634ac6c6c6 +c6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6e7ef5a8c9c18394a182931184263184a84184a8c184a7b18294221395294bdceefe7 +de633110633910633110633910633110633910633110633910633110633910bdb5b5b5bdbd29425218528c187bef2184ef187bef187bef187bef2184ef187bef +187bef187bef2184ef187bef187bef187bef2184ef186bd6212931181821a5a5adc6c6c6c6cecec6c6c6bdbdc6212129182121185aad2184ef187bef187bef10 +94ef08b5ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00ceff29424a6331106339 +106331106339106331106339106331106339106331106b3910c6bdbdc6cecec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffff +ffffffded6ce6b4221633110633910633110633910633110633910633110633910633110633910846342c6c6c6c6c6c6c6ceceefefefffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffe7eff7739cad214a5a18212910426b1863b51873e7187bef187bef187bef187be7187bef1863c618395a295a736b4a29633108633910633108633110 +633108633910633108633110523110395a63102939185a9c187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef18 +7bef187be7187bef185aad182121313139c6c6c6c6c6c6c6c6cec6c6c673737b18182118314a187be7187bef187bef187bef187be71094ef00adf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700c6ff1031396b3918633108633110633108633910633108633110 +633108633910633108b5a59cc6c6c6c6c6cebdbdc69cb5bd8ca5b5e7eff7ffffffffffffffffffffffffffffffffffffe7e7de6b422163310863311063310863 +39106331086331106331086339106331086331107b5a39c6c6c6c6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cbdce29526318212918314a185a9c1873de +2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef185aa518394a5a422163311063391063311063391063311042392918314218314210 +5a94187be7187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef1839631821 +2184848ccececec6c6c6c6cecebdbdbd293131181821185aad187bef2184ef187bef187bef187bef1884ef108cef08adf700bdf700c6ff00bdff00bdff00bdf7 +00c6ff00bdff00bdff00bdf700c6ff00bdff00bdff009cc62152638c634a633910633110633910633110633910633110633910633110633910635a52295a6b18 +3142182121181821182121181821214a5a94b5c6ffffffffffffffffffffffffefe7de6331106339106331106339106331106339106331106339106331106339 +107b5231c6c6c6c6c6c6c6cecee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff9cbdc6214a5a10182118426b1063bd187bef187bef187bef187be7187bef187bef187bef187be718 +7bef187bef187bef187be7187bef187bef186bbd10394a5a391863310852311821394218293110426b1863bd187be7187bef187bef187bef187be7187bef187b +ef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7186bc6181821424242c6c6c6c6c6cec6c6c6c6c6ce +6b6b73181821182942187bef187be7187bef187bef187bef187be7187bef187bef188cef08a5f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700 +bdff00adce183942b5ced6ad9c84633108633910633108633110633108633910633108633110633108523918085a73088ca5009cbd08b5d600b5d608a5c6086b +8418293131637beff7f7ffffffffffffffffff734a21633108633910633108633110633108633910633108633110735231c6bdbdc6c6c6c6c6cee7e7e7ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffeff7f731637318212110395a186bce187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184 +ef187bef186bb5183942213139183952185aa51873de2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef +187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef213952181821a5a5adc6c6c6cececec6c6c6adadb5181821182121186bc6187bef18 +7bef2184ef187bef187bef187bef2184ef187bef187bef1084ef109cf700b5f700bdff00bdf700c6ff00bdff00bdff0894b51842529cc6d6ffffffd6c6bd6339 +1063311063391063311063391063311063391063311063391063391008cef700d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00bde710425218394af7ffffffffff +ffffff94735a633910633110633910633110633910633110633910734a29c6bdbdc6c6c6c6cecee7e7e7ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94bdc6102931182931105aa5187bef187b +e7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be71873d61839631831421863bd187bef +187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef18 +7bef187be7187bef187bef187bef18529c1818216b7373c6c6cec6c6c6c6c6cec6c6c6394242101818184a84187bef187bef187be7187bef187bef187bef187b +e7187bef187bef187bef187be7187bef1084ef109cf700adf700bdff086b84215a6be7f7f7e7f7f7bdd6de7ba5ad5a3108633110633108633910633108633110 +63310863391063310863311018a5bd00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00cef7105263295a6bffffffffffffbdad9c63310863311063310863 +39106331086331106b4221bdbdb5c6c6c6c6c6cedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6394a51821211842631873de2184ef187bef187bef187bef2184ef187bef187bef187bef +2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187be7184a84182129184a7b187be7187bef187bef2184ef187bef187bef187bef2184ef18 +7bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef186b +ce1818214a5252c6c6c6c6cecec6c6c6cecece7b7b7b1821211829392184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef +2184ef187bef187bef1873ce1821292931392129291821212939394a525a6b4a2963311063391063311063391063311063391063311063391063311039848c00 +d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00c6e71829316b9cadffffffe7ded66339106331106339106331106339106b4221c6bdb5c6c6c6c6ce +cedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff42738410182118528c187be7187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be718 +7bef187bef187bef186bce2129391818211818211018181829391863b5187bef187be7187bef187bef187bef187be7187bef187bef187bef1873de187bef187b +ef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187be71821292121298c8c8c63636b525a5a +4a4a4a5252521818211818211063bd187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef108cef088cbd1018187b +7b84ffffffffffffffffffffffffa58c7b6339106331086331106331086339106331086331106331086339104a5a4a00d6ff00d6ff00d6ff00ceff00d6ff00d6 +ff00d6ff00ceff00d6ff087b9418394affffffffffff6b39186339106331086331106b3918bdb5adc6c6c6c6c6ced6d6deffffffffffffffffffffffffffffff +fffffffffffffffffffffffff7f7f7f7f7f7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5284941818211863a518 +7bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef185aa52931398c8c94c6ce +ceadadb58c8c94213142182129186bc6187bef187bef2184ef187bef186bc6294a7331394a18212118212121212931394a214a841873de187bef2184ef187bef +187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef1873de18293918212921293929425a294a73294a6b21314a18212918182118314a10 +63ad188cef1884ef1884ef1084ef188cf7108cef188cf71094ef109cf708a5f708adf700bdf700c6ff088cbd182121737b7bffffffffffffffffffffffffd6c6 +bd63311063391063311063391063311063391063311063391063311063391800cef700d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff08b5d6181821 +e7f7f7ffffff94735a6331106339106b3918bdb5adc6c6c6c6ceced6d6d6fffffffffffffffffffffffffffffff7f7f7e7e7e7cecececececec6c6c6c6cecec6 +c6c6cececec6c6c6d6d6d6dededef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b9cad101821185a94187bef187bef187be7187bef187bef187bef187b +e7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef184a8439424ab5b5b5c6c6cec6c6c6c6c6cec6c6c6a5a5ad101818184273 +187bef187bef1873de29425a18182118182110181821212929313118212110181818182118212121528c187be7187bef187bef187bef187be7187bef187bef18 +7bef187be7187bef187bef185aad102139184a84186bd6187bef187be7187bef187bef187bef1873e71863b518315218182110394a00a5de00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf70894c6181821737373fffffffffffffffffffffffff7efef633910633108633910633108633110 +63310863391063310863311063310818adc600ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00cef7181821b5cedeffffffb59c8c633110633910b5 +ada5c6c6c6c6c6ced6d6d6fffffffffffffffffff7f7f7ded6cebdb5adb5a59cbdada5c6c6bdc6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6 +c6ceced6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffbdd6e7182129184a7b187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef +2184ef187bef187bef187bef2184ef184a7b424a5abdbdbdcececec6c6c6c6cecec6c6c6c6c6c6525a6b18212118395a2184ef187be729394a1818214a4a5294 +9494b5b5b5c6c6c6cececebdbdbd949c9c42424218212118182121426b187be72184ef187bef187bef187bef2184ef187bef187bef187bef18528c184273187b +e7187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef184a8c182121102931089cce00bdff00bdff00bdf700c6ff00bdff00bdff00bdf7 +00c6ff00bdff00bdff0094c618212163636bffffffffffffffffffffffffffffff7b523963391063311063391063311063391063311063391063311063391031 +848c00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff181821b5d6deffffffded6ce633910b5ad9ccececee7e7e7f7f7f7ffffffffffffcebd +ad9473526b4218633110633910633110633910633110633910735231ad947bc6bdbdc6cecec6c6c6cececec6c6c6c6cecec6c6c6cececed6d6d6ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +18424a1831421873e7187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef184a8c39 +4a52bdc6c6bdbdbd848c9452637b394a63314252182129181821181829186bbd187be7185aad181821182121b5b5bdc6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6 +c6c6c6ce7b8484182121181821214a84187be7187bef187bef187bef187be7187bef187bef18529c1863b5187bef187bef187bef187be7187bef187bef187bef +187be7187bef187bef187bef187be7187bef1839631818211021290894c600bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf7089cce1018185a +5a63ffffffffffffffffffffffffffffffa58c736331086331106331086339106331086331106331086339106331084a635200d6ff00d6ff00ceff00d6ff00d6 +ff00d6ff00ceff00d6ff00d6ff182129adced6ffffffffffffc6b5a5efefefffffffffffffffffffe7ded68c634a633108633910633108633110633108633910 +63310863311063310863391063310863391084634abdada5c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6efeff7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff739cad1821211863bd2184ef187bef187bef18 +7bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef186bc6293139848c9431425a1818211821211818211821 +2118182118294218427b1873de187bef187bef185aad18212118182163636b9c9ca5c6c6cec6c6c6c6cecec6c6c6cececec6c6c6c6cece94949c212129181821 +186bc6187bef2184ef187bef187bef187bef1873ce186bd6187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef18 +7bef187bde18213118212110293108b5ef00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff009cd6182121525252ffffffffffffffffffffffffffff +ffcebdad6339106331106339106331106339106331106339106331106339105a391808d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff182931 +bdd6deffffffffffffffffffffffffffffffffffffefe7de734a2963311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110a58473c6c6c6cececec6c6c6c6cecec6c6c6cececec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21425210314a187bef187be7187bef187bef187bef187be7187bef187bef187bef187b +e7187bef187bef187bef187be7187bef187bef187bef187be721314a31425218182110182118315218427b185aad186bc6187be7187bef187bef187be7187bef +187bef187bef18529429313918182118182121212973737bbdbdc6c6c6cec6c6c6c6c6cec6c6c6c6c6ce6b6b73181821293952187bef187be7187bef187bef18 +7bef1873e7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7185aad1818211818210863 +7b00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700a5d61818214a4a52fffffffffffffffffffffffffffffff7efe7633108633910633108633110 +63310863391063310863311063310863391010adce00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff183139b5d6deffffffffffffffffffffffffff +fffff7f7f77352316331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331087b5231bdb5 +adc6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffbdd6de181821185aa5187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef +2184ef187bef1863ad182939182129184a7b1873d6187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef186bbd31 +4a63182121181821394242bdbdbdc6cecec6c6c6cececec6c6c6bdbdc62121291821211863bd187bef187bef2184ef187bef187bef187bef2184ef187bef187b +ef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef18426b18182118292900b5ef00c6ff00bdff00bdff00bdf7 +00c6ff00bdff00bdff00a5de182121394242ffffffffffffffffffffffffffffffffffff7b523163311063391063311063391063311063391063311063391063 +3110318c9400d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff103142bdd6e7ffffffffffffffffffffffffffffffb59c846331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110734a21bdbdb5cececec6c6c6c6cecec6c6c6 +cececec6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff739cad181821 +186bce187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef18294218314a186bce18 +7bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef1863bd21293110181852525ac6c6 +c6c6c6cec6c6c6c6c6cec6c6c65a6363101818314a6b187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef +187be7187bef187bef187bef187be7187bef187bef187bef186bc61818211818210894c600bdf700bdff00bdf700bdff00bdf700bdff00bdf7089cd610181831 +3939ffffffffffffffffffffffffffffffffffff9c7b6363311063310863391063310863311063310863391063310863311042635a00d6ff00ceff00d6ff00d6 +ff00d6ff00ceff00d6ff00d6ff10394aadced6ffffffffffffffffffffffffffffff6b4221633910633108633110633108633910633108633110633108633910 +633108633110633108633910633108633110633108633910633108633110633108734a29bdb5b5c6c6cec6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff528494182129187bef187bef2184ef187bef187bef18 +7bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef1863bd183152187be7187bef187bef2184ef187bef187bef187bef2184 +ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef1863bd18212918182194949cc6c6c6c6cecec6c6c6cececea5a5a5 +182121212129187be7187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef18 +7bef2184ef187bef187bef183152182121086b8c00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff0894bd182121313939ffffffffffffffffffffffffffff +ffffffffc6b5a56331106339106331106339106331106339106331106339106331105a422100d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff104252 +a5c6d6ffffffffffffffffffffffffe7ded663391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110633910633110845a42c6c6c6cececec6c6c6c6cecec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff4a7b8c182939187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187b +e7187bef187bef187bef187be7187bef187bef1839631063c6187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef +187bef187bef187be7187bef187bef187bef187be7187bef184a8c181821313939c6c6c6c6c6c6c6c6cec6c6c6c6c6ce393942181821215a9c187bef187bef18 +7bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef1852941018 +1810425200bdf700bdff00bdf700bdff00bdf700bdff00bdf7088cb51818214a4a52ffffffffffffffffffffffffffffffffffffefe7de633910633108633110 +63310863391063310863311063310863391063310810bdd600d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff104a5a94b5c6ffffffffffffffffffffffffce +c6b56331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108b5a594c6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff6b9cad181821187be7187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef +1873d6183152187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef18 +7bef187bef187bef187be71829391821218c8c8ccececec6c6c6c6cecec6c6c684848c18182142526b187bef2184ef187bef187bef187bef2184ef187bef187b +ef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef1863bd18212118182100bdf700bdff00bdff00bdf7 +00c6ff00bdff00bdff087ba51821215a5a63ffffffffffffffffffffffffffffffffffffffffff5a311063391063311063391063311063391063311063391063 +311063391029949c00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff10526b7ba5b5ffffffffffffffffffffffffb5a5946339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910734a29c6c6c6c6c6c6 +cececec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadced6181821 +185ab5187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef10427b185aa5187bef187bef187be718 +7bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7185aa51818 +21393942bdc6c6c6c6cec6c6c6c6c6ceb5b5b5181821293131187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef +187be7187bef187bef187bef187be7187bef187bef187bef187be71873de18182118182100adde00bdff00bdf700bdff00bdf700bdff00bdf71073941018186b +6b73ffffffffffffffffffffffffffffffffffffffffff4a2918633108633910633108633110633108633910633108633110633108426b6300ceff00d6ff00d6 +ff00d6ff00ceff00d6ff00d6ff10738c427384ffffffffffffffffffffffffad94846331086339106331086331106331086339106331087b52319c84739c8473 +633108633110633108633910947b6b947b6b735231633910633108633110633108633910633108633110a59484c6c6cec6c6c6c6c6cec6c6c6c6c6cee7e7e7ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff18394a183152187bef2184ef187bef187bef18 +7bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef1873e7182942187be72184ef187bef187bef187bef2184ef187bef187bef187bef2184 +ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187be718314a181821949c9cc6c6c6cececec6c6c6 +c6cece3131391821211873d6187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef18 +7bef2184ef187bef187bef187bef18213118182108a5d600bdf700c6ff00bdff00bdff00bdf700c6ff2152631821218c8c8cffffffffffffffffffffffffffff +ffffffffffffff3121186339106331106339106331106339106331106339106331106339105a422900d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff0894ad +295263ffffffffffffffffffffffffb5a5946339106331106339106331106339106331109c846bc6c6c6cececec6bdc66b3918633110633910633110a58c7bc6 +c6c6cececead9c946b4221633110633910633110633910633110846342c6c6c6c6cecec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84adbd181821185294187be7187bef187bef187bef187be7187bef187bef187bef187b +e7187bef187bef187bef187be7185294104a7b109cf708a5f708adf708adf710adf7089cef109cf7108cef188cef107be7187bef187bef187bef187be7187bef +187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef18529c1818214a4a52c6c6cec6c6c6c6c6cec6c6c65a5a631018181863b5187bef18 +7bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef1029 +4a181821008cbd00bdff00bdf700bdff00bdf700bdff00b5f7212931181821cececefffffffffffffffffffffffffffffffffffff7f7f7292121633108633110 +63310863391063310863311063310863391063310863311008bdde00d6ff00ceff00d6ff00d6ff00d6ff00ceff08adce102939ffffffffffffffffffffffffce +bdad633108633110633108633910633108735231bdbdc6c6c6cec6c6c6c6c6ce7b5239633910633108633110846342c6c6cec6c6c6c6c6ceb5ada56b42216331 +08633110633108633910633108c6bdbdc6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff427384181821185a9c187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef1873d6103142 +08c6ef00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00c6ff08bdff10a5f71094f71884ef2184ef187bef187bef187bef2184ef18 +7bef187bef187bef2184ef187bef187be7182131212129adb5b5c6cecec6c6c6cecece6b6b73182121185aa52184ef187bef187bef187bef2184ef187bef187b +ef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef1839631818210894bd00bdff00bdff00bdf7 +00c6ff00bdff089cce181821292931ffffffffffffffffffffffffffffffffffffffffffdedede18182163311063311063391063311063391063311063391063 +3110633910633110299ca500d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00c6ef182121e7eff7ffffffffffffffffffe7ded66339106331106339106331106339 +1094735acececec6c6c6c6cecec6c6c6947b6b6331106339106331106b4218c6c6c6c6cecec6c6c6cececea5948c633910633110633910633110633910ad948c +cececec6c6c6c6cecec6c6c6cececeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f7ffff396b7b1818211842731873de187bef187bef187bef187be7187bef187bef187bef187be7187bef184a840894b500ceff00ceff00bde700c6e700c6ef00 +d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00c6f710adf71084ef187bef187be7187bef187bef187bef187be7187bef187b +ef184a841018186b6b73c6c6c6c6c6cec6c6c67b7b84181821185294187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef +187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef1042631818210094c600bdff00bdf700bdff00bdf700bdff0873941818215a5a63ff +ffffffffffffffffffffffffffffffffffffffffadadb51818214a3118633910633108633110633108633910633108633110633108633910396b6b00d6ff00d6 +ff00d6ff00ceff00d6ff00d6ff00d6ff1029319cbdceffffffffffffffffffffffff6b391863391063310863311063310894735ac6c6c6c6c6cec6c6c6c6c6ce +a59c94633110633108633910633108bdada5c6c6c6c6c6cec6c6c6c6c6c66b42296339106331086331106331088c634ac6c6c6c6c6cec6c6c6c6c6cec6c6c6e7 +e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b9cad18293118314218 +5aa5187bef187bef187bef187bef2184ef187bef187bef1873e718314a106373106373105a6b106b7b086b84106b84106373106b7b086b84107b8c087b94089c +bd00bdde00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff108cef187bef187bef2184ef187bef187bef187bef2184ef186bce182121292931c6cecec6c6c6 +c6cece848c8c182121184a84187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef18 +7bef2184ef187bef187bef187bef18395a18182108adde00bdf700c6ff00bdff00bdff00bdf7215263181821a5a5a5ffffffffffffffffffffffffffffffffff +ffffffff8c8c941818213942396331106339106331106339106331106339106331106339106331105a4a3100d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff +104a5a5a8c9cffffffffffffffffffffffff9c7b63633110633910633110633910734221c6c6c6c6c6c6cececec6c6c6c6c6c6633110633910633110633910a5 +8c7bcececec6c6c6c6cecec6c6c6947363633110633910633110633910633918c6c6cec6c6c6cececec6c6c6c6ceced6d6d6ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeeff7396b7b1821291029421863a5187be7187bef187b +e7187bef187bef18528c08738c00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00b5de089cbd0884a50894b500bde700d6ff +00d6ff00d6ff00ceff00ceff1084ef187bef187be7187bef187bef187bef187be7187bef182942181821a5a5a5c6c6cec6c6c68c949410181818528c187bef18 +7bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef1029 +3918212900b5f700bdff00bdf700bdff00bdf700bdf7182129181821dededeffffffffffffffffffffffffffffffffffffffffff636363181821185a63633110 +63310863391063310863311063310863391063310863311063310808c6e700ceff00d6ff00d6ff00d6ff00ceff00d6ff104a5a396b7bffffffffffffffffffff +ffffcebdad633110633108633910633108633110ad9c8cc6c6cec6c6c6c6c6cec6c6c67b52316331086331106331088c6b52c6c6c6c6c6cec6c6c6c6c6ce8c7b +63633110633108633910633108633110bdb5adc6c6cec6c6c6c6c6cec6c6c6ced6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeefef52849418293918314210639c187bde187bef2184ef10395200ceff00d6ff +00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00ceff08adce0894b508bdde00d6ff00d6ff00d6ff08bdff18 +7bef187bef187bef2184ef187bef187bef187bef184a7b1818217b7b84c6c6c6cecece8c94941821211852942184ef187bef187bef187bef2184ef187bef187b +ef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef1873d6182129104a5a00c6ff00bdff00bdff00bdf7 +00c6ff089cce182121313139ffffffffffffffffffffffffffffffffffffffffffffffff42424a181821088ca55a391863391063311063391063311063391063 +3110633910633110633910219cad00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff18394a427384ffffffffffffffffffffffffffffff6339186339106331106339 +10633110734221bdb5adc6cecec6c6c6cecece8c73636339106331106339106b3918c6c6c6c6c6c6cececec6c6c684634a633110633910633110633910633110 +b5a594c6c6c6c6cecec6c6c6cececec6ceceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffa5c6ce4a7b8c18314218425a105a9410426300bde700d6ff00c6ff00ceff00c6ff00c6ff00c6f700 +ceff00c6ff00ceff00ceff00ceff00ceff00d6ff00ceff00d6ff00d6ff00d6ff00b5de08b5d600d6ff00d6ff00ceff188cef187bef187bef187be7187bef187b +ef187bef1852941818215a6363c6c6cec6c6c68c8c9418182118529c187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef +187be7187bef187bef187bef187be7187bef187bef187bef187be718529418182108739c00bdf700bdff00bdf700bdff00bdf710739c1818216b6b73ffffffff +ffffffffffffffffffffffffffffffffffffffff18182118182100adce4a6352633108633110633108633910633108633110633108633910633108397b7300d6 +ff00d6ff00ceff00d6ff00d6ff00c6ef1018217badb5ffffffffffffffffffffffffffffff94735a633108633110633108633910633108734221a58c84c6c6c6 +c6c6c6a59c8c633108633910633108633110b5adadc6c6cec6c6c6ada59c6331106339106331086331106331086339109c8473c6c6cec6c6c6c6c6cec6c6c6c6 +c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffbdd6de5a8c9c183139089cc600bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6 +ff00c6ff00ceff00ceff00d6ff00d6ff00d6ff00cef700d6ff00d6ff00d6ff109cef2184ef187bef187bef187bef2184ef187bef1863ad18182152525ac6c6c6 +c6cece84848c182121185a9c187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef18 +7bef2184ef187bef187bef18294218212900ade700bdff00bdf700c6ff00bdff00bdff18526b182121a5a5a5ffffffffffffffffffffffffffffffffffffffff +ffc6c6ce18212110212900d6ff31848c63391063311063391063311063391063311063391063311063391052523900d6ff00d6ff00d6ff00d6ff00d6ff088cad +182129e7eff7ffffffffffffffffffffffffffffffcebdb56339106331106339106331106339106331106339106b42218c6b52947b6b63391063311063391063 +3110ad9484c6c6c6c6cece7b5a426339106331106339106331106339106331109c846bc6c6c6cececec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffa5b5bd08739c00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700ceff +00d6ff00d6ff00ceff00d6ff00d6ff1094f7187be7187bef187bef187bef187be7187bef185aa51818214a5252c6c6cec6c6c684848c101818185aad187bef18 +7bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef184a8c181821085a +7b00bdff00bdf700bdff00bdf700bdff00bdf7214252101818c6c6c6ffffffffffffffffffffffffffffffffffffffffff949494181821104a5a00ceff18adc6 +63310863391063310863311063310863391063310863311063310863391000c6ef00d6ff00d6ff00d6ff00ceff104a5a214a5affffffffffffffffffffffffff +ffffffffffffffff7b52396339106331086331106331086339106331086331106331086339106331086331106331086339108c6b52c6c6cec6c6c69c84736331 +086331106331086339106331086331108c735ac6c6cec6c6c6c6c6cec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffced6d6106b8c00bdf7 +00c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00ceff00d6ff00d6ff08c6ff18 +7bef187bef187bef2184ef187bef187bef187bef185294181821636b6bc6c6c6cecece7b7b841821211863bd2184ef187bef187bef187bef2184ef187bef187b +ef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef186bce18212918293108ade700bdf700c6ff00bdff00bdff00bdf7 +00c6ff213142182121d6d6d6ffffffffffffffffffffffffffffffffffffffffff5a5a63182121087b9400d6ff00cef763391863311063391063311063391063 +311063391063311063391063311021a5b500d6ff00d6ff00d6ff08adce1818218cb5c6ffffffffffffffffffffffffffffffffffffffffffd6cebd6331106339 +10633110633910633110633910633110633910633110633910633110633910633110734a21c6c6c6cececeb5b5ad633910633110633910633110633910633110 +9c846bc6c6c6c6cecec6c6c6cececed6d6deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7105a7b00bdff00bdf700bdff00bdf700bdff00bdf700 +bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf708a5f7108cef1094f7187be7187bef187bef187bef187be7187bef187b +ef187bef18396b18182173737bc6c6cec6c6c66b6b731818211873d6187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef +187be7187bef187bef187bef187be7187bef186bce1829391018210894bd00bdf700bdff00bdf700bdff00bdf700bdff00c6f7182931181821efefefffffffff +ffffffffffffffffffffffffffffffffff29293110181808a5c600d6ff00d6ff4a5a42633110633108633910633108633110633108633910633108633110317b +7b00d6ff00ceff00d6ff10425218424aefefefffffffffffffffffffffffffffffffffffffffffffffffff9c846b633108633910633108633110633108633910 +633108633110633108633910633108633110633108bdb5b5c6c6c6c6c6ce735231633910633108633110633108633910a58c7bc6c6cec6c6c6c6c6cec6c6c6ef +efefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffefefef215a7300bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6 +ff00bdff00bdff00bdf700c6ff00bdff00bdff1884ef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef212939181821a5a5adc6c6c6 +c6cece525a5a182129187be7187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef187bef2184ef187bef187bef18 +6bc618314218182110739c00bdf700c6ff00bdff00bdff00bdf700c6ff00ceff00d6ff1821293139394a6b7b52737b526b7bbdc6c6ffffffffffffffffffdede +e718182118212100cef700d6ff00d6ff398484633110633910633110633910633110633910633110633910633110525a4200d6ff00d6ff08738c1821297b9cad +e7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffff78c6b4a63311063391063311063391063311063391063311063391063311063391063 +3110633910ad9c8cc6cecec6c6c69c8473633110633910633110633910633110b5ad9cc6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff184a5a00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff +08a5f7187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7186bc6181821292931bdc6c6c6c6cec6c6c639424a102131187bef1873d610 +527b1073de187bef187bef187bef187be7187bef187bef187bef187be7187bef187bef187bef187be7187bef1852941821291018210884ad00bdf700bdff00bd +f700bdff00bdf700ceff00ceff00ceff00b5f7104a6373a5adffffffffffffeff7ff5a8c9c395263ced6d6ffffffb5b5b518182110293100d6ff00ceff00d6ff +18a5bd6339106331086331106331086339106331086331106331086339105a311008cef7089cb5182121427384c6c6cececed6ffffffffffffffffffffffffff +fffffffffffffffffffffffffffff7f7f784634263310863391063310863311063310863391063310863311063310863391063310894735ac6c6c6c6c6ceb5ad +ad633910633108633910633108734221c6c6c6c6c6cec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff294a5200bdf7 +00c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf71894f7187bef187bef187bef2184ef18 +7bef1884ef187bef2184ef187bef187bef1842731821215a5a5ac6cecec6c6c6c6cece212931183963187bef1894f7182129213139105294187be7187bef187b +ef187bef2184ef187bef187bef187bef2184ef187bef1863ad10314218212110394a089cce00bdf700c6ff00bdff00c6ff00c6ff00d6ff00d6ff08b5ff00adf7 +00c6ff087b9c316373ffffffffffffffffffffffffd6e7ef315263738c94949494181821184a5200d6ff00d6ff00d6ff08cef763391063391063311063391063 +3110633910633110633910633110633910217b8418212929526bc6c6cec6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff7f7f78c6b4a633110633910633110633910633110633910633110633910633110633910734a29cececec6c6c6c6cece735231633910633110633910ad9c8c +cececec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21424a00bdff00bdf700bdff00bdf700bdff00bdf700 +bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff107bef187bef187bef187bef089cef00ceff00ceff109cf7187be7187bef1873 +d61821291018189c9ca5c6c6c6c6c6cea5a5a5181821184a8c187bef00a5f729424a39394263737318212918426b185aa5186bce1873de187bef186bd61863b5 +10427318293918182110394a087ba500bdf700bdf700bdff00bdf700c6ff00ceff00d6ff00c6ff109cf700b5f700bdff00bdf700b5ef102939deefefffffffff +ffffffffffffffffffffff528494212931181821085a6b00d6ff00d6ff00d6ff00ceff5252426331086339106331086331106331086339106331086331106331 +08422918295a6bc6c6c6c6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5a56b4218633910 +633108633110633108633910633108633110633108633910bdb5b5c6c6cec6c6c69c84736331086331108c6b52c6c6c6c6c6c6d6d6d6f7f7f7ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff29425200bdf700bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6 +ff00bdff00bdff00bdf700c6ff00bdff188cef187bef2184ef08a5f700d6ff00bde700d6ff00c6ff187bef187bef184a84181821393942c6c6c6cececec6c6c6 +7b848c181821186bbd108cef00bdff315a6b42424affffffefefef7b848431394218182118212118182118212118212921293908638408a5d600bdff00bdff00 +bdf700c6ff00ceff00d6ff00d6ff00d6ff00bdff1094f700b5f700c6ff00bdff00bdff00bdf710739c396b7bffffffffffffffffffffffffffffffffffffa5c6 +ce18212910526300ceff00d6ff00d6ff00d6ff317b7b6339106331106339106331106339106331106339106331106339105a4a31c6c6cec6c6c6cececec6c6c6 +c6cecee7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7a58c73734a2163311063391063311063391063 +3110633910633110b5a594c6c6c6cececeb5b5ad63391084634acececee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff18314200bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff +089cef187bef089cef00ceff105263182121085a6b00d6ff187bef187be7182129181821848c8cc6c6cec6c6c6c6c6ce424a5a1821291084e700b5f700bdf739 +6b7b212929fffffffffffffffffffffffff7f7f7dededed6d6d694949418182118293900c6ff00bdf700c6ff00c6ff00d6ff00ceff00d6ff00d6ff00d6ff00ad +f7109cf700bdf700bdff00bdf700bdff00bdf700bdff00b5ef183139c6dee7ffffffffffffffffffffffffffffffffffffe7eff729526310425200add600d6ff +00d6ff21a5b56331086331106331086339106331086331106331086339106331086b3918c6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6c6a58c73845a396b4221633910633108633110947b63cececedede +def7f7f7c6b5a5f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21394200bdf7 +00c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdf700d6ff086b7b18212118 +182118293100d6ff188cf7184a8c182121393942c6c6cec6c6c6c6ceceb5b5b518212910395200bdff00bdf700c6ff316b84182121ffffffffffffffffffffff +ffffffffffffffffffff7b7b7b18182110526300d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00ceff089cf708a5f700bdf700c6ff00bdff00bdff00bdf7 +00c6ff00bdff00bdff08739c397384ffffffffffffffffffffffffffffffffffffffffffffffff6394a5182931104a5a10849c108cad63391063311063391063 +3110633910633110633910633110633910633110bdb5adc6c6c6c6cecec6c6c6cececec6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7efe7ded6efe7deffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef10395200bdff00bdf700bdff00bdf700bdff00bdf700 +bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700c6ff00c6ef18212110181818182110313900d6ff009cde1821291818 +219c9c9cc6c6c6cececed6d6d6737b841018180884ad00bdf700bdff00bdf729738c181821efefefffffffffffffffffffffffffffffffffffff4a4a52181821 +086b8400d6ff00d6ff00d6ff00ceff00d6ff00ceff00c6ff0894ef08adf700bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700b5f7103139de +eff7ffffffffffffffffffffffffffffffffffffffffffffffffe7eff75a8c9c2152631839425231186339106331086331106331086339106331086331106331 +08633910a58c7bc6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7 +f7f7e7e7e7dededededee7dedededee7e7dededededee7bdbdbd18425200bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6 +ff00bdff00bdff00bdf700c6ff00bdff00bdff00c6ff08a5bd7b7b7b52525a181821105a6b00c6ff184a5a1818217b7b84ffffffffffffffffffffffff182931 +18293900b5f700c6ff00bdff00bdff297b94182121efefefffffffffffffffffffffffffffffffeff7f721212918182108adce00d6ff00d6ff00d6ff00d6ff00 +ceff08bdff1094ef08b5ff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff106b845a8c9cdee7e7dededededee7dedededee7 +e7dededededee7dedededee7e7dededededee7dedede9c7b6b63311063391063311063391063311063391063311063391063311084634ad6d6d6d6d6ded6d6d6 +d6d6d6d6d6d6dedededededededee7dedededee7e7dededededee7dedededee7e7dededededee7dedededee7e7dededededee7dedededee7e7dededededee7de +dededee7e7dededededee7dedededee7e7dededededee7dedededee7e7dededededee7dedededee7e7dededededee7dedededee7e7dededededee7ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7e7e7e7cececec6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6 +c6c6c6cec6c6c6bdbdbd10293100bdff00bdf700bdff00bdf700bdff00bdf700ceff00ceff00d6ff00ceff00ceff00bdf700bdff00bdf700bdff00bdf700bdff +00bdf700ceff009cbd7b7b7b31393918212100adce087ba5181821394242f7f7f7ffffffffffffffffff8c9c9c181821086b8400bdff00bdf700bdff00bdf731 +738c101818ffffffffffffffffffffffffffffffffffffa5adad10181810394a00d6ff00d6ff00ceff00d6ff00c6ff08adf70894ef00bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff0094bd296373c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ce +c6c6c6c6c6ce9c9484633110633108633910633108633110633108633910633108633110633918c6c6c6c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6 +c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6 +c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffc6ada58c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a213942009cce +00c6ff00bdff00bdff00c6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00c6ff00c6ff00bdff00bdff00bdf700c6ff00ceff00d6ff10526318293108 +849c08b5e7182129212129d6d6d6ffffffffffffffffffefefef21293118212908ade700bdff00bdff00bdf700c6ff316b7b212929ffffffffffffffffffffff +ffffffffffffff52525a1821210884a500d6ff00d6ff00d6ff00c6ff10a5f7089cf700bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf7 +00c6ff00bdff00bdff00bdf708adde184a5a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a84634263311063391063 +31106339106331106339106331106339106331106339107b5a398c6b4a846342bdb5b5c6c6c68463427b5a397b5a427b5a39845a4284634a8c6b4a84634a8c6b +4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a8c6b4a84634a +8c6b4a84634a8c6b4a9c8473cececec6c6c6c6cecec6c6c6cececee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffd6c6b5633108633910633108633110633108633910633108633110633108633910633108633110393931105a7300bdf700bdff00c6f700d6ff00ceff00 +d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00bdff00bdf700bdff00bdf700c6ff00d6ff00d6ff00ceff00c6f710394a1818218c8c94ffffffffff +ffffffffffffff5a6b73181821106b8c00bdf700bdff00bdf700bdff00bdf7396373293131ffffffffffffffffffffffffffffffe7e7e718212118212900cef7 +00ceff00ceff00bdf7109cf708a5f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff009cc618 +4a5a6331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331 +086339106331086331106331086339109c8c7bc6c6ce735231633910633108633110633108633910633108633110633108633910633108633110633108633910 +633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108734a29c6c6c6c6 +c6cec6c6c6c6c6cec6c6c6dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef6b391063311063391063 +3110633910633110633910633110633910633110633910633110633910183942087ba500bdf700d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6 +ff00d6ff00d6ff00ceff00ceff00bdff00bdff00bdf700ceff00ceff00c6f7184a5a1821216b7373ffffffffffffffffffffffffcecece18182118314200b5f7 +00bdff00bdf700c6ff00bdff00bdff39525a52525affffffffffffffffffffffffffffff949c9c18182110738c00d6ff00c6ff00b5f71094f700b5f700bdff00 +bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff088cad214a5a6339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +8c735ac6c6c6947b6b63311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110633910633110633910633110633910633110633910633110633910633110bdbdb5c6c6c6cececec6c6c6c6cececececeffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b52316331106331086339106331086331106331086339106331 +0863311063310863391063310863311018394a087b9c00ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00ceff +00bdf700bdff00bdf7089cce18394a181821737373fffffffffffffffffffffffff7f7f7213139181821008cb500bdff00bdf700bdff00bdf700bdff00bdf729 +3939737373ffffffffffffffffffffffffffffff39394218212900b5de00bdff08a5f7109cf700b5f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700c6ff104a63394a42633108633110633108633910633108633110633108633910633108633110 +633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110734a29c6c6cea5948c63311063310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110ad9c8cc6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffa58c73633110633910633110633910633110633910633110633910633110633910633110633910633110 +633910184a52105a6b088ca500cef700d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff089cc610526b1818211821217b +7b84ffffffffffffffffffffffffffffff4a5a63182121105a7300bdff00bdf700c6ff00bdff00bdff00bdf700bdf71818219c9c9cffffffffffffffffffffff +ffceced6182121105a6b00bdff1094ef08adf700bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf7 +00c6ff00bdff00c6ff00b5de18394263311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110633910633110633910633110633910633110633910bdb5b5bdbdbd6331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +6339106331106339106331109c7b63c6c6c6c6cecec6c6c6cececec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffcebdad63391063310863311063310863391063310863311063310863391063310863311063310863391063310863311021525a18394210212910 +637b089cbd00cef700ceff00d6ff00d6ff00d6ff00bde708a5c608849c10637b10293118182118182142424ac6c6c6ffffffffffffffffffffffffffffff7b8c +9418182110314200b5f700bdf700bdff00bdf700bdff00bdf700bdff089cc6181821bdbdc6ffffffffffffffffffffffff7b7b7b101818088cce1094ef00b5ff +00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00ceff10526b294a5263 +31106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331 +08633910633108633110633108633910633108a5948cc6c6c6735231633108633110633108633910633108633110633108633910633108633110633108633910 +633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910734a29c6 +c6cec6c6c6c6c6cec6c6c6c6c6ced6dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef63311063391063 +311063391063311063391063311063391063311063391063311063391063311063391063311063391021525a29394218182118212118182121313918424a2142 +4a1821291821211818211821211818211821214a4a4aadadb5ffffffffffffffffffffffffffffffffffff84949c18212118212908a5de00bdf700c6ff00bdff +00bdff00bdf700c6ff00bdff297b94181821ffffffffffffffffffffffffffffff29293129425a08a5f700bdff00bdff00bdff00bdf700c6ff00bdff00bdff00 +bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00c6ff0894b51039426339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +6339108c735acecece8c735a63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910bdbdb5cececec6c6c6c6cecec6c6c6cece +d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b52316331086339106331086331106331086339106331 +086331106331086339106331086331106331086339106331086331102142524a636b6b73732129291818211818211018181818211818211821214a4a4a8c8c8c +ced6d6ffffffffffffffffffffffffffffffffffffffffff849ca51821211021290894c600bdf700bdff00bdf700bdff00bdf700c6ff00c6f700d6ff2942524a +4a4affffffffffffffffffffffffa5a5a51818211084ad00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00c6f708adce1029314a4229633108633910633108633110633108633910633108633110633108633910633108633110 +6331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331087b5231c6c6c6a5948c63310863 +39106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108b5a594c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff9c846b633910633110633910633110633910633110633910633110633910633110633910633110 +63391063311063391063311063391018424a527b84ffffffefefefc6c6ceadb5b5bdbdbddededef7f7f7ffffffffffffffffffffffffffffffffffffffffffff +ffffffffff63848c18212118212908a5c600c6ff00ceff00c6ff00ceff00ceff00d6ff00d6ff00d6ff00c6ef182129848484ffffffffffffffffffdedede7373 +7318182108ade700bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00c6ff +089cbd18293142423963311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910633110633910633110633910633110633910633110633910633110c6bdbdbdb5b56339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +6339106331106339106331106339109c7b63c6cecec6c6c6cececec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffc6b5ad63310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +3110183942426b73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7efef294a5218182110212908a5c600d6 +ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00d6ff1094ad101818cececeffffffe7e7e7e7e7e7e7e7e752525a18182100a5d600bdff00bdf700bdff +00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00c6ff087b9410212942423163310863391063310863 +31106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331 +08633910633108633110633108633910633108633110a59c94c6c6ce6b4221633110633108633910633108633110633108633910633108633110633108633910 +6331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331087b +5231c6c6c6c6c6ced6d6d6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efe7ad8c7ba5 +8c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad8c7b39525a395263f7f7f7ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff84a5ad18293118212110424a08bde700d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff +00d6ff00d6ff00d6ff295a6b313139dededee7e7e7c6c6c6424a5218182121292918182110526300c6f700ceff00bdff00bdff00bdf700c6ff00bdff00bdff00 +bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00c6ff00bde7105a73183142847b73a58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad94 +7ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7b734a296339106331106339106331106339106331106339106331106339107b5231 +9c846b947b63ada59cc6c6c6a58c849c846bad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba5 +8c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73ad947ba58c73ad8c7ba58c73efe7e7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff738c9429424abdbdbdffffffffffffffffffffffffefefef +cecece9cb5b5426b7318313118182118212108637b00cef700d6ff00d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00ceff00c6ff00adf7293142525252ff +ffff737b8418212152636bdededeffffffefefef39526318394a00b5d600d6ff00c6ff00c6ff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00c6 +f700c6ef086b841829314a737bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffbdad946331086331106331086339106331086331106331086339106331087b5231c6c6c6c6c6cec6c6c6c6c6cec6c6c6de +dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffefeff7efeff7efefeff7f7f7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffb5bdc621313918292921313921313918212918182118212118182118212110293110637b00 +b5de00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00d6ff00ceff00bdf710a5f71094ef10a5f721526b3131396373732129319c9c9cffffffffffffffff +ffffffffffffff7b8c94182931085a7308bde700d6ff00d6ff00ceff00d6ff00ceff00ceff00ceff00ceff08a5ce10738c1829314a6b7bdee7e7ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7 +d6ce633910633110633910633110633910633110633910633110633910633110c6bdbdc6c6c6c6cecec6c6c6cecececececeffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedee7ced6d6c6c6c6c6cecec6c6c6 +cececec6c6c6c6cecec6cecedededeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffefefef39525a10394a106b7b08637310738c08849c089cbd00add600d6ff00ceff00d6ff00d6ff00d6ff00ceff00d6ff00ce +ff00ceff00bdf708adf71094ef1094f700a5f700bdff00bdf70884ad181821182931a5a5adc6c6cef7f7f7ffffffffffffffffffffffffffffffefefef6b7b8c +18293118394208637b087b940884a508849c086b84105a6b1021311831394a6b7bd6dee7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b39186339106331086331106331 +08633910633108633110633108633910ad9c94c6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffff7f7cec6bdbdad9cad9484b5a594b5ad9cbdb5b5c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6 +c6cecececeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff8c9ca518394208a5ce00ceff00ceff00ceff00d6ff00ceff00ceff00ceff00ceff00c6ff08bdff08a5f7109cf7108cef1094f708a5f708bdff00bdff +00bdff00bdf700c6ff00bdef1829317b848ccececec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffd6d6d68c9ca5637b8c526b7b4a +6b736b8494849ca5d6d6deffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff947352633110633910633110633910633110633910633110633910633110 +9c846bc6c6c6cececec6c6c6c6cecec6c6c6eff7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffce +c6b594735a633918633910633110633910633110633910633110734a299c7b63bdada5c6c6c6cececec6c6c6c6cecec6c6c6cececec6c6c6d6d6deffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6dede21394a105a8c +108cef109cf70894ef1094f7108cef108cef108cef1094ef089cef08adf700b5f700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf70884a5294252c6 +c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffb59c8c6331106331086339106331086331106331086339106331086331107b5231c6c6cec6c6c6c6c6cec6c6c6c6 +c6cedededefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7ef94735a6339106331086331106331086339106331 +08633110633108633910633108633110633108846342b5ada5c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6cececef7f7f7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff526b73105a7300b5f708b5ff00b5f708bdff00 +bdf700bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00ceff1031399ca5a5c6c6c6c6cecec6c6c6cececeffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffded6ce6331106339106331106339106331106339106331106339106331106b3910c6bdbdc6cecec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffff7845a39633910633110633910633110633910633110633910633110633910633110633910633110 +633910633110633910947b63cececec6c6c6c6cecec6c6c6cececec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff29424a088cb500bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700bdff00bdf700c6ff088cad29424ac6c6c6c6c6cec6c6c6c6c6cec6c6c6f7ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b39186331086331106331 +08633910633108633110633108633910633108b5a59cc6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff8c6b526339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339107b5a39c6 +bdbdc6c6c6c6c6cec6c6c6c6c6cec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffdee7e718313908b5e700bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff +00bdff00ceff1839426b6352c6cecec6c6c6cececec6c6c6c6cecee7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c634a633910633110633910633110633910633110633910633110 +6339109c846bcececec6c6c6c6cecec6c6c6cececeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffcebdb563391063311063391063 +3110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910734a29c6c6bdc6c6c6c6cecec6c6c6cece +cec6c6c6ceced6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff94a5ad104a5a00bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf700bdff00bdf70884a5183139734a29c6c6c6c6 +c6cec6c6c6c6c6cec6c6c6dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffb59c84633108633910633108633110633108633910633108633110633108845a42c6c6c6c6c6cec6c6c6c6 +c6cec6c6c6dee7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffff8c6b4a6331086331106331086339106331086331106331086339106331 +086331106331086339106331086331106331086339106331086331106331086339107b5231c6c6bdc6c6c6c6c6cec6c6c6c6c6cec6c6c6dededeffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff42636b0884a500c6ff00 +bdff00bdff00bdf700c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf708bde7182931523118633110c6bdbdc6c6c6c6cecec6c6c6cecececececeffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffd6cebd633910633110633910633110633910633110633910633110633910633910c6c6c6c6c6c6cececec6c6c6c6cecececed6ffffffffffffffff +ffffffffffffffffffffffffffffffffffffff633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110 +6339106331106339106331106339106331106339108c6b52cececec6c6c6c6cecec6c6c6cececec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef21394200a5c600bdff00bdf700bdff00bdf700bdff00bd +f700bdff00bdf700bdff00bdf700ceff104a5a393931633108633910ad9c8cc6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff76331106331106331 +08633910633108633110633108633910633108633110b5a59cc6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffffffffffffffffffffffffffffffffffffffff +e7ded663311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +3110633108633910ad9c94c6c6cec6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffd6dede18394200add600c6ff00bdff00bdff00bdf700c6ff00bdff00bdff00bdf700ceff0884a5 +2139426331106339106331109c7b6bc6c6c6cececec6c6c6c6cecec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff846342633110633910633110633910633110633910633110 +633910633110a58c7bc6c6c6c6cecec6c6c6cececec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffd6c6bd63311063391063311063391063 +3110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110734a21c6c6c6cece +cec6c6c6c6cecec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffc6cece183142009cbd00c6ff00bdf700bdff00bdf700bdff00bdf700ceff0094ad182931523110633910633108633110735231c6 +c6cec6c6c6c6c6cec6c6c6c6c6cedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffad8c7b633910633108633110633108633910633108633110633108633910846342c6c6cec6c6c6c6 +c6cec6c6c6c6c6cededee7ffffffffffffffffffffffffffffffffffffffffffc6b5a563391063310863311063310863391063310863311063310894735aad9c +94b5ada5bdb5b5efefe7ded6ced6c6bd9c846b6b3918633108633110633108633910633108633110633108ad9c8cc6c6c6c6c6cec6c6c6c6c6cec6c6c6dedee7 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde +dede29424a105a7308b5e700c6ff00ceff00ceff08cef708738c182931523110633910633110633910633110633910bdbdbdc6cecec6c6c6cececec6c6c6ced6 +d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffd6c6bd6331106339106331106339106331106339106331106339106331106b3918c6c6c6cececec6c6c6c6cecec6c6c6d6d6deffffffffff +ffffffffffffffffffffffffffffffffd6c6b5633110633910633110633910633110633910633110ad9c8cc6c6c6c6cecec6c6c6ceced6ffffffffffffffffff +fffffff7efef9c7b63633110633910633110633910633110633910734a29c6c6cec6c6c6cececec6c6c6c6cececececeffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c9ca5213139183942085a +731052631021292931315a3110633910633108633110633108633910633108b5a594c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efef6339106331 +08633910633108633110633108633910633108633110633108bdada5c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffff +decec6633110633108633910633108633110633108845a42c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffff9c7b6363310863 +3110633108633910633108633110b5ada5c6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdededeadadb56b52425a3110633110633910633110 +6339106331106339106331106339109c846bcececec6c6c6c6cecec6c6c6cececeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5a39633910633110633910633110633910633110 +633910633110633910a58c7bc6cecec6c6c6cececec6c6c6c6cecef7f7f7fffffffffffffffffffffffffffffffffffffffff763311063391063311063391063 +31106339109c7b63c6cecec6c6c6cececec6c6c6c6cecef7f7f7fffffffffffffffffffffffffffffffff7f7734221633110633910633110633910633110a584 +73c6c6c6c6cecec6c6c6cececec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb59c8c6331086339106331086331106331086339106331086331106331087b +5a39c6c6c6c6c6cec6c6c6c6c6cec6c6c6dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffa58c736331086331106331086339106331086331106331086339106331088c6b4ac6c6c6c6 +c6cec6c6c6c6c6cec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffff7b523163310863311063310863391063310894735ac6c6c6c6c6cec6c6 +c6c6c6cec6c6c6d6dedeffffffffffffffffffffffffffffffffffffad947b633910633108633110633108633910734a29c6c6cec6c6c6c6c6cec6c6c6c6c6ce +dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffdecec6633910633110633910633110633910633110633910633110633910633910c6c6c6c6c6c6cececec6c6c6c6ce +cecececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffcebdad6339106331106339106331106339106331106339106331106339106b3918c6c6cec6c6c6c6cecec6c6c6cececed6d6d6ffff +ffffffffffffffffffffffffffffffffffffffa58c7b6339106331106339106331106339106b3918c6bdbdc6c6c6c6cecec6c6c6cececec6c6c6e7e7e7ffffff +ffffffffffffffffffffffffcec6b5633110633910633110633910633110633910c6bdbdcececec6c6c6c6cecec6c6c6dededeffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff633910633110633108633910633108633110633108633910633108633110b5a59cc6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7efef6331 +08633910633108633110633108633910633108633110633108633910b5ada5c6c6cec6c6c6c6c6cec6c6c6c6ceceffffffffffffffffffffffffffffffffffff +ffffffdecec66331086339106331086331106331086339109c8473c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6def7f7f7ffffffffffffffffffbdad9c63 +3110633108633910633108633110633108bdada5c6c6c6c6c6cec6c6c6c6c6cecececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c6b4a633110633910633110 +633910633110633910633110633910633110a58c73c6c6c6c6cecec6c6c6cececec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b5231633110633910633110633910633110 +633910633110633910633110ad9484c6c6c6cececec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffff734a2963311063391063 +3110633910633110633910a58c7bcececec6c6c6c6cecec6c6c6cececec6c6c6c6cececececedededededede7b5a396331106339106331106339106331106339 +10ad9c8cc6cecec6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad948463391063310863311063310863391063310863311063310863 +39107b5a39c6c6cec6c6c6c6c6cec6c6c6c6c6cedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c846b6331106331086339106331086331106331086339106331086331108c6b52c6 +c6cec6c6c6c6c6cec6c6c6c6c6cee7e7e7ffffffffffffffffffffffffffffffffffffffffffad947b6331106331086339106331086331106331086339108463 +4ab5a59cc6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cebdb5ad8c6b52633108633910633108633110633108633910633108a59484c6c6c6c6c6cec6c6c6c6c6ce +ceced6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffdecec66331106339106331106339106331106339106331106339106331106b3918c6c6bdcececec6c6c6c6ce +cec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffceb5ad633110633910633110633910633110633910633110633910633110734a21c6c6c6c6cecec6c6c6cececec6c6c6dede +defffffffffffffffffffffffffffffffffffffffffff7f7f76b3918633910633110633910633110633910633110633910633110734a217b5a3994735a94735a +8c634a734a29633910633110633910633110633910633110633910633110633910a58c7bcececec6c6c6c6cecec6c6c6dededeffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffff7f7f7633910633108633910633108633110633108633910633108633110633108b5ada5c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe7 +de633910633108633110633108633910633108633110633108633910633108bdb5b5c6c6c6c6c6cec6c6c6c6c6cec6c6ceffffffffffffffffffffffffffffff +ffffffffffffffffffb59c8463310863311063310863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +3110633108633910633108633110633108b5a59cc6c6c6c6c6cec6c6c6c6c6cee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff845a42633910633110 +633910633110633910633110633910633110633910a58c7bc6cecec6c6c6cececec6c6c6c6ceceefeff7ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a29633910633110633910633110 +633910633110633910633110633910ad9484cececec6c6c6c6cecec6c6c6cececef7f7f7fffffffffffffffffffffffffffffffffffffffffffff7f77b523163 +31106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10bdb5adc6cecec6c6c6cececec6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad947b63310863311063310863391063310863311063310863 +391063310884634ac6c6c6c6c6cec6c6c6c6c6cec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c7b6363310863391063310863311063310863391063310863311063310894 +735ac6c6c6c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffe7ded66b39186331086331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633110c6c6bdc6c6c6c6c6cec6c6c6dedede +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffcec6b5633910633110633910633110633910633110633910633110633910633918c6c6c6c6c6c6c6ce +cec6c6c6cececed6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffbdad9c633910633110633910633110633910633110633910633110633910734a29c6cecec6c6c6cececec6c6c6c6ce +ced6dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5a5633910633110633910633110633910633110633910633110633910633110 +633910633110633910633110633910633110633910633110633910633110947352c6c6c6cececec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffff7f7ef633110633910633108633110633108633910633108633110633108633910b5ada5c6c6cec6c6c6c6c6cec6c6c6c6c6ceffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffefe7de633108633110633108633910633108633110633108633910633108633110bdb5b5c6c6cec6c6c6c6c6cec6c6c6cececeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffc6b5a56b391863310863311063310863391063310863311063310863391063310863311063310863391063310863 +3110633108633910633108633910bdb5adc6c6cec6c6c6ceced6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff845a39633110 +633910633110633910633110633910633110633910633110a59484c6c6c6cececec6c6c6c6cecec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a21633110633910633110 +633910633110633910633110633910633110b5a594c6c6c6c6cecec6c6c6cececec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffd6cebd6b4221633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910ad9484cece +cec6c6cededee7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5846b63311063310863391063310863311063310863 +39106331086331108c6b4ac6c6cec6c6c6c6c6cec6c6c6c6c6cee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94735a63391063310863311063310863391063310863311063310863 +3910947363c6c6cec6c6c6c6c6cec6c6c6c6c6cee7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe79c7b636331 +08633110633108633910633108633110633108633910633108633110633108633910633108633910a58c7bd6d6d6e7e7e7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffcebdad6331106339106331106339106331106339106331106339106331106b4221c6c6c6c6ce +cec6c6c6cececec6c6c6d6dedeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffbdad9c6331106339106331106339106331106339106331106339106331107b5231c6c6c6cececec6c6c6c6ce +cec6c6c6dedee7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce94735a6b3918633110633910633110 +633910633110633910633110633910633110845a39d6c6bdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffefefe7633910633108633110633108633910633108633110633108633910633108bdb5adc6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffded6ce633110633108633910633108633110633108633910633108633110633108c6bdbdc6c6c6c6c6cec6c6c6c6c6cecececeffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe7cebdada58c739473527b5a397b5231846342947b5aad9484e7 +ded6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff735231 +633910633110633910633110633910633110633910633110633910a59484cececec6c6c6c6cecec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b4218633910633110 +633910633110633910633110633910633110633910b5a594c6cecec6c6c6cececec6c6c6c6ceceffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffefefefefefefe7efefefefefefefefefefefe7efefefefefefefefefefefe7efefefefefefefefefefefe7efefefef +efefefefefefefe7efefefefefefefefefefefe7efefefefefefefefefefefe7efefefefefefefefefefefe7efefefefefefefefefefefffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c846b63310863391063310863311063310863 +391063310863311063310894735ac6c6c6c6c6cec6c6c6c6c6cec6c6c6e7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94735263310863311063310863391063310863311063310863 +39106331089c846bc6c6c6c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7ced6d6c6c6 +c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6ce +c6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6cececed6d6d6ceced6c6c6c6efefefffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6b5a56339106331106339106331106339106331106339106331106339106b4221c6c6 +cec6c6c6cececec6c6c6c6ceced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffb59c8c6339106331106339106331106339106331106339106331106339107b5231cececec6c6c6c6ce +cec6c6c6cececedededefffffffffffffffffffffffffffffffffffffffffff7f7efad947b9c8473a58c7b9c8c73a58c7b9c8473a58c7b9c8c73a58c7b9c8473 +a58c7b9c8c73a58c7b9c8473a58c7b9c8c73a58c7b9c8473a58c7b9c8c73a58c7b9c8473a58c7b9c8c73a58c7b9c8473a58c7b9c8c73a58c7b9c8473a58c7b9c +8c73a58c7ba5947bd6d6d6c6c6c6c6cecec6c6c6cececedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffefe7e7633108633110633108633910633108633110633108633910633108633110bdb5adc6c6cec6c6c6c6c6cec6c6c6cecece +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffded6ce633108633910633108633110633108633910633108633110633108633910bdbdbdc6c6cec6c6c6c6c6cec6c6c6ceced6ffffffffffff +ffffffffffffffffffffffffffffffffffff6b391863391063310863311063310863391063310863311063310863391063310863311063310863391063310863 +3110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910bdbdbdc6c6cec6c6 +c6c6c6cec6c6c6ced6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +734a29633110633910633110633910633110633910633110633910633110ad9c8cc6c6c6c6cecec6c6c6cececec6c6c6ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b4218633110 +633910633110633910633110633910633110633910633110b5a59cc6c6c6cececec6c6c6c6cecec6c6c6ffffffffffffffffffffffffffffffffffffffffffff +ffff9473526331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110b5ad9cc6c6c6cececec6c6c6c6cecec6c6c6ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff947b5a63391063310863311063310863 +391063310863311063310863391094735ac6c6cec6c6c6c6c6cec6c6c6c6c6cee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84634a63311063310863391063310863311063310863 +39106331086331109c846bc6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffb59c8c6331106331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +6331086339106331086331106331086339106331086331109c846bc6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6ada5633110633910633110633910633110633910633110633910633110734a +29c6c6c6cececec6c6c6c6cecec6c6c6dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffb59c8c633110633910633110633910633110633910633110633910633110846342c6c6c6c6ce +cec6c6c6cececec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffffded6ce633110633910633110633910633110633910633110633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110846342c6c6c6c6cecec6c6c6cececec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffe7ded6633110633108633910633108633110633108633910633108633110633108c6bdb5c6c6c6c6c6cec6c6c6c6c6ce +c6c6ceffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffd6cebd633910633108633110633108633910633108633110633108633910633110c6c6c6c6c6c6c6c6cec6c6c6c6c6cececed6ffffff +ffffffffffffffffffffffffffffffffffffffffff6b391863310863311063310863391063310863311063310863391063310863311063310863391063310863 +3110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633110c6c6c6c6c6 +c6c6c6cec6c6c6c6c6cececed6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff6b4221633910633110633910633110633910633110633910633110633910ad9c94c6cecec6c6c6cececec6c6c6c6cecef7f7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff633910 +633910633110633910633110633910633110633910633110633910b5ad9ccececec6c6c6c6cecec6c6c6cececeffffffffffffffffffffffffffffffffffffff +ffffffffff8c634a6339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339106331106339 +10633110633910633110633910633110633910633110633910633110633910633110633910633110633910b5ad9ccececec6c6c6c6cecec6c6c6cececeffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94735a63310863311063310863 +3910633108633110633108633910633108947b63c6c6c6c6c6cec6c6c6c6c6cec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84634263310863391063310863311063310863 +3910633108633110633108a58c7bc6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffb59c846331086339106331 +08633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +633108633910633108633110633108633910633108633110633108a58c7bc6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbda5946339106331106339106331106339106331106339106331106339 +10735231cececec6c6c6c6cecec6c6c6cececedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad947b633910633110633910633110633910633110633910633110633910846342c6ce +cec6c6c6cececec6c6c6c6cecedee7e7ffffffffffffffffffffffffffffffffffffffffffd6cebd633910633110633910633110633910633110633910633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063 +3110633910633110633910846342c6cecec6c6c6cecececed6d6efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffe7d6ce633108633910633108633110633108633910633108633110633108633910bdbdb5c6c6cec6c6c6c6c6ce +c6c6c6cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffd6c6bd6331086331106331086339106331086331106331086339106331086b3918c6bdc6c6c6cec6c6c6c6c6cec6c6c6d6d6d6 +ffffffffffffffffffffffffffffffffffffffffffffffffcebdb5d6c6b5cec6b5845a4263310863311063310863391063310863311063310863391063311063 +31106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086331106331086339106331086b3918c6c6 +cee7e7e7f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff6b4221633110633910633110633910633110633910633110633910633110b5a59cc6c6c6cececec6c6c6c6cecec6c6c6ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7 +633910633110633910633110633910633110633910633110633910633110bdb5adc6c6c6c6cecec6c6c6cececec6c6ceffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffbdad9c6331106339106331106339106331107b5239ad9c94bdb5adbdbdbdd6d6d6f7f7efe7ded6bda5947b52296331106339 +10633110633910633110845a42bdbdbdc6c6c6c6c6c6c6c6cec6c6c6c6c6c6c6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c6b4a63311063310863 +39106331086331106331086339106331086331109c7b6bc6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b523963391063310863311063310863 +3910633108633110633108633910a58c7bc6c6cec6c6c6c6c6cec6c6c6c6c6ceeff7f7ffffffffffffffffffffffffffffffffffffffffffffffffefe7de6331 +10633110633108633910633108734a29bdbdbdc6c6cec6c6c6c6c6ced6d6deffffffffffffffffffffffffad8c7b6331086331106331086339106331087b5231 +bdbdbdc6c6cec6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5a58c6331106339106331106339106331106339106331106339 +10633110845a39c6c6c6c6cecec6c6c6cececec6c6c6dee7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad8c7b6331106339106331106339106331106339106331106339106331108c6b +52c6c6c6cececec6c6c6c6cecec6c6c6e7e7efffffffffffffffffffffffffffffffffffffffffffffffff9c846b633910633110633910633110633910a58c7b +cececec6c6c6c6cecec6c6c6d6d6d6ffffffffffffffffffffffffffffffa584736331106339106331106339106331108c6b52c6c6c6c6cecec6c6c6cececec6 +c6c6c6ceceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffdecec6633910633108633110633108633910633108633110633108633910633108c6bdbdc6c6c6c6c6ce +c6c6c6c6c6cecececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffcebdad6331106331086339106331086331106331086339106331086331106b3918c6c6c6c6c6c6c6c6cec6c6c6c6c6ce +d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffff7b5231633108633910633108633110633108ad9c8cc6c6c6c6c6cec6c6c6c6c6cec6c6c6f7 +f7f7ffffffffffffffffffffffffefefe76b3918633108633110633108633910633108ad9484c6c6c6c6c6cec6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff633918633910633110633910633110633910633110633910633110633910b5a59ccececec6c6c6c6cecec6c6c6cececeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f7f7ef633110633910633110633910633110633910633110633910633110633910bdb5adc6cecec6c6c6cececec6c6c6cececeffffffffffffffffffffffffff +ffffffffffffffffffffff633910633910633110633910633110633910947b63c6cecec6c6c6cececec6c6c6c6cecec6ceceffffffffffffffffffffffffffff +ff9473526339106331106339106331106339106b4218c6c6c6c6c6c6c6cecec6c6c6cececec6c6c6ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c634a63310863 +3910633108633110633108633910633108633110633108a58473c6c6c6c6c6cec6c6c6c6c6cec6c6c6efeff7ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b523163310863311063310863 +3910633108633110633108633910633108a59484c6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffff6b42216331 +08633110633108633910633108633910bdb5b5c6c6cec6c6c6c6c6cec6c6c6c6c6cec6c6c6e7e7e7ffffffffffffffffff94735a633108633910633108633110 +633108633910a58c7bc6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad94846339106331106339106331106339106331106339 +10633110633910845a42c6cecec6c6c6cececec6c6c6c6cecedededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c846b6339106331106339106331106339106331106339106331106339 +108c6b52cececec6c6c6c6cecec6c6c6cececee7e7e7ffffffffffffffffffffffffffffffffffffffffff7b5a39633910633110633910633110633910633110 +7b5231bdb5b5c6cecec6c6c6cececec6c6c6c6cecec6c6c6cececececececec6c66b3918633910633110633910633110633910633110846342c6c6c6cececec6 +c6c6c6cecec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffd6cebd633108633110633108633910633108633110633108633910633108633910bdbdbdc6c6ce +c6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffc6b5ad6331086339106331086331106331086339106331086331106331086b4221c6c6c6c6c6cec6c6c6c6c6ce +c6c6c6d6d6deffffffffffffffffffffffffffffffffffffffffff9c846b6331086339106331086331106331086339106331086b3918947b63bdb5adbdbdbdc6 +c6cec6c6c6c6c6cebdbdbdad9c8c734a29633910633108633110633108633910633108633110633108c6c6c6c6c6c6c6c6cec6c6c6c6c6ced6d6d6ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffff7f76b3910633110633910633110633910633110633910633110633910633110bdada5c6c6c6c6cecec6c6c6cececec6c6c6ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffefe7e7633910633110633910633110633910633110633910633110633910633110bdb5b5c6c6c6cececec6c6c6c6cecec6c6ceffffffffffffffffffff +ffffffffffffffffffffffd6c6bd6339106331106339106331106339106331106339106331106339106331106339106b42217b52316b39186339106331106339 +10633110633910633110633910633110633910633110633910bdb5adc6cecec6c6c6cececec6c6c6dededeffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff845a3963 +39106331086331106331086339106331086331106331086339109c8473c6c6cec6c6c6c6c6cec6c6c6c6c6ceefefefffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff734a2963311063310863 +3910633108633110633108633910633108633110ad9484c6c6cec6c6c6c6c6cec6c6c6c6c6cef7f7f7ffffffffffffffffffffffffffffffffffffffffff6b42 +21633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +633108633910633108b5a59cc6c6c6c6c6cec6c6c6c6c6cedee7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad947b6331106339106331106339106331106339 +106331106339106331108c634ac6c6c6cececec6c6c6c6cecec6c6c6e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c7b636331106339106331106339106331106339106331106339 +10633110947b63c6c6c6c6cecec6c6c6cececec6c6c6efefefffffffffffffffffffffffffffffffffffffffffffc6b5a5633110633910633110633910633110 +633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910633110633910bdada5cececec6 +c6c6c6cecec6c6c6f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcebdb5633110633108633910633108633110633108633910633108633110633910c6c6c6 +c6c6c6c6c6cec6c6c6c6c6ceced6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffbdad9c6339106331086331106331086339106331086331106331086339106b4221c6c6cec6c6c6c6c6ce +c6c6c6c6c6ced6d6deffffffffffffffffffffffffffffffffffffffffffffffff8c634a63310863311063310863391063310863311063310863391063310863 +3110633108633910633108633110633108633910633108633110633108633910633108633110633108cec6c6c6c6c6c6c6cec6c6c6d6d6d6ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffff7f7f7633110633910633110633910633110633910633110633910633110633910bdada5c6cecec6c6c6cececec6c6c6cececeff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffefe7de633110633910633110633910633110633910633110633910633110633910bdb5b5cececec6c6c6c6cecec6c6c6ceced6ffffffffffffff +fffffffffffffffffffffffffffffffffff7f7ef7b52316331106339106331106339106331106339106331106339106331106339106331106339106331106339 +106331106339106331106339106331106339106331107b5a39c6c6c6c6cecec6c6c6cececef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b +5a39633108633110633108633910633108633110633108633910633108a5947bc6c6c6c6c6cec6c6c6c6c6cec6c6c6f7f7f7ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73422163310863 +3910633108633110633108633910633108633110633108ad9c94c6c6c6c6c6cec6c6c6c6c6cec6c6c6ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffefe7e7845a39633108633110633108633910633108633110633108633910633108633110633108633910633108633110633108633910633108633110 +633108633910b5ada5c6c6cec6c6c6cececeefeff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa58c736339106331106339106331106339 +106331106339106331106339108c6b4acececec6c6c6c6cecec6cecee7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94735a6339106331106339106331106339106331106339 +10633110633910947b63c6cecec6c6c6cecececececee7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a58473633110 +63391063311063391063311063391063311063391063311063391063311063391063311063391063311063391063311063391094735ac6cececececee7e7e7ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcebdad6331086339106331086331106331086339106331086331106331086b4221 +c6c6c6dededeefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffbdad9c6331086331106331086339106331086331106331086339106331087b5231c6c6cededede +efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffded6ce8c6b4a63311063310863391063310863 +3110633108633910633108633110633108633910633108633110633108633910947b63dededef7f7f7ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffefe7e7efe7deefe7deefe7deefe7e7efe7deefe7deefe7deefe7e7efe7deffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffff7efe7deefe7deefe7e7efe7deefe7deefe7deefe7e7efe7deefe7deefe7deffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7ded6ad9484734a296339106331106339106331106339106331106339 +10633110633910633910947352decec6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe7d6c6bdb5a58cad9484a58473a58c73ad9484bda594d6cebdfffff7ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff040000002701ffff030000000000}}}{\insrsid6836014 +\par }\pard \s15\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0 {\insrsid11820290 +\par }{\insrsid14104483 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }{\insrsid11820290 +\par }{\fs20\insrsid14104483\charrsid14104483 This work is licensed under the Creative Commons Attribution License. To view a copy of th +is license, visit http://creativecommons.org/licenses/by/2.0/at/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.}{\fs20\insrsid11820290\charrsid14104483 +\par }{\insrsid11820290 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0\pararsid14500044 \b\fs32\cf1\lang1033\langfe255\loch\af1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 {\insrsid11820290 \page }{ +\insrsid11820290\charrsid14500044 \hich\af0\dbch\af0\loch\f1 Introduction}{\insrsid11820290 +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid13114330 The #develop project }{\insrsid1529975 started}{\insrsid13114330 on September 11}{ +\super\insrsid13114330\charrsid13114330 th}{\insrsid13114330 , 2000. }{\insrsid5311771 The project}{\insrsid13114330 was }{\insrsid2386661 initiated}{\insrsid13114330 by Mike Kr\'fcger, who }{\insrsid5311771 +is the main developer and architect of #develop to date. In the course of the project, Mike was joined by several }{\insrsid2386661 contributors}{\insrsid5311771 , who have helped a great deal to make the 1.0 release}{\insrsid11820290 a successful one}{ +\insrsid5311771 \endash though it took us four years and a few architectural changes along the way.}{\insrsid11820290 +\par +\par With version 1.0, we have built a solid foundation for the growth of this Integrated Development Environment. Though the features found inside the IDE should not be considered \'93basic\'94, we have plans for the future and w +e are sure that you will like those too. +\par +\par }{\insrsid13114330 +\par }{\b\i\insrsid13114330\charrsid13114330 The #develop team +\par }{\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://www.icsharpcode.net/pub/relations/team.aspx" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6600000068007400740070003a002f002f007700770077002e00690063007300680061007200700063006f00640065002e006e00650074002f007000750062002f00720065006c006100740069006f006e0073002f00 +7400650061006d002e006100730070007800000000}}}{\fldrslt {\cs26\ul\cf2\insrsid13114330\charrsid14104483 http://www.icsharpcode.net/pub/relations/team.aspx}}}{\insrsid13114330\charrsid13114330 +\par }{\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.Contributors" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b8800000068007400740070003a002f002f00770069006b0069002e007300680061007200700064006500760065006c006f0070002e006e00650074002f00640065006600610075006c0074002e006100730070007800 +2f005300680061007200700044006500760065006c006f0070002e0043006f006e007400720069006200750074006f0072007300000000}}}{\fldrslt {\cs26\ul\cf2\insrsid13114330\charrsid14104483 http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.Contributors}}}{ +\insrsid13114330\charrsid13114330 +\par }{\insrsid11820290 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0\pararsid14500044 \b\fs32\cf1\lang1033\langfe255\loch\af1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 {\insrsid14500044 \hich\af0\dbch\af0\loch\f1 +Overview}{\insrsid11820290 +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid8998230\charrsid8998230 #develop (short for SharpDevelop) is a free }{\insrsid8998230 +Integrated Development Environment (IDE)}{\insrsid8998230\charrsid8998230 for C#}{\insrsid1529975 , }{\insrsid8998230\charrsid8998230 VB.NET}{\insrsid1529975 , Managed C++ and ILAsm}{\insrsid8998230\charrsid8998230 + projects on Microsoft's .NET platform.}{\insrsid8998230 It is written entirely in C#, and comes }{\insrsid1529975 with features you would expect in an IDE}{\insrsid16001860 plus a few more}{\insrsid1529975 \endash the next section details those.}{ +\insrsid14500044\charrsid8998230 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0\pararsid14500044 \b\fs32\cf1\lang1033\langfe255\loch\af1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 {\insrsid14500044 \hich\af0\dbch\af0\loch\f1 +Features +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 Code Completion +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid478716 No IDE would be complete without this feature, which is supported for both +C# and VB.NET. Write a statement followed by the . (dot) and code completion will kick in. Too lazy to type that long variable or class name? Press }{\insrsid1529975 Ctrl+Space}{\insrsid478716 + and #develop will provide you with potential candidates for what you began to type.}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 Forms Designer +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid478716 A Windows Forms Designer ships insi +de #develop for both C# and VB.NET. It comes with full design time support, roundtripping and generally saves you a lot of time when developing Windows-based client software. Note: there is no designer for ASP.NET Web forms.}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\lang1031\langfe1033\langnp1031\insrsid1529975\charrsid16001860 Code AutoInsert +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\lang1033\langfe255\langnp1033\insrsid478716\charrsid478716 +Tired of implementing interface definition}{\lang1033\langfe255\langnp1033\insrsid478716 s}{\lang1033\langfe255\langnp1033\insrsid478716\charrsid478716 , }{\lang1033\langfe255\langnp1033\insrsid478716 overrideables, }{ +\lang1033\langfe255\langnp1033\insrsid478716\charrsid478716 writing get and set accessors for }{\lang1033\langfe255\langnp1033\insrsid478716 various }{\lang1033\langfe255\langnp1033\insrsid478716\charrsid478716 member variable}{ +\lang1033\langfe255\langnp1033\insrsid478716 s? }{\lang1033\langfe255\langnp1033\insrsid1529975\charrsid478716 Alt+Ins}{\lang1033\langfe255\langnp1033\insrsid478716 is your ticket to time saving. Just select the action you want to perform a +nd the tedious typing work is taken care of for you.}{\lang1033\langfe255\langnp1033\insrsid1529975\charrsid478716 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\lang1031\langfe1033\langnp1031\insrsid1529975\charrsid16001860 Code Converter +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\lang1033\langfe255\langnp1033\insrsid478716\charrsid478716 You are a VB.NET developer. }{ +\lang1033\langfe255\langnp1033\insrsid478716 You find a sample that exactly solves your problem. It is C#. Sound familiar? No problem with #develop \endash it comes with conversion from C# to VB.NET and vice versa. +And it does its magic on the project level too, }{\lang1033\langfe255\langnp1033\insrsid15797313 so }{\lang1033\langfe255\langnp1033\insrsid478716 converting entire projects}{\lang1033\langfe255\langnp1033\insrsid15797313 is a piece of cake}{ +\lang1033\langfe255\langnp1033\insrsid478716 . Combined with the next feature, this }{\lang1033\langfe255\langnp1033\insrsid15797313 really }{\lang1033\langfe255\langnp1033\insrsid478716 becomes a time saver.}{ +\lang1033\langfe255\langnp1033\insrsid1529975\charrsid478716 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 VS.NET Solution Import / Export + +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14353066 You can import Visual Studio .NET solutions (.sln + as well as the project files only, which is especially helpful for ASP.NET projects) into #develop. Export is also supported, but please note that because #develop is capable of deeper project nesting than VS.NET, this hierarchy will be flattened}{ +\insrsid15797313 if necessary}{\insrsid14353066 .}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 Folding +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14353066 +Considered a standard feature in modern development editors, folding code regions is supported by #develop based on the parsing information of your code files. Folding state is remembered for you}{\insrsid15797313 across development sessions}{ +\insrsid14353066 .}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 Integrated NUnit Unit Testing +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14353066 View / Tools / Unit Tests is an integrated NUnit +front end for executing unit tests in your assembly. No need to leave the development environment, do test-first-design inside your IDE!}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 Assembly Analyzer +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14353066 When you have built your project, go to View / Assembly Analyzer. +It will point out errors and make suggestions to improve your code\rquote s compliance to .NET coding standards. This is comparable to the separately available FxCop tool}{\insrsid15797313 from Microsoft}{\insrsid14353066 +, however integrated into your development experience.}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 XML Documentation Preview +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14353066 You have written an XML documentation comment \endash want +to know how it will look like in the help file? Simply place the cursor in the comment and press Ctrl+Q. And when you are satisfied, use Project / Generate Documentation to let NDoc create the help file for you.}{\insrsid1529975 +\par }\pard\plain \s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid16001860 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid1529975 And more}{\insrsid16001860 \'85}{ +\insrsid1529975 +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid16001860 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid16001860 To pick a few of the other features that are supported by #develop +, starting with the obvious: s}{\insrsid1529975 yntax highlighting, intelligent braces, bookmarks, code templates, regular expressions toolkit, }{\insrsid16001860 New Class wizard, HTML export, Class browser, NDoc integration, NProf integration}{ +\insrsid1529975 . +\par }\pard\plain \s15\ql \li0\ri0\nowidctlpar\aspalpha\faauto\rin0\lin0\itap0\pararsid14104483 \fs24\cf1\lang1033\langfe255\cgrid\langnp1033\langfenp255 {\insrsid1529975 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0\pararsid14104483 \b\fs32\cf1\lang1033\langfe255\loch\af1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 {\insrsid14104483 \hich\af0\dbch\af0\loch\f1 +Documentation}{\f38\insrsid14104483\charrsid14104483 +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14104483 The Help system inside #develop +has not been updated for version 1.0. Though most of the information still should be applicable, it is neither complete nor guaranteed to work as advertised. Plans are to move the entire help system to a Web based content management system to provide you +with the most up to date information and give our help authors an easy way to build the help experience.}{\insrsid14500044 +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0\pararsid14500044 \b\fs32\cf1\lang1033\langfe255\loch\af1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 {\insrsid14500044 \hich\af0\dbch\af0\loch\f1 +Support +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid14104483 +Our primary means of support is via our Web-based forum (please do not email team members directly unless they advise you to do so in the forum):}{\insrsid14500044 +\par }{\insrsid14104483 +\par }\pard \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0\pararsid14104483 {\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://www.icsharpcode.net/opensource/sd/forum/" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6000000068007400740070003a002f002f007700770077002e00690063007300680061007200700063006f00640065002e006e00650074002f006f00700065006e0073006f0075007200630065002f00730064002f00 +66006f00720075006d002f00000000}}}{\fldrslt {\cs26\ul\cf2\insrsid14104483\charrsid14104483 http://www.icsharpcode.net/opensource/sd/forum/}}}{\insrsid14104483 +\par +\par Before posting, we would like to encourage you to visit the following Wiki pages: +\par +\par }{\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.FrequentlyAskedQuestions1x" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90ba400000068007400740070003a002f002f00770069006b0069002e007300680061007200700064006500760065006c006f0070002e006e00650074002f00640065006600610075006c0074002e006100730070007800 +2f005300680061007200700044006500760065006c006f0070002e004600720065007100750065006e0074006c007900410073006b00650064005100750065007300740069006f006e00730031007800000000}}}{\fldrslt {\cs26\ul\cf2\insrsid14104483\charrsid14104483 +http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.FrequentlyAskedQuestions1x}}}{\insrsid14104483 +\par }{\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.BugList1x" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000004100000068007400740070003a002f002f00770069006b0069002e007300680061007200700064006500760065006c006f0070002e006e00650074002f00640065006600610075006c0074002e0061007300700078002f005300680061007200700044006500 +760065006c006f0070002e004200750067004c00690073007400310078000000e0c9ea79f9bace118c8200aa004ba90b8200000068007400740070003a002f002f00770069006b0069002e007300680061007200700064006500760065006c006f0070002e006e00650074002f00640065006600610075006c0074002e0061 +007300700078002f005300680061007200700044006500760065006c006f0070002e004200750067004c0069007300740031007800000000}}}{\fldrslt {\cs26\ul\cf2\insrsid14104483\charrsid7266 http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.BugList1x}}}{\insrsid14104483 + +\par +\par When reporting bugs, please use the Bug Reporting forum and be sure to revisit the sticky topics on how to make good bug reports. Please provide us with steps to reproduce the error. +\par }\pard\plain \s1\ql \li0\ri0\sb240\sa60\keepn\nowidctlpar\aspalpha\faauto\outlinelevel0\rin0\lin0\itap0\pararsid14500044 \b\fs32\cf1\lang1033\langfe255\loch\af1\hich\af0\dbch\af0\cgrid\langnp1033\langfenp255 {\insrsid14500044 \hich\af0\dbch\af0\loch\f1 +License +\par }\pard\plain \s17\qj \fi1\li360\ri0\nowidctlpar\aspalpha\faauto\rin0\lin360\itap0 \fs24\cf1\lang2057\langfe255\cgrid\langnp2057\langfenp255 {\insrsid11820290 #develop\rquote s source code is GPL licensed (please se +e license.txt for the GPL in its entire length). Should you have questions about the GPL, please }{\insrsid15797313 visit}{\insrsid11820290 the following URLs:}{\insrsid14500044 +\par }{\insrsid11820290 +\par }{\insrsid11820290\charrsid11820290 Frequently Asked Questions about the GNU GPL}{\insrsid11820290 +\par }{\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://www.gnu.org/licenses/gpl-faq.html" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5200000068007400740070003a002f002f007700770077002e0067006e0075002e006f00720067002f006c006900630065006e007300650073002f00670070006c002d006600610071002e00680074006d006c000000 +00}}}{\fldrslt {\cs26\ul\cf2\insrsid11820290\charrsid14104483 http://www.gnu.org/licenses/gpl-faq.html}}}{\insrsid11820290\charrsid11820290 +\par }{\insrsid11820290 +\par IC#Code }{\insrsid11820290\charrsid11820290 FAQ: Open Source Licenses (GPL, LGPL}{\insrsid11820290 )}{\insrsid11820290\charrsid11820290 +\par }{\field{\*\fldinst {\insrsid14104483 HYPERLINK "http://www.icsharpcode.net/opensource/sd/forum/forum.asp?FORUM_ID=12" }{\insrsid8399799 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b8a00000068007400740070003a002f002f007700770077002e00690063007300680061007200700063006f00640065002e006e00650074002f006f00700065006e0073006f0075007200630065002f00730064002f00 +66006f00720075006d002f0066006f00720075006d002e006100730070003f0046004f00520055004d005f00490044003d0031003200000000}}}{\fldrslt {\cs26\ul\cf2\insrsid11820290\charrsid14104483 http://www.icsharpcode.net/opensource/sd/forum/forum.asp?FORUM_ID=12}}}{ +\insrsid11820290 +\par }{\insrsid16001860 +\par }{\insrsid16001860\charrsid11820290 +\par }} \ No newline at end of file diff --git a/doc/technotes/AddInBuildingGuide.sxw b/doc/technotes/AddInBuildingGuide.sxw new file mode 100644 index 0000000000..d04d3d6c73 Binary files /dev/null and b/doc/technotes/AddInBuildingGuide.sxw differ diff --git a/doc/technotes/CodingStyleGuide.sxw b/doc/technotes/CodingStyleGuide.sxw new file mode 100644 index 0000000000..dea563284f Binary files /dev/null and b/doc/technotes/CodingStyleGuide.sxw differ diff --git a/doc/technotes/TechicalWritingMadeEasier.sxw b/doc/technotes/TechicalWritingMadeEasier.sxw new file mode 100644 index 0000000000..fb70bdc491 Binary files /dev/null and b/doc/technotes/TechicalWritingMadeEasier.sxw differ diff --git a/doc/technotes/TheFineArtOfCommenting.sxw b/doc/technotes/TheFineArtOfCommenting.sxw new file mode 100644 index 0000000000..bb18054918 Binary files /dev/null and b/doc/technotes/TheFineArtOfCommenting.sxw differ diff --git a/setup/Corsavy.nsi b/setup/Corsavy.nsi new file mode 100644 index 0000000000..7eb1bcfe9a --- /dev/null +++ b/setup/Corsavy.nsi @@ -0,0 +1,228 @@ +!verbose 3 + +!define PRODUCT_NAME "SharpDevelop" +!define PRODUCT_VERSION "Corsavy Alpha" +!define PRODUCT_PUBLISHER "ic#code" +!define PRODUCT_WEB_SITE "http://www.icsharpcode.net/opensource/sd/" +!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\SharpDevelop.exe" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\SharpDevelop" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" + +!define MUI_WELCOMEFINISHPAGE_BITMAP "wizard-image.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "wizard-image.bmp" + +BrandingText "© 2000-2004 ic#code, http://www.icsharpcode.net/" +SetCompressor lzma +CRCCheck on + +; File Association defines +!include "fileassoc.nsh" + +; MUI 1.67 compatible ------ +!include "MUI.nsh" + +; MUI Settings +!define MUI_ABORTWARNING +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" + +; Welcome page +!insertmacro MUI_PAGE_WELCOME +; License page +!insertmacro MUI_PAGE_LICENSE "..\doc\license.txt" +; Directory page +!insertmacro MUI_PAGE_DIRECTORY +; Instfiles page +!insertmacro MUI_PAGE_INSTFILES +; Finish page +!define MUI_FINISHPAGE_RUN "$INSTDIR\bin\SharpDevelop.exe" +!define MUI_FINISHPAGE_RUN_TEXT "Run #develop" +!insertmacro MUI_PAGE_FINISH + +; Uninstaller pages +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +; Language files +!insertmacro MUI_LANGUAGE "English" + +; Reserve files +!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + +; MUI end ------ + +Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" +OutFile "Setup.exe" +InstallDir "$PROGRAMFILES\SharpDevelop" +InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" +ShowInstDetails show +ShowUnInstDetails show + +; .NET Framework check +; http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dnnetdep/html/redistdeploy1_1.asp +; Section "Detecting that the .NET Framework 1.1 is installed" +Function .onInit + ReadRegDWORD $R0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" Install + StrCmp $R0 "" 0 CheckPreviousVersion + MessageBox MB_OK "Microsoft .NET Framework 1.1 was not found on this system.$\r$\n$\r$\nUnable to continue this installation." + Abort + + CheckPreviousVersion: + ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" + StrCmp $R0 "" CheckOSVersion 0 + MessageBox MB_OK "An old version of SharpDevelop is installed on this computer, please uninstall first.$\r$\n$\r$\nUnable to continue this installation." + Abort + + CheckOSVersion: + Call IsSupportedWindowsVersion + Pop $R0 + StrCmp $R0 "False" NoAbort 0 + MessageBox MB_OK "The operating system you are using is not supported by SharpDevelop (95/98/ME/NT3.x/NT4.x)." + Abort + + NoAbort: +FunctionEnd + +Section "MainSection" SEC01 + SetOutPath "$INSTDIR" + SetOverwrite ifnewer + + ; Those files are included with the installer + File /r ..\AddIns + File /r ..\bin + File /r ..\data + File /r ..\doc + + CreateDirectory "$SMPROGRAMS\SharpDevelop" + CreateShortCut "$SMPROGRAMS\SharpDevelop\SharpDevelop.lnk" "$INSTDIR\bin\SharpDevelop.exe" + CreateShortCut "$DESKTOP\SharpDevelop.lnk" "$INSTDIR\bin\SharpDevelop.exe" + + CreateShortCut "$SMPROGRAMS\SharpDevelop\SharpDevelop Help.lnk" "$INSTDIR\doc\help\sharpdevelop.chm" + + ; Add default file associations + ; CreateFileAssociation extension extType extDef exeCmd defIcon + ${CreateFileAssociation} ".cmbx" "SD.cmbxfile" "#Develop Combine" "$INSTDIR\bin\SharpDevelop.exe" "$INSTDIR\data\resources\filetypes\cmbx.ico" + ${CreateFileAssociation} ".prjx" "SD.prjxfile" "#Develop Project" "$INSTDIR\bin\SharpDevelop.exe" "$INSTDIR\data\resources\filetypes\prjx.ico" +SectionEnd + +Section -AdditionalIcons + WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" + CreateShortCut "$SMPROGRAMS\SharpDevelop\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" + CreateShortCut "$SMPROGRAMS\SharpDevelop\Uninstall.lnk" "$INSTDIR\uninst.exe" +SectionEnd + +Section -Post + WriteUninstaller "$INSTDIR\uninst.exe" + WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\bin\SharpDevelop.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\bin\SharpDevelop.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" + + ; ExecShell "" "$INSTDIR\bin\tools\GacUtil2 /i ..\nunit.core.dll" "" SW_SHOWMINIMIZED + ; ExecShell "" "$INSTDIR\bin\tools\GacUtil2 /i ..\nunit.framework.dll" "" SW_SHOWMINIMIZED + + ; now finally call our post install tasks + ExecWait '"$SYSDIR\cscript.exe" "$INSTDIR\bin\setup\PostInstallTasks.vbs"' +SectionEnd + +Section Uninstall + Delete "$DESKTOP\SharpDevelop.lnk" + Delete "$SMPROGRAMS\SharpDevelop\*.*" + + ; ExecShell "" "$INSTDIR\bin\tools\GacUtil2 /u ..\nunit.core.dll" "" SW_SHOWMINIMIZED + ; ExecShell "" "$INSTDIR\bin\tools\GacUtil2 /u ..\nunit.framework.dll" "" SW_SHOWMINIMIZED + + ; first, remove all dependencies from the GAC etc + ExecWait '"$SYSDIR\cscript.exe" "$INSTDIR\bin\setup\PreUninstallTasks.vbs"' + + RMDir "$SMPROGRAMS\SharpDevelop" + RMDir /r "$INSTDIR" + + ; NOTE: this application configuration deletion is now deactivated post-1.0 releases + ; RMDir /r "$APPDATA\.ICSharpCode" + + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" + + ; File association removal + ${RemoveFileAssociation} ".cmbx" "SD.cmbxfile" + ${RemoveFileAssociation} ".prjx" "SD.prjxfile" +SectionEnd + +; GetWindowsVersion, taken from NSIS help, modified for our purposes +Function IsSupportedWindowsVersion + + Push $R0 + Push $R1 + + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + + IfErrors 0 lbl_winnt + + ; we are not NT + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber + + StrCpy $R1 $R0 1 + StrCmp $R1 '4' 0 lbl_error + + StrCpy $R1 $R0 3 + + StrCmp $R1 '4.0' lbl_win32_95 + StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 + + lbl_win32_95: + StrCpy $R0 'False' + Goto lbl_done + + lbl_win32_98: + StrCpy $R0 'False' + Goto lbl_done + + lbl_win32_ME: + StrCpy $R0 'False' + Goto lbl_done + + lbl_winnt: + + StrCpy $R1 $R0 1 + + StrCmp $R1 '3' lbl_winnt_x + StrCmp $R1 '4' lbl_winnt_x + + StrCpy $R1 $R0 3 + + StrCmp $R1 '5.0' lbl_winnt_2000 + StrCmp $R1 '5.1' lbl_winnt_XP + StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error + + lbl_winnt_x: + StrCpy $R0 'False' + Goto lbl_done + + lbl_winnt_2000: + Strcpy $R0 'True' + Goto lbl_done + + lbl_winnt_XP: + Strcpy $R0 'True' + Goto lbl_done + + lbl_winnt_2003: + Strcpy $R0 'True' + Goto lbl_done + + lbl_error: + Strcpy $R0 'False' + lbl_done: + + Pop $R1 + Exch $R0 + +FunctionEnd + diff --git a/setup/SharpDevelop.wxs b/setup/SharpDevelop.wxs new file mode 100644 index 0000000000..fbbde3bad3 --- /dev/null +++ b/setup/SharpDevelop.wxs @@ -0,0 +1,479 @@ + + + + + + + + No + + + < &Back + &Next > + &Finish + + OK + Cancel + + Br&owse... + &Exit + &Ignore + &Install + &Remove + &Repair + &Reset + &Resume + &Retry + &Return + + &Yes + &No + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {&DlgFontBold8} + {&VerdanaBold13} + DlgFont8 + + + + + + + + + + 1 + + + 1 + + + + + + + + The installer will guide you through the steps required to install [ProductName] on your computer. + + + [BigFont]Welcome to the [ProductName] installation + + + + + + + + 1 + + + + AcceptLicense = "Yes" + AcceptLicense <> "Yes" + AcceptLicense = "Yes" + + + + 1 + + + + + + + + + + + + Please read the following license agreement carefully! + + + [TitleFont]End-User License Agreement + + + + Yes + No + + + + + 1 + + + + 1 + + + + 1 + + + + + + 1 + 1 + + + + To install in this folder, click "Next". To install to a different folder, enter it below or click "Browse". + + + + + + + + + + This is the folder where [ProductName] will be installed. + + + + [TitleFont]Select Installation Folder + + + + + + + + OutOfDiskSpace <> 1 + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST) + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" + OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D" + (OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F") + + + + 1 + + + + + + + + + + Click Install to begin the installation. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard. + + + + + The [Wizard] is ready to begin the [InstallMode] installation + + + [TitleFont]Ready to Install + + + + + + 1 + + + + + + Please wait while [ProductName] is installed. + + + + + Install [ProductName] + + + + + + + + + + + + + + Are you sure you want to cancel [ProductName] installation? + + + + 1 + + + 1 + + + + + + + + + 1 + + + 1 + 1 + + + + + + + 1 + + + 1 + + + + + + + + Browse to the destination folder + + + [TitleFont]Change current destination folder + + + + + + 1 + + + + + + + + [BigFont][ProductName] installation was interrupted + + + The installation was interrupted before [ProductName] could be installed. You need to restart the installer to try again. + + + Click the Finish button to exit. + + + + + + 1 + + + + + + + Click the Finish button to exit. + + + [BigFont]Completing the [ProductName] installation. + + + + + + 1 + + + + The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s). + + + + + Disk space required for the installation exceeds available disk space. + + + [TitleFont]Out of Disk Space + + + {120}{70}{70}{70}{70} + + + + + + 1 + + + 1 + 1 + + + + The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s). + + + + + Disk space required for the installation exceeds available disk space. + + + [TitleFont]Out of Disk Space + + + {120}{70}{70}{70}{70} + + + Alternatively, you may choose to disable the installer's rollback functionality. This allows the installer to restore your computer's original state should the installation be interrupted in any way. Click Yes if you wish to take the risk to disable rollback. + + + + + + 1 + + + + + + + [BigFont][ProductName] ended prematurely + + + [ProductName] setup ended prematurely because of an error. Your system has not been modified. To install this program at a later time, please run the installation again. + + + Click the Finish button to exit the. + + + + + + TARGETDIR="" + + + + + + + + + + + + TARGETDIR="" + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/setup/fileassoc.nsh b/setup/fileassoc.nsh new file mode 100644 index 0000000000..db655800ac --- /dev/null +++ b/setup/fileassoc.nsh @@ -0,0 +1,85 @@ +!ifndef _FILEASSOC_NSH_ +!define _FILEASSOC_NSH_ + + +!ifdef HAVE_SYSTEM_PLUGIN +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; RefreshShellIcons based on +;; http://nsis.sourceforge.net/archive/nsisweb.php?page=236&instances=0 +;; by jerome tremblay - april 2003 + +!define SHCNE_ASSOCCHANGED 0x08000000 +!define SHCNF_IDLIST 0 + +Function RefreshShellIcons + System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \ + (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)' +FunctionEnd + +!define RefreshShellIcons "call RefreshShellIcons" +!else +!define RefreshShellIcons +!endif ; HAVE_SYSTEM_PLUGIN + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; parts from http://nsis.sourceforge.net/archive/viewpage.php?pageid=282 by Vytautas +;; Will add the registry entries to associate the given file extension with the +;; previously set (see CreateApplicationAssociation) appType. I.e. indicate to +;; open documents with this extension using the application specified by appType +;; registry entry. If the extension is currently associated with a different +;; appType, it will store the current association in the "prior_appType" key. + +!macro CreateFileAssociation extension extType extDef exeCmd defIcon + !define skipBackupLbl "skipBackup_${__LINE__}" + push $0 + + ; back up old value of extension (.ext) if it exists + ReadRegStr $0 HKCR "${extension}" "" ; read current value + StrCmp $0 "" "${skipBackupLbl}" ; nothing, then skip storing old value + StrCmp $0 "${extType}" "${skipBackupLbl}" ; only store if old is different than current + WriteRegStr HKCR "${extension}" "PreSD" "$0" ; actually store the old association + + "${skipBackupLbl}:" + ; Write File Associations + WriteRegStr HKCR "${extension}" "" "${extType}" + WriteRegStr HKCR "${extType}" "" "${extDef}" + WriteRegStr HKCR "${extType}\DefaultIcon" "" "${defIcon}" + WriteRegStr HKCR "${extType}\shell" "" "open" + WriteRegStr HKCR "${extType}\shell\open\command" "" '"${exeCmd}" "%1"' + + ; Force shell refresh (so icons updated as needed) + ${RefreshShellIcons} + + pop $0 + !undef skipBackupLbl +!macroend +!define CreateFileAssociation "!insertmacro CreateFileAssociation" + + +; check if a file extension is associated with us and if so delete it +!macro RemoveFileAssociation extension extType + push $0 + push $1 + + ReadRegStr $0 HKCR "${extension}" "" + StrCmp "$0" "${extType}" 0 Skip_Del_File_Assoc.${extension} + ReadRegStr $0 HKCR "${extension}" "PreSD" + StrCmp "$0" "" "DeleteFA.${extension}" 0 ; if "prior_value" is not empty + ReadRegStr $1 HKCR "$0" "" ; restore previous association + StrCmp "$1" "" DeleteFA.${extension} ; only if it is still valid (has something defined) + WriteRegStr HKCR "${extension}" "" $0 ; actually restore prior association + DeleteRegValue HKCR "${extension}" "PreSD" ; and remove stored value + DeleteRegKey HKCR "${extType}" ; remove the extension type we added + Goto Skip_Del_File_Assoc.${extension} + DeleteFA.${extension}: ; else delete file association key + DeleteRegKey HKCR "${extension}" ; actually remove file assoications + + Skip_Del_File_Assoc.${extension}: + pop $1 + pop $0 +!macroend +!define RemoveFileAssociation "!insertmacro RemoveFileAssociation" + + +!endif ; _FILEASSOC_NSH_ diff --git a/setup/readme.txt b/setup/readme.txt new file mode 100644 index 0000000000..b7a066eeb2 --- /dev/null +++ b/setup/readme.txt @@ -0,0 +1,32 @@ +The setup program is maintained by Christoph Wille, christophw@alphasierrapapa.com + +Information + +Setup uses NSIS 2.0 Release - http://nsis.sourceforge.net + + +CHANGELOG + +10/07/2004: + +* Batch files replaced with WSH scripts + +9/13/2004: + +* bin\setup directory created, batch files added +* gacutil2 source code added +* setup changed to call post & pre batch files, disabled app data deletion + +6/23/2004: + +* http://abiword.pchasm.org/source/cvs/abiword-cvs/abi/src/pkg/win/setup/NSISv2/abi_util_fileassoc.nsh added +* abi_util_fileassoc.nsh modified (now named fileassoc.nsh) to allow icons per extension in CreateFileAssociation +* modified fileassoc.nsh to match file type registerer in Tools / Options +* Compressor set to lzma in Fidalgo.nsi + +2/18/2004: changes for .99 and NSIS 2.0 Release + +8/25/2003: added check to .onInit for installed previous version (protect us from + partially overwriting previous installations) + +8/23/2003: added check to .onInit for installed .NET 1.1 Framework diff --git a/setup/wizard-image.bmp b/setup/wizard-image.bmp new file mode 100644 index 0000000000..150829f055 Binary files /dev/null and b/setup/wizard-image.bmp differ diff --git a/src/AddIns/AddIns/DisplayBindings/ResourceEditor.dll b/src/AddIns/AddIns/DisplayBindings/ResourceEditor.dll new file mode 100644 index 0000000000..4ca2b78b45 Binary files /dev/null and b/src/AddIns/AddIns/DisplayBindings/ResourceEditor.dll differ diff --git a/src/AddIns/AddIns/DisplayBindings/ResourceEditor.pdb b/src/AddIns/AddIns/DisplayBindings/ResourceEditor.pdb new file mode 100644 index 0000000000..172c74069f Binary files /dev/null and b/src/AddIns/AddIns/DisplayBindings/ResourceEditor.pdb differ diff --git a/src/AddIns/AddIns/Misc/FiletypeRegisterer/ICSharpCode.FiletypeRegisterer.dll b/src/AddIns/AddIns/Misc/FiletypeRegisterer/ICSharpCode.FiletypeRegisterer.dll new file mode 100644 index 0000000000..a1eb2dd512 Binary files /dev/null and b/src/AddIns/AddIns/Misc/FiletypeRegisterer/ICSharpCode.FiletypeRegisterer.dll differ diff --git a/src/AddIns/AddIns/Misc/FiletypeRegisterer/ICSharpCode.FiletypeRegisterer.pdb b/src/AddIns/AddIns/Misc/FiletypeRegisterer/ICSharpCode.FiletypeRegisterer.pdb new file mode 100644 index 0000000000..91c439f4ca Binary files /dev/null and b/src/AddIns/AddIns/Misc/FiletypeRegisterer/ICSharpCode.FiletypeRegisterer.pdb differ diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Doc/TODO.txt b/src/AddIns/BackendBindings/CPPNetBinding/Doc/TODO.txt new file mode 100644 index 0000000000..9049e7ac7d --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Doc/TODO.txt @@ -0,0 +1,3 @@ +- dependencies should be maintained during editing +- folding +- autocomplete diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Resources/CPPNetBinding.addin b/src/AddIns/BackendBindings/CPPNetBinding/Project/Resources/CPPNetBinding.addin new file mode 100644 index 0000000000..34d665c283 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Resources/CPPNetBinding.addin @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/AssemblyInfo.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/AssemblyInfo.cs new file mode 100644 index 0000000000..de5f23d6dd --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("CPPNetBinding")] +[assembly: AssemblyDescription("C++.NET language binding for #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("www.icsharpcode.net")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 Mike Krueger")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetBindingCompilerManager.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetBindingCompilerManager.cs new file mode 100644 index 0000000000..81dbc30508 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetBindingCompilerManager.cs @@ -0,0 +1,565 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using System.CodeDom.Compiler; + +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using System.Windows.Forms; + +namespace CPPBinding +{ + /// + /// This class controls the compilation of C Sharp files and C Sharp projects + /// + public class CPPBindingCompilerManager + { + private FileUtilityService _fileUtilityService = (FileUtilityService)ServiceManager.Services.GetService(typeof(FileUtilityService)); + private StringBuilder _inputFiles = new StringBuilder(); + private StringBuilder _buildProcess = new StringBuilder(); + private StringBuilder _results = new StringBuilder(); + private bool _treatWarningsAsErrors; + + + // we have 2 formats for the error output the csc gives : + // d:\vc\include\xstring(1466) : warning C4701: local variable '_Ptr' may be used without hav + readonly static Regex normalError = new Regex(@"(?.*)\((?\d+)\)\s+\:\s+(?.+?)\s+(?[\d\w]+):\s+(?.*)", RegexOptions.Compiled); + // cl : Command line error D2016 : '/clr' and '/ML' command-line options are incompatible + readonly static Regex generalError = new Regex(@"(?.+)\s+(?[\d\w]+)\s*:\s+(?.*)", RegexOptions.Compiled); + + + public string GetCompiledOutputName(string fileName) + { + return Path.ChangeExtension(fileName, ".exe"); + } + + public string GetCompiledOutputName(IProject project) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)project.ActiveConfiguration; + return compilerparameters.OutputFile; + } + + public bool CanCompile(string fileName) + { + return Path.GetExtension(fileName) == ".cpp" || Path.GetExtension(fileName) == ".c" || Path.GetExtension(fileName) == ".cxx"; + } + + public ICompilerResult CompileFile(string filename, CPPCompilerParameters compilerparameters) + { + + if (!CanCompile(filename)) + { + MessageBox.Show("File " + filename + " is not a source file.", "Compilation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); + return new DefaultCompilerResult(new CompilerResults(new TempFileCollection()), ""); + } + string output = ""; + string error = ""; + string exe = Path.ChangeExtension(filename, ".exe"); + if (compilerparameters.OutputAssembly != null && compilerparameters.OutputAssembly.Length > 0) { + exe = compilerparameters.OutputAssembly; + } + _treatWarningsAsErrors = compilerparameters.TreatWarningsAsErrors; + string responseFileName = Path.GetTempFileName(); + + StreamWriter writer = new StreamWriter(responseFileName); + + writer.WriteLine("/nologo"); + if (compilerparameters.UseManagedExtensions) + { + writer.WriteLine("/clr"); + } + writer.WriteLine("/Fe\"" + exe + "\""); + + writer.WriteLine('"' + filename + '"'); + + TempFileCollection tf = new TempFileCollection(); + + writer.Close(); + + string compilerName = GetCompilerName(); + string outstr = compilerName + " \"@" + responseFileName + "\""; + string currDir = Directory.GetCurrentDirectory(); + string intDir = compilerparameters.IntermediateDirectory; + if (intDir == null || intDir.Length == 0) { + intDir = compilerparameters.OutputDirectory; + } + + Directory.SetCurrentDirectory(intDir); + ICompilerResult result; + try { + Executor.ExecWaitWithCapture(outstr, currDir, tf, ref output, ref error); + result = ParseOutput(tf, output, error); + } + catch (System.Runtime.InteropServices.ExternalException e) { + ShowErrorBox(e); + result = CreateErrorCompilerResult(tf, e); + } + finally { + File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + Directory.SetCurrentDirectory(currDir); + } + return result; + } + + private void ShowErrorBox(System.Runtime.InteropServices.ExternalException e) + { + MessageBox.Show("It seems cl.exe is not installed or not found.\n\nInstall compiler and set PATH environment variable.\n\nException: " + e, "Compile Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); + } + + public ICompilerResult CompileProject(IProject project, bool force) + { + _inputFiles = new StringBuilder(); + _buildProcess = new StringBuilder(); + _results = new StringBuilder(); + + CPPProject p = (CPPProject)project; + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + _treatWarningsAsErrors = compilerparameters.TreatWarningsAsErrors; + + CheckDirectory(Path.GetDirectoryName(compilerparameters.OutputFile)); + CheckDirectory(Path.GetDirectoryName(compilerparameters.IntermediateDirectory)); + + StringBuilder output = new StringBuilder(); + + ICompilerResult result; + + if (compilerparameters.PreCompileHeader) { + result = InternalCompileProject(p, true, force); + if (result != null) { + output.Append(result.CompilerOutput); + if (HasErrors(result)) { + goto exit; + } + } + } + + result = InternalCompileProject(p, false, force); + if (result != null) { + output.Append(result.CompilerOutput); + if (HasErrors(result)) { + goto exit; + } + } + if (result != null || !File.Exists(Path.GetFullPath(compilerparameters.OutputFile))) { + result = LinkProject(p); + output.Append(result.CompilerOutput); + } + exit: + WriteResultFile(p); + CompilerResults cr = result != null ? result.CompilerResults : new CompilerResults(new TempFileCollection()); + return new DefaultCompilerResult(cr, output.ToString()); + } + + private bool HasErrors(ICompilerResult compilerResult) + { + bool result = false; + if (compilerResult.CompilerResults.Errors.Count > 0) + { + if (_treatWarningsAsErrors) + { + result = true; + } + else { + foreach (CompilerError error in compilerResult.CompilerResults.Errors) + { + if (!error.IsWarning) + { + result = true; + break; + } + } + } + } + return result; + } + + private void CheckDirectory(string directory) + { + if (!Directory.Exists(directory)) { + Directory.CreateDirectory(directory); + } + } + + private void WriteResultFile(CPPProject p) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + string directory = Path.GetDirectoryName(compilerparameters.OutputFile); + string resultFile = Path.Combine(directory, "BuildLog.html"); + _results.Append("writing result file to : " + resultFile); + + StreamWriter writer = new StreamWriter(resultFile); + writer.Write(""); + writer.Write("
Build Log from: " + p.Name + "(" + compilerparameters.Name + ")
"); + writer.Write("Build started."); + writer.Write("
Command Line
"); + writer.WriteLine(_inputFiles.ToString()); + + writer.Write("
Output
"); + writer.Write("
");
+			writer.WriteLine(_buildProcess.ToString());
+			writer.Write("
"); + + writer.Write("
Results
"); + writer.Write("
");
+			writer.WriteLine(_results.ToString());
+			writer.Write("
"); + writer.Write("Build finished."); + writer.Write(""); + writer.Close(); + } + + #region COMPILER + private string GetCompilerName() + { + return @"cl.exe"; + } + + private string WriteCompilerParameters(CPPProject p, bool preCompiledHeader, bool force) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + StringBuilder sb = new StringBuilder(); + + sb.Append("/c\n"); + + if (compilerparameters.UseManagedExtensions) { + sb.Append("/clr\n"); + } + string directory = Path.GetDirectoryName(compilerparameters.OutputFile); + sb.Append("/Fo\""); + sb.Append(directory); + sb.Append("/\"\n"); + + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + ArrayList allProjects = Combine.GetAllProjects(projectService.CurrentOpenCombine); + if (preCompiledHeader) { + sb.Append(compilerparameters.GetPreCompiledHeaderOptions()); + } else { + sb.Append(compilerparameters.GetCompilerOptions()); + } + if (compilerparameters.AdditionalCompilerOptions != null && compilerparameters.AdditionalCompilerOptions.Length > 0) { + foreach (string option in compilerparameters.AdditionalCompilerOptions.Split(';')) { + sb.Append(option); + sb.Append("\n"); + } + } + + foreach (ProjectReference lib in p.ProjectReferences) { + sb.Append("/FU\""); + sb.Append(lib.GetReferencedFileName(p)); + sb.Append("\"\n"); + } + + switch (compilerparameters.ConfigurationType) { + case ConfigurationType.Dll: + sb.Append("/LD\n"); + break; + } + bool includedFile = false; + foreach (ProjectFile finfo in p.ProjectFiles) { + if (finfo.Subtype != Subtype.Directory) { + switch (finfo.BuildAction) { + case BuildAction.Compile: + if (CanCompile(finfo.Name)) + { + string fileName = Path.GetFileNameWithoutExtension(Path.GetFullPath(finfo.Name)).ToLower(); + string headerFile = Path.GetFileNameWithoutExtension(compilerparameters.preCompiledHeaderCPPOptions.HeaderFile).ToLower(); + bool isPreHeader = fileName == headerFile; + + if (!(preCompiledHeader ^ isPreHeader)) { + if (force || ShouldCompileFile(p, finfo.Name)) { + includedFile = true; + sb.Append("\""); + sb.Append(Path.GetFullPath(finfo.Name)); + sb.Append("\"\n"); + } + } + } + break; + } + } + } + if (!includedFile) { + return null; + } + string responseFileName = Path.GetTempFileName(); + StreamWriter writer = new StreamWriter(responseFileName, false); +// string standardIncludes = Environment.GetEnvironmentVariable("INCLUDE"); +// if (standardIncludes != null && standardIncludes.Length > 0) { +// writer.WriteLine("/I\"" + standardIncludes + "\""); +// } + + writer.Write(sb.ToString()); + writer.Close(); + + _inputFiles.Append("Creating temporary file "); + _inputFiles.Append(responseFileName); + _inputFiles.Append(" with following content:
"); + _inputFiles.Append("
");
+			_inputFiles.Append(sb.ToString());
+			_inputFiles.Append("
"); + + return responseFileName; + } + + Hashtable lastCompiledFiles = new Hashtable(); + + private bool ShouldCompileFile(CPPProject p, string fileName) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + string directory = Path.GetDirectoryName(compilerparameters.OutputFile); + string objectFile = Path.Combine(directory, Path.ChangeExtension(Path.GetFileName(fileName), ".obj")); + if (!File.Exists(objectFile)) { + return true; + } + + string[] additinalIncludeDirs = compilerparameters.AdditionalCompilerOptions.Split(';'); + ArrayList dirs = new ArrayList(additinalIncludeDirs.Length+1); + dirs.Add(Path.GetDirectoryName(fileName)); + foreach (string dir in additinalIncludeDirs) + { + dirs.Add(dir); + } + + DateTime lastWriteTime = new IncludeParser(fileName, dirs, true).Parse().GetLastWriteTime(); +// DateTime lastWriteTime = File.GetLastWriteTime(fileName); + + bool shouldCompile; + if (lastCompiledFiles[fileName] == null) { + shouldCompile = true; + } else { + shouldCompile = lastWriteTime != (DateTime)lastCompiledFiles[fileName]; + } + + lastCompiledFiles[fileName] = lastWriteTime; + return shouldCompile; + } + + private ICompilerResult InternalCompileProject(CPPProject p, bool preCompiledHeader, bool force) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + + string responseFileName = WriteCompilerParameters(p, preCompiledHeader, force); + if (responseFileName == null) { + return null; + } + string output = String.Empty; + string error = String.Empty; + + string compilerName = GetCompilerName(); + string clstr = compilerName + " \"@" + responseFileName + "\""; + + TempFileCollection tf = new TempFileCollection(); + + string currDir = Directory.GetCurrentDirectory(); + string intDir = compilerparameters.IntermediateDirectory; + if (intDir == null || intDir.Length == 0) { + intDir = compilerparameters.OutputDirectory; + } + _inputFiles.Append("Executing command: " + clstr + "
"); + + ICompilerResult result; + try { + Executor.ExecWaitWithCapture(clstr, tf, ref output, ref error); + result = ParseOutput(tf, output, error); + } + catch (System.Runtime.InteropServices.ExternalException e) { + ShowErrorBox(e); + result = CreateErrorCompilerResult(tf, e); + } + finally { + File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + } + + return result; + } + #endregion + + #region LINKER + private string GetLinkerName() + { + return @"link.exe"; + } + + private string WriteLinkerOptions(CPPProject p) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + + StringBuilder sb = new StringBuilder(); + + string exe = compilerparameters.OutputFile; + string dir = Path.GetDirectoryName(Path.GetFullPath(exe)); + sb.Append("/OUT:\"");sb.Append(exe);sb.Append("\"\n"); + foreach (ProjectFile finfo in p.ProjectFiles) { + if (finfo.Subtype != Subtype.Directory) { + switch (finfo.BuildAction) { + case BuildAction.Compile: + if (CanCompile(finfo.Name)) + { + sb.Append('"'); + sb.Append(Path.Combine(dir, + Path.ChangeExtension(Path.GetFileName(finfo.Name), + ".obj"))); + sb.Append("\"\n"); + } + break; + case BuildAction.EmbedAsResource: + sb.Append("/ASSEMBLYRESOURCE:\"");sb.Append(Path.GetFullPath(finfo.Name));sb.Append("\"\n"); + break; + } + } + } + switch (compilerparameters.ConfigurationType) { + case ConfigurationType.Dll: + sb.Append("/DLL\n"); + break; + } + + sb.Append(compilerparameters.GetLinkerOptionsForCompiler()); + + // write to response file + string responseFileName = Path.GetTempFileName(); + StreamWriter writer = new StreamWriter(responseFileName); +// string standardLibs = Environment.GetEnvironmentVariable("LIB"); +// if (standardLibs != null && standardLibs.Length > 0) { +// foreach (string lib in standardLibs.Split(';')) { +// if (lib.Length > 0) { +// writer.WriteLine("/LIBPATH:\"" + lib + "\""); +// } +// } +// } + writer.Write(sb.ToString()); + writer.Close(); + + _inputFiles.Append("Creating temporary file " + responseFileName + " with following content:
"); + _inputFiles.Append("
");
+			_inputFiles.Append(sb.ToString());
+			_inputFiles.Append("
"); + return responseFileName; + } + + private ICompilerResult LinkProject(CPPProject p) + { + CPPCompilerParameters compilerparameters = (CPPCompilerParameters)p.ActiveConfiguration; + + string responseFileName = WriteLinkerOptions(p); + + string output = String.Empty; + string error = String.Empty; + + string compilerName = GetLinkerName(); + string clstr = compilerName + " \"@" + responseFileName + "\""; + + TempFileCollection tf = new TempFileCollection(); + + string currDir = Directory.GetCurrentDirectory(); + string intDir = compilerparameters.IntermediateDirectory; + if (intDir == null || intDir.Length == 0) { + intDir = compilerparameters.OutputDirectory; + } + + _inputFiles.Append("Executing command : "); + _inputFiles.Append(clstr); + _inputFiles.Append("
"); + Executor.ExecWaitWithCapture(clstr, tf, ref output, ref error); + + ICompilerResult result = ParseOutput(tf, output, error); + +// File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + + return result; + } + #endregion + + private ICompilerResult CreateErrorCompilerResult(TempFileCollection tf, System.Runtime.InteropServices.ExternalException e) + { + CompilerError error = new CompilerError(); + error.Line = 0; + error.FileName = ""; + error.IsWarning = false; + error.ErrorNumber = ""; + error.ErrorText = e.Message; + CompilerResults cr = new CompilerResults(tf); + cr.Errors.Add(error); + return new DefaultCompilerResult(cr, ""); + } + + private void InternalParseOutputFile(StringBuilder compilerOutput, CompilerResults cr, string file) + { + StreamReader sr = new StreamReader(File.OpenRead(file), Encoding.Default); + + // skip fist whitespace line + sr.ReadLine(); + + + while (true) { + string curLine = sr.ReadLine(); + _buildProcess.Append(curLine); + _buildProcess.Append("\n"); + compilerOutput.Append(curLine); + compilerOutput.Append('\n'); + if (curLine == null) { + break; + } + curLine = curLine.Trim(); + if (curLine.Length == 0) { + continue; + } + + CompilerError error = new CompilerError(); + + // try to match standard errors + Match match = normalError.Match(curLine); + if (match.Success) { + error.Line = Int32.Parse(match.Result("${line}")); + try { + error.FileName = Path.GetFullPath(match.Result("${file}")); + } catch (Exception) { + error.FileName = ""; + } + error.IsWarning = match.Result("${error}").EndsWith("warning"); + error.ErrorNumber = match.Result("${number}"); + error.ErrorText = match.Result("${message}"); + } else { + match = generalError.Match(curLine); // try to match general csc errors + if (match.Success) { + error.IsWarning = match.Result("${error}").EndsWith("warning"); + error.ErrorNumber = match.Result("${number}"); + error.ErrorText = match.Result("${message}"); + } else { // give up and skip the line + continue; + } + } + + cr.Errors.Add(error); + } + sr.Close(); + } + + private ICompilerResult ParseOutput(TempFileCollection tf, string outputFile, string errorFile) + { + StringBuilder compilerOutput = new StringBuilder(); + CompilerResults cr = new CompilerResults(tf); + InternalParseOutputFile(compilerOutput, cr, outputFile); + InternalParseOutputFile(compilerOutput, cr, errorFile); + return new DefaultCompilerResult(cr, compilerOutput.ToString()); + } + } +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetBindingExecutionManager.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetBindingExecutionManager.cs new file mode 100644 index 0000000000..054795f8b3 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetBindingExecutionManager.cs @@ -0,0 +1,74 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; +using System.Xml; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +using ICSharpCode.Core; + +namespace CPPBinding +{ + /// + /// This class describes the main functionalaty of a language codon + /// + public class CPPBindingExecutionManager + { + public void Execute(string filename, bool debug) + { + string exe = Path.ChangeExtension(filename, ".exe"); + ProcessStartInfo psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("ComSpec"), "/c " + "\"" + exe + "\"" + " & pause"); + psi.WorkingDirectory = Path.GetDirectoryName(exe); + psi.UseShellExecute = false; + try { + Process p = new Process(); + p.StartInfo = psi; + p.Start(); + } catch (Exception) { + throw new ApplicationException("Can't execute " + "\"" + exe + "\"\n(.NET bug? Try restaring SD or manual start)"); + } + } + + public void Execute(IProject project, bool debug) + { + CPPCompilerParameters parameters = (CPPCompilerParameters)project.ActiveConfiguration; + + + string exe = ((CPPCompilerParameters)project.ActiveConfiguration).OutputFile; + + //string args = ((CPPCompilerParameters)project.ActiveConfiguration).CommandLineParameters; + string args = ""; + + ProcessStartInfo psi; + string runtimeStarter = String.Empty; + + psi = new ProcessStartInfo(runtimeStarter + "\"" + exe + "\""); + psi.Arguments = args; + + try { + psi.WorkingDirectory = Path.GetDirectoryName(exe); + psi.UseShellExecute = false; + + Process p = new Process(); + p.StartInfo = psi; + p.Start(); + } catch (Exception) { + throw new ApplicationException("Can't execute " + "\"" + exe + "\""); + } + } + } +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetLanguageBinding.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetLanguageBinding.cs new file mode 100644 index 0000000000..5aabddf21c --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/CPPNetLanguageBinding.cs @@ -0,0 +1,95 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; +using System.Xml; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; +using ICSharpCode.SharpDevelop.Gui; + +namespace CPPBinding +{ + public class CPPLanguageBinding : ILanguageBinding + { + public const string LanguageName = "C++.NET"; + + CPPBindingCompilerManager compilerManager = new CPPBindingCompilerManager(); + CPPBindingExecutionManager executionManager = new CPPBindingExecutionManager(); + + public string Language { + get { + return LanguageName; + } + } + + public void Execute(string filename, bool debug) + { + Debug.Assert(executionManager != null); + executionManager.Execute(filename, debug); + } + + public void Execute(IProject project, bool debug) + { + Debug.Assert(executionManager != null); + executionManager.Execute(project, debug); + } + + public string GetCompiledOutputName(string fileName) + { + Debug.Assert(compilerManager != null); + return compilerManager.GetCompiledOutputName(fileName); + } + + public string GetCompiledOutputName(IProject project) + { + Debug.Assert(compilerManager != null); + return compilerManager.GetCompiledOutputName(project); + } + + public bool CanCompile(string fileName) + { + Debug.Assert(compilerManager != null); + return compilerManager.CanCompile(fileName); + } + + public ICompilerResult CompileFile(string fileName) + { + MessageBox.Show("Cannot compile a single file. Create a project first.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); + return null; + } + + public ICompilerResult CompileProject(IProject project) + { + return CompileProject(project, false); + } + + public ICompilerResult RecompileProject(IProject project) + { + return CompileProject(project, true); + } + + public IProject CreateProject(ProjectCreateInformation info, XmlElement projectOptions) + { + return new CPPProject(info, projectOptions); + } + + private ICompilerResult CompileProject(IProject project, bool force) + { + Debug.Assert(compilerManager != null); + return compilerManager.CompileProject(project, force); + } + } +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Dependences.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Dependences.cs new file mode 100644 index 0000000000..834fc36d1d --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Dependences.cs @@ -0,0 +1,218 @@ +// +// -*- C# -*- +// +// Author: Roman Taranchenko +// Copyright: (c) 2004 Roman Taranchenko +// Copying Policy: GNU General Public License +// + +using System; +using System.Collections; +using System.IO; + +namespace CPPBinding +{ + + public interface IDependence + { + + string Name + { + get; + } + + DependenceTree DependsOn + { + get; + } + + DependenceTree Children + { + get; + } + + void Add(IDependence dependence); + + DateTime GetLastWriteTime(); + + bool Exists + { + get; + } + + bool Contains(IDependence dep); + + bool Contains(string dep); + + } + + public class SourceFile: IDependence + { + + private string _name; + private DependenceTree _dependences = new DependenceTree(); + + public SourceFile(string name) + { + _name = name; + } + + public string Name + { + get + { + return _name; + } + } + + public DependenceTree Children + { + get + { + return _dependences; + } + } + + public DependenceTree DependsOn + { + get + { + DependenceTree listOfNames = new DependenceTree(); + FillListOfNames(this, listOfNames); + return listOfNames; + } + } + + public void Add(IDependence dependence) + { + _dependences.Add(dependence); + } + + private static void FillListOfNames(IDependence dependence, DependenceTree list) + { + foreach (IDependence dep in dependence.Children) + { + list.Add(dep); + FillListOfNames(dep, list); + } + } + + public DateTime GetLastWriteTime() + { + DateTime result = DateTime.MinValue; + if (Exists) + { + result = File.GetLastWriteTime(_name); + foreach (IDependence dep in _dependences) + { + DateTime dt = dep.GetLastWriteTime(); + if (dt.CompareTo(result) > 0) + { + result = dt; + } + } + } + return result; + } + + public bool Exists + { + get + { + return File.Exists(_name); + } + } + + public override string ToString() + { + return _name; + } + + public bool Contains(IDependence dep) + { + return Contains(dep.Name); + } + + public bool Contains(string dep) + { + if (_name.Equals(dep)) { + return true; + } + return _dependences.Contains(dep); + } + } + + public class DependenceTree: IEnumerable + { + + private SortedList _list; + + public DependenceTree() + { + _list = new SortedList(); + } + + public void Add(IDependence value) + { + if (!Contains(value)) + { + _list.Add(value.Name, value); + } + } + + public IDependence Get(string name) + { + return (IDependence) _list.GetByIndex(_list.IndexOfKey(name)); + } + + public IDependence Get(IDependence dep) + { + return Get(dep.Name); + } + + public bool Contains(IDependence dep) + { + return Contains(dep.Name); + } + + public bool Contains(string name) + { + return _list.ContainsKey(name); + } + + public IEnumerator GetEnumerator() + { + return new DependenceTreeEnumerator(_list.GetEnumerator()); + } + + } + + class DependenceTreeEnumerator: IEnumerator + { + private IDictionaryEnumerator _enum; + + public DependenceTreeEnumerator(IDictionaryEnumerator e) + { + _enum = e; + } + + public object Current + { + get + { + return ((DictionaryEntry)_enum.Current).Value; + } + } + + public bool MoveNext() + { + return _enum.MoveNext(); + } + + public void Reset() + { + _enum.Reset(); + } + } + +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/FormattingStrategy/CPPNetFormattingStrategy.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/FormattingStrategy/CPPNetFormattingStrategy.cs new file mode 100644 index 0000000000..92d5cced34 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/FormattingStrategy/CPPNetFormattingStrategy.cs @@ -0,0 +1,343 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Diagnostics; +using System.Drawing; +using System.Text; + +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.Core; + +namespace CPPBinding.FormattingStrategy +{ + /// + /// This class handles the auto and smart indenting in the textbuffer while + /// you type. + /// + public class CSharpFormattingStrategy : DefaultFormattingStrategy + { + public CSharpFormattingStrategy() + { + } + + /// + /// Define CSharp specific smart indenting for a line :) + /// + protected override int SmartIndentLine(TextArea textArea, int lineNr) + { + if (lineNr > 0) { + LineSegment lineAbove = textArea.Document.GetLineSegment(lineNr - 1); + string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove).Trim(); + + LineSegment curLine = textArea.Document.GetLineSegment(lineNr); + string curLineText = textArea.Document.GetText(curLine.Offset, curLine.Length).Trim(); + + if ((lineAboveText.EndsWith(")") && curLineText.StartsWith("{")) || // after for, while, etc. + (lineAboveText.EndsWith("else") && curLineText.StartsWith("{"))) // after else + { + string indentation = GetIndentation(textArea, lineNr - 1); + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation + curLineText); + return indentation.Length; + } + + if (curLineText.StartsWith("}")) { // indent closing bracket. + int closingBracketOffset = TextUtilities.SearchBracketBackward(textArea.Document, curLine.Offset + textArea.Document.GetText(curLine.Offset, curLine.Length).IndexOf('}') - 1, '{', '}'); + if (closingBracketOffset == -1) { // no closing bracket found -> autoindent + return AutoIndentLine(textArea, lineNr); + } + + string indentation = GetIndentation(textArea, textArea.Document.GetLineNumberForOffset(closingBracketOffset)); + + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation + curLineText); + return indentation.Length; + } + + if (lineAboveText.EndsWith(";")) { // expression ended, reset to valid indent. + int closingBracketOffset = TextUtilities.SearchBracketBackward(textArea.Document, curLine.Offset + textArea.Document.GetText(curLine.Offset, curLine.Length).IndexOf('}') - 1, '{', '}'); + + if (closingBracketOffset == -1) { // no closing bracket found -> autoindent + return AutoIndentLine(textArea, lineNr); + } + + int closingBracketLineNr = textArea.Document.GetLineNumberForOffset(closingBracketOffset); + LineSegment closingBracketLine = textArea.Document.GetLineSegment(closingBracketLineNr); + string closingBracketLineText = textArea.Document.GetText(closingBracketLine.Offset, closingBracketLine.Length).Trim(); + + string indentation = GetIndentation(textArea, closingBracketLineNr); + + // special handling for switch statement formatting. + if (closingBracketLineText.StartsWith("switch")) { + if (lineAboveText.StartsWith("break;") || + lineAboveText.StartsWith("goto") || + lineAboveText.StartsWith("return")) { + // nothing + } else { + indentation += ICSharpCode.TextEditor.Actions.Tab.GetIndentationString(textArea.Document); + } + } + indentation += ICSharpCode.TextEditor.Actions.Tab.GetIndentationString(textArea.Document); + + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation + curLineText); + return indentation.Length; + } + + if (lineAboveText.EndsWith("{") || // indent opening bracket. + lineAboveText.EndsWith(":") || // indent case xyz: + (lineAboveText.EndsWith(")") && // indent single line if, for ... etc + (lineAboveText.StartsWith("if") || + lineAboveText.StartsWith("while") || + lineAboveText.StartsWith("for"))) || + lineAboveText.EndsWith("else")) { + string indentation = GetIndentation(textArea, lineNr - 1) + ICSharpCode.TextEditor.Actions.Tab.GetIndentationString(textArea.Document); + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation + curLineText); + return indentation.Length; + } else { + // try to indent linewrap + ArrayList bracketPos = new ArrayList(); + for (int i = 0; i < lineAboveText.Length; ++i) { // search for a ( bracket that isn't closed + switch (lineAboveText[i]) { + case '(': + bracketPos.Add(i); + break; + case ')': + if (bracketPos.Count > 0) { + bracketPos.RemoveAt(bracketPos.Count - 1); + } + break; + } + } + + if (bracketPos.Count > 0) { + int bracketIndex = (int)bracketPos[bracketPos.Count - 1]; + string indentation = GetIndentation(textArea, lineNr - 1); + + for (int i = 0; i <= bracketIndex; ++i) { // insert enough spaces to match + indentation += " "; // brace start in the next line + } + + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation + curLineText); + return indentation.Length; + } + } + } + return AutoIndentLine(textArea, lineNr); + } + + bool NeedCurlyBracket(string text) + { + int curlyCounter = 0; + + bool inString = false; + bool inChar = false; + + bool lineComment = false; + bool blockComment = false; + + for (int i = 0; i < text.Length; ++i) { + switch (text[i]) { + case '\r': + case '\n': + lineComment = false; + break; + case '/': + if (blockComment) { + Debug.Assert(i > 0); + if (text[i - 1] == '*') { + blockComment = false; + } + } + if (!inString && !inChar && i + 1 < text.Length) { + if (!blockComment && text[i + 1] == '/') { + lineComment = true; + } + if (!lineComment && text[i + 1] == '*') { + blockComment = true; + } + } + break; + case '"': + if (!(inChar || lineComment || blockComment)) { + inString = !inString; + } + break; + case '\'': + if (!(inString || lineComment || blockComment)) { + inChar = !inChar; + } + break; + case '{': + if (!(inString || inChar || lineComment || blockComment)) { + ++curlyCounter; + } + break; + case '}': + if (!(inString || inChar || lineComment || blockComment)) { + --curlyCounter; + } + break; + } + } + return curlyCounter > 0; + } + + bool IsInsideStringOrComment(TextArea textArea, LineSegment curLine, int cursorOffset) + { + // scan cur line if it is inside a string or single line comment (//) + bool isInsideString = false; + bool isInsideComment = false; + for (int i = curLine.Offset; i < cursorOffset; ++i) { + char ch = textArea.Document.GetCharAt(i); + if (ch == '"') { + isInsideString = !isInsideString; + } + if (ch == '/' && i + 1 < cursorOffset && textArea.Document.GetCharAt(i + 1) == '/') { + isInsideComment = true; + break; + } + } + + return isInsideString || isInsideComment; + } + + bool IsInsideDocumentationComment(TextArea textArea, LineSegment curLine, int cursorOffset) + { + // scan cur line if it is inside a string or single line comment (//) + bool isInsideString = false; + bool isInsideComment = false; + for (int i = curLine.Offset; i < cursorOffset; ++i) { + char ch = textArea.Document.GetCharAt(i); + if (ch == '"') { + isInsideString = !isInsideString; + } + if (!isInsideString) { + if (ch == '/' && i + 2 < cursorOffset && textArea.Document.GetCharAt(i + 1) == '/' && textArea.Document.GetCharAt(i + 2) == '/') { + isInsideComment = true; + break; + } + } + } + + return isInsideComment; + } + + public override int FormatLine(TextArea textArea, int lineNr, int cursorOffset, char ch) // used for comment tag formater/inserter + { + LineSegment curLine = textArea.Document.GetLineSegment(lineNr); + LineSegment lineAbove = lineNr > 0 ? textArea.Document.GetLineSegment(lineNr - 1) : null; + + //// local string for curLine segment + string curLineText=""; + + if (ch != '\n' && ch != '>') { + if (IsInsideStringOrComment(textArea, curLine, cursorOffset)) { + return 0; + } + } + + switch (ch) { + case '>': + if (IsInsideDocumentationComment(textArea, curLine, cursorOffset)) { + curLineText = textArea.Document.GetText(curLine.Offset, curLine.Length); + int column = textArea.Caret.Offset - curLine.Offset; + int index = Math.Min(column - 1, curLineText.Length - 1); + + while (index >= 0 && curLineText[index] != '<') { + --index; + if(curLineText[index] == '/') + return 0; // the tag was an end tag or already + } + + if (index > 0) { + StringBuilder commentBuilder = new StringBuilder(""); + for (int i = index; i < curLineText.Length && i < column && !Char.IsWhiteSpace(curLineText[ i]); ++i) { + commentBuilder.Append(curLineText[ i]); + } + string tag = commentBuilder.ToString().Trim(); + if (!tag.EndsWith(">")) { + tag += ">"; + } + if (!tag.StartsWith("/")) { + textArea.Document.Insert(textArea.Caret.Offset, " 0) { + curLineText = textArea.Document.GetText(curLine.Offset,curLine.Length); + } + + LineSegment nextLine = lineNr + 1 < textArea.Document.TotalNumberOfLines ? textArea.Document.GetLineSegment(lineNr + 1) : null; + string nextLineText = lineNr + 1 < textArea.Document.TotalNumberOfLines ? textArea.Document.GetText(nextLine.Offset, nextLine.Length) : ""; + + if (lineAbove.HighlightSpanStack != null && lineAbove.HighlightSpanStack.Count > 0) { + if (!((Span)lineAbove.HighlightSpanStack.Peek()).StopEOL) { // case for /* style comments + int index = lineAboveText == null ? -1 : lineAboveText.IndexOf("/*"); + + if (index > 0) { + string indentation = GetIndentation(textArea, lineNr - 1); + for (int i = indentation.Length; i < index; ++ i) { + indentation += ' '; + } + //// adding curline text + textArea.Document.Replace(curLine.Offset, cursorOffset - curLine.Offset, indentation + " * "+curLineText); + return indentation.Length + 3+curLineText.Length; + } + + index = lineAboveText.IndexOf("*"); + if (index > 0) { + string indentation = GetIndentation(textArea, lineNr - 1); + for (int i = indentation.Length; i < index; ++ i) { + indentation += ' '; + } + //// adding curline if present + textArea.Document.Replace(curLine.Offset, cursorOffset - curLine.Offset, indentation + "* "+curLineText); + return indentation.Length + 2 + curLineText.Length; + } + } else { // don't handle // lines, because they're only one lined comments + int indexAbove = lineAboveText.IndexOf("///"); + int indexNext = nextLineText.IndexOf("///"); + if (indexAbove > 0 && (indexNext != -1 || indexAbove + 4 < lineAbove.Length)) { + string indentation = GetIndentation(textArea, lineNr - 1); + for (int i = indentation.Length; i < indexAbove; ++ i) { + indentation += ' '; + } + //// adding curline text if present + textArea.Document.Replace(curLine.Offset, cursorOffset - curLine.Offset, indentation + "/// " + curLineText); + return indentation.Length + 4 /*+ curLineText.Length*/; + } + } + } + return IndentLine(textArea, lineNr); + } + return 0; + } + } +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Gui/CPPCodeGenerationPanel.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Gui/CPPCodeGenerationPanel.cs new file mode 100644 index 0000000000..6fe9e2ff03 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Gui/CPPCodeGenerationPanel.cs @@ -0,0 +1,152 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace CPPBinding +{ + public abstract class AbstractCPPConfigPanel : AbstractOptionPanel + { + protected CPPCompilerParameters compilerParameters; + protected System.Windows.Forms.PropertyGrid grid = new System.Windows.Forms.PropertyGrid(); + + protected abstract void SetGridObject(); + + public override void LoadPanelContents() + { + compilerParameters = (CPPCompilerParameters)((Properties)CustomizationObject).Get("Config"); + + grid.Dock = DockStyle.Fill; + SetGridObject(); + Controls.Add(grid); + } + + public override bool StorePanelContents() + { + return true; + } + } + + public class CPPCodeGenerationPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters; + } + } + #region compiler panels + public class GeneralCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.generalCPPOptions; + } + } + public class OptimizeCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.optimizeCPPOptions; + } + } + public class PreProcessorCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.preProcessorCPPOptions; + } + } + + public class CodeGenerationCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.codeGenerationCPPOptions; + } + } + + public class LanguageCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.languageCPPOptions; + } + } + + public class PreCompiledHeaderCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.preCompiledHeaderCPPOptions; + } + } + + public class OutputFileCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.outputFileCPPOptions; + } + } + + public class InformationSearchCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.informationSearchCPPOptions; + } + } + + public class ExtendedCPPOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.extendedCPPOptions; + } + } + #endregion + + public class GeneralLinkerOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.generalLinkerOptions; + } + } + public class InputLinkerOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.inputLinkerOptions; + } + } + public class DebugLinkerOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.debugLinkerOptions; + } + } + + public class SystemLinkerOptionsPanel : AbstractCPPConfigPanel + { + protected override void SetGridObject() + { + grid.SelectedObject = this.compilerParameters.systemLinkerOptions; + } + } + +} + diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/IncludeParser.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/IncludeParser.cs new file mode 100644 index 0000000000..0ec1df84d7 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/IncludeParser.cs @@ -0,0 +1,123 @@ +// +// -*- C# -*- +// +// Author: Roman Taranchenko +// Copyright: (c) 2004 Roman Taranchenko +// Copying Policy: GNU General Public License +// + +using System; +using System.Collections; +using System.IO; + +namespace CPPBinding +{ + + /// + /// Description of IncludeParser. + /// + public class IncludeParser + { + private IDependence _owner; + private IList _includeDirectories; + private bool _onlyProjectInclude; + + public IncludeParser(IDependence owner, IList includeDirectories, bool onlyProjectInclude) + { + _includeDirectories = includeDirectories; + _owner = owner; + _onlyProjectInclude = onlyProjectInclude; + } + + public IncludeParser(String fileName, IList includeDirectories, bool onlyProjectInclude) + { + _includeDirectories = includeDirectories; + _owner = new SourceFile(fileName); + _onlyProjectInclude = onlyProjectInclude; + } + + public IDependence Parse() + { + ParseFile(_owner); + return _owner; + } + + private void ParseFile(IDependence parent) + { + if (!parent.Exists) + { + return; + } + ArrayList includes = new ArrayList(); + StreamReader reader = File.OpenText(parent.Name); + using (reader) + { + string line = null; + while ((line = reader.ReadLine()) != null) + { + line = line.TrimStart(' ', '\t'); + if (line.StartsWith("#include")) + { + IDependence include = GetInclude(line); + if (include != null) + { + includes.Add(include); + } + } + } + } + foreach (IDependence include in includes) + { + parent.Add(include); + ParseFile(include); + } + } + + private IDependence GetInclude(string line) + { + IDependence result = null; + int start = -1, end = -1; + bool quotes = false; + + // find first index + for (int i = 8; i < line.Length; ++i) + { + if (!_onlyProjectInclude && line[i] == '<') + { + start = i+1; + break; + } + if (line[i] == '"') + { + start = i+1; + quotes = true; + break; + } + } + + // find second index + if (start > 0 && start + 1 < line.Length) + { + end = line.IndexOf(quotes ? '"' : '>', start + 1); + } + + // create include + if (start > 0 && end > start) + { + string includeName = line.Substring(start, end-start); + foreach (string dir in _includeDirectories) + { + string fullName = Path.Combine(dir, includeName); + if (!_owner.Contains(fullName) && File.Exists(fullName)) + { + result = new SourceFile(fullName); + } + } + } + + return result; + } + + } + +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Project/CPPNetCompilerParameters.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Project/CPPNetCompilerParameters.cs new file mode 100644 index 0000000000..10b0efb584 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Project/CPPNetCompilerParameters.cs @@ -0,0 +1,2257 @@ +// +// +// +// +// +// + +using System; +using System.ComponentModel; +using System.Text; +using System.Xml; +using System.Diagnostics; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Internal.Project; + +namespace CPPBinding +{ + #region OPTIMIZATION + public enum OptimizeLevel { + Deactivated, // /Od + MinimizeSize, // /O1 + MaximizeSpeed, // /O2 + CompleteOptimize // /Ox + } + + public enum FloatingPointConsistency { + Standard, + Enhanced // /Op + } + + public enum InlineFunctionExpansion + { + Standard, // /Ob0 + Manual, // /Ob1 + Automatic // /Ob2 + } + + public enum SizeOrSpeedOptimization + { + Neither, + Size, + Speed + } + + #endregion + + #region CODE GENERATION + public enum Architecture { + Mixed, + i386, // /G3 + i486, // /G4 + Pentium, // /G5 + PentiumPRO, // /G6 + Pentium4 // /G7 + } + + public enum CallingConvention { + __cdecl, // default (/Gd) + __fastcall, // /Gr + __stdcall // /Gz + } + + public enum EnhancedInstructionSet { + NotSpecified, + SSE, // /arch:SSE + SSE2 // /arch:SSE2 + } + + public enum RunTimeObservation { + Standard, + Stack, // /RTCs + UninitializedVariables, // /RTCu + Both // /RTCs /RTCu + } + + public enum ExceptionHandling { + None, + SynchronousExceptionHandling, // /GX + AsynchronousExceptionHandling // /EHa + } + + public enum StringPooling { + Disabled, + Enabled, + EnabledReadOnlyPooling + } + + #endregion + + #region DEBUGGING + public enum DebugInformationFormat { + Deactivated, + C7, // /Z7 + OnlyLineNumbers, // /Zd + ProgramDatabase, // /Zi + ProgramDatabaseWithEditAndContinue // /ZI + } + + #endregion + + #region PREPROCESSOR + public enum PreProcessorRun { + No, + WithLineNumbers, // /E + WithoutLineNumbers // /EP + } + #endregion + + #region LANGUAGE + public enum StructMemberAlignment { + Standard, + Byte1, // /Zp1 + Byte2, // /Zp2 + Byte4, // /Zp4 + Byte8, // /Zp8 + Byte16, // /Zp16 + } + + public enum LanguageExtensions { + Enable, // /Ze + Disable // /Za + } + + #endregion + + #region LINKING + public enum RunTimeLibrary { + MultiThreaded, // /MT + MultiThreadedDebug, // /MTd + MultiThreadedDLL, // /MD + MultiThreadedDebugDLL, // /MDd + SingleThreaded, // /ML + SingleThreadedDebug // /MLd + } + + public enum ConfigurationType { + Exe, + Dll + } + + #endregion + + #region PRECOMPILED HEADER + public enum PreCompiledHeader { + DontUsePre, // /Y- + Create, // /Yc + CreateAutomatically, // /YX + Use // /Yu + } + #endregion + + #region MISCELLANEOUS + public enum CompileType { + Standard, + C, // /TC + CPP // /TP + } + + #endregion + + + + public enum AssemblyOutput { + NoList, + ListAssembly, + ListAssemblyWithSource, + ListAssemblyWithCode, + ListAssemblyWithCodeAndSource, + } + + public enum ShowLinkerStatus { + Unselected, + ShowAll, + ShowSome + } + public enum IncrementalLinking { + Standard, + Yes, + No + } + + public enum DebuggableAssembly { + DontEmitDebuggable, + EnableDebugToRuntimeDisableOptimization, + DisableDebugToRuntimEnableOptimization + } + + public enum LinkerSubSystem { + Unselected, + Console, + Windows + } + public enum ActivateBigAddresses { + Standard, + NoSupport, + Supported + } + public enum TerminalServer { + Standard, + NotBound, + Bound + } + + /// + /// This class handles project specific compiler parameters + /// + public class CPPCompilerParameters : AbstractProjectConfiguration + { + + private static bool IsNotEmpty(string arg) + { + return arg != null && arg.Length > 0; + } + + private static void AppendOption(StringBuilder sb, String opt, String val) + { + AppendOption(sb, opt, val, true); + } + + private static void AppendOption(StringBuilder sb, String opt, String val, bool quote) + { + + sb.Append(opt); + if (quote) + sb.Append('"'); + sb.Append(val); + if (quote) + sb.Append('"'); + sb.Append("\n"); + } + + private static void AppendList(StringBuilder sb, String opt, String values) + { + AppendList(sb, opt, values, true); + } + + private static void AppendList(StringBuilder sb, String opt, String values, bool quote) + { + foreach (string val in values.Split(';')) + { + AppendOption(sb, opt, val, quote); + } + } + + #region Misc Options + [XmlNodeName("MiscOptions")] + public class MiscCPPOptions + { + [ConvertToRelativePath()] + [XmlAttribute("OutputDirectory")] + public string outputDirectory = ""; + + [ConvertToRelativePath()] + [XmlAttribute("IntermediateDirectory")] + public string intermediateDirectory = ""; + + [XmlAttribute("ConfigurationType")] + public ConfigurationType configurationType = ConfigurationType.Exe; + + [XmlAttribute("UseManagedExtensions")] + public bool useManagedExtensions = true; + + [XmlAttribute("additionalCompilerOptions")] + public string additionalCompilerOptions = ""; + } + #endregion + + #region General Options + [XmlNodeName("GeneralCPPOptions")] + public class GeneralCPPOptions + { + [XmlAttribute("additionalIncludeDirectories")] + public string additionalIncludeDirectories = ""; + + [XmlAttribute("additionalAssemblySearchPaths")] + public string additionalAssemblySearchPaths = ""; + + [XmlAttribute("debugInformationFormat")] + public DebugInformationFormat debugInformationFormat = DebugInformationFormat.Deactivated; + + [XmlAttribute("noStartLogo")] + public bool noStartLogo = true; + + [XmlAttribute("warningLevel")] + public int warningLevel = 4; + + [XmlAttribute("search64BitPortabilityProblems")] + public bool search64BitPortabilityProblems = false; + +// [XmlAttribute("treatWarningsAsErrors")] +// public bool treatWarningsAsErrors = false; + + [DefaultValue("")] + [LocalizedProperty("Additional include paths", + Description = "Specifies one or more semi-colon delimited additonal paths to search for includes. (/I[path])")] + public string AdditionalIncludeDirectories { + get { + return additionalIncludeDirectories; + } + set { + additionalIncludeDirectories = value; + } + } + + [DefaultValue("")] + [LocalizedProperty("Additional assembly search", + Description = "Specifies one or more semi-colon delimited additonal paths to search for #using assemblies. (/AI[path])")] + public string AdditionalAssemblySearchPaths { + get { + return additionalAssemblySearchPaths; + } + set { + additionalAssemblySearchPaths = value; + } + } + + [LocalizedProperty("Debug information format", + Description = "(/Z7, /Zd, /Zi. /ZI)")] + public DebugInformationFormat DebugInformationFormat { + get { + return debugInformationFormat; + } + set { + debugInformationFormat = value; + } + } + + [DefaultValue(true)] + [LocalizedProperty("Surpress Startup Logo", + Description = "Surpress the display of the startup logo and information messages. (/nologo)")] + public bool NoStartLogo { + get { + return noStartLogo; + } + set { + noStartLogo = value; + } + } + + [DefaultValue(4)] + [LocalizedProperty("Warning level", + Description = "(/W0 - /W4)")] + public int WarningLevel { + get { + return warningLevel; + } + set { + warningLevel = value; + } + } + + [DefaultValue(false)] + [LocalizedProperty("Search for 64-Bit portability problems", + Description = "(/Wp64)")] + public bool Search64BitPortabilityProblems { + get { + return search64BitPortabilityProblems; + } + set { + search64BitPortabilityProblems = value; + } + } + +// [DefaultValue(false)] +// [LocalizedProperty("Treat warnings as errors", +// Description = "(/WX)")] +// public bool TreatWarningsAsErrors { +// get { +// return treatWarningsAsErrors; +// } +// set { +// treatWarningsAsErrors = value; +// } +// } + + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + if (IsNotEmpty(AdditionalIncludeDirectories)) { + AppendList(result, "/I", AdditionalIncludeDirectories, true); + } + if (IsNotEmpty(AdditionalAssemblySearchPaths)) { + AppendList(result, "/AI", AdditionalAssemblySearchPaths, true); + } + switch (DebugInformationFormat) { + case DebugInformationFormat.Deactivated: + break; + case DebugInformationFormat.C7: + result.Append("/Z7\n"); + break; + case DebugInformationFormat.OnlyLineNumbers: + result.Append("/Zd\n"); + break; + case DebugInformationFormat.ProgramDatabase: + result.Append("/Zi\n"); + break; + case DebugInformationFormat.ProgramDatabaseWithEditAndContinue: + result.Append("/ZI\n"); + break; + + } + if (NoStartLogo) { + result.Append("/nologo\n"); + } + AppendOption(result, "/W", WarningLevel.ToString()); + if (Search64BitPortabilityProblems) { + result.Append("/Wp64\n"); + } +// if (TreatWarningsAsErrors) { +// result.Append("/WX\n"); +// } + + return result.ToString(); + } + } + #endregion + + #region Optimize Options + [XmlNodeName("OptimizeCPPOptions")] + public class OptimizeCPPOptions + { + [XmlAttribute("optimizeLevel")] + public OptimizeLevel optimizeLevel = OptimizeLevel.Deactivated; + + [XmlAttribute("useGlobalOptimize")] + public bool useGlobalOptimize = false; + + [XmlAttribute("inlineFunctionExtension")] + public InlineFunctionExpansion inlineFunctionExpansion = InlineFunctionExpansion.Standard; + + [XmlAttribute("activateSysInternalFunctions")] + public bool activateSysInternalFunctions = false; + + [XmlAttribute("floatingPointConsistency")] + public FloatingPointConsistency floatingPointConsistency = FloatingPointConsistency.Standard; + + [XmlAttribute("sizeOrSpeedOptimization")] + public SizeOrSpeedOptimization sizeOrSpeedOptimization = SizeOrSpeedOptimization.Neither; + + [XmlAttribute("surpressFramePointer")] + public bool surpressFramePointer = false; + + [XmlAttribute("enableFiberSaveOptimize")] + public bool enableFiberSaveOptimize = false; + + [XmlAttribute("architecture")] + public Architecture architecture = Architecture.Mixed; + + [XmlAttribute("optimizeForWindowsExecutable")] + public bool optimizeForWindowsExecutable = false; + + [LocalizedProperty("Optimize Level", + Description = "/Od,/O1,/O2,/Ox")] + public OptimizeLevel OptimizeLevel { + get { + return optimizeLevel; + } + set { + optimizeLevel = value; + } + } + + [DefaultValue(false)] + [LocalizedProperty("Use Global Optimization", + Description = "/Og")] + public bool UseGlobalOptimize { + get { + return useGlobalOptimize; + } + set { + useGlobalOptimize = value; + } + } + [LocalizedProperty("Inline Functions Expansion", + Description = "/Ob1,/Ob2")] + public InlineFunctionExpansion InlineFunctionExpansion { + get { + return inlineFunctionExpansion; + } + set { + inlineFunctionExpansion = value; + } + } +// [DefaultValue(false)] +// [LocalizedProperty("", +// Description = "")] +// public bool ActivateSysInternalFunctions { +// get { +// return activateSysInternalFunctions; +// } +// set { +// activateSysInternalFunctions = value; +// } +// } + [LocalizedProperty("Floating Point Consistency", + Description = "/Op")] + public FloatingPointConsistency FloatingPointConsistency { + get { + return floatingPointConsistency; + } + set { + floatingPointConsistency = value; + } + } + [LocalizedProperty("Size Or Speed Optimization", + Description = "/Ot,/Os")] + public SizeOrSpeedOptimization SizeOrSpeedOptimization { + get { + return sizeOrSpeedOptimization; + } + set { + sizeOrSpeedOptimization = value; + } + } + [DefaultValue(false)] + [LocalizedProperty("Suppress Frame Pointer", + Description = "/Oy")] + public bool SurpressFramePointer { + get { + return surpressFramePointer; + } + set { + surpressFramePointer = value; + } + } + [DefaultValue(false)] + [LocalizedProperty("Fiber Safety Support", + Description = "/GT")] + public bool EnableFiberSaveOptimize { + get { + return enableFiberSaveOptimize; + } + set { + enableFiberSaveOptimize = value; + } + } + [LocalizedProperty("Optimize for Processor", + Description = "/G3,/G4,/G5,/G6,/G7")] + public Architecture Architecture { + get { + return architecture; + } + set { + architecture = value; + } + } + [DefaultValue(false)] + [LocalizedProperty("Optimizes for Windows Application", + Description = "/GA")] + public bool OptimizeForWindowsExecutable { + get { + return optimizeForWindowsExecutable; + } + set { + optimizeForWindowsExecutable = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + switch (OptimizeLevel) { + case OptimizeLevel.CompleteOptimize: + result.Append("/Ox\n"); + break; + case OptimizeLevel.Deactivated: +// result.Append("/Od\n"); + break; + case OptimizeLevel.MaximizeSpeed: + result.Append("/O2\n"); + break; + case OptimizeLevel.MinimizeSize: + result.Append("/O1\n"); + break; + } + switch (FloatingPointConsistency) { + case FloatingPointConsistency.Enhanced: + result.Append("/Op\n"); + break; + } + switch (architecture) { + case Architecture.Mixed: + break; + case Architecture.i386: + result.Append("/G3\n"); + break; + case Architecture.i486: + result.Append("/G4\n"); + break; + case Architecture.Pentium: + result.Append("/G5\n"); + break; + case Architecture.PentiumPRO: + result.Append("/G6\n"); + break; + case Architecture.Pentium4: + result.Append("/G7\n"); + break; + } + if (UseGlobalOptimize) { + result.Append("/Og\n"); + } +// if (activateSysInternalFunctions) { +// result.Append("/\n"); +// } + if (surpressFramePointer) { + result.Append("/Oy\n"); + } + if (enableFiberSaveOptimize) { + result.Append("/GT\n"); + } + if (optimizeForWindowsExecutable) { + result.Append("/GA\n"); + } + switch (InlineFunctionExpansion) { + case InlineFunctionExpansion.Automatic: + result.Append("/Ob2\n"); + break; + case InlineFunctionExpansion.Manual: + result.Append("/Ob1\n"); + break; + case InlineFunctionExpansion.Standard: + break; + } + switch (SizeOrSpeedOptimization) { + case SizeOrSpeedOptimization.Neither: + break; + case SizeOrSpeedOptimization.Size: + result.Append("/Os\n"); + break; + case SizeOrSpeedOptimization.Speed: + result.Append("/Ot\n"); + break; + } + return result.ToString(); + } + } + #endregion + + #region Preprocessor Options + [XmlNodeName("PreProcessorCPPOptions")] + public class PreProcessorCPPOptions + { + [XmlAttribute("additionalDirectives")] + public string additionalDirectives = ""; + + [XmlAttribute("ignoreStandardIncludePath")] + public bool ignoreStandardIncludePath = false; + + [XmlAttribute("preProcessorRun")] + public PreProcessorRun preProcessorRun = PreProcessorRun.No; + + [XmlAttribute("keepComments")] + public bool keepComments = true; + + [LocalizedProperty("Pre Processor Directives", + Description = "Specifies additional pre processor directives. (/D[macro])")] + public string AdditionalDirectives { + get { + return additionalDirectives; + } + set { + additionalDirectives = value; + } + } + + [LocalizedProperty("Ignore standard search paths", + Description = "If true, standard search paths are ignored. (/X)")] + public bool IgnoreStandardIncludePath { + get { + return ignoreStandardIncludePath; + } + set { + ignoreStandardIncludePath = value; + } + } + + [LocalizedProperty("Pre Processor Run", + Description = "Specifies the pre processor options for this configuration. (/E, /P, /EP)")] + public PreProcessorRun PreProcessorRun { + get { + return preProcessorRun; + } + set { + preProcessorRun = value; + } + } + + [LocalizedProperty("Keep comments", + Description = "Specifies if comments should be removed from the source code. (/C)")] + public bool KeepComments { + get { + return keepComments; + } + set { + keepComments = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + if (IsNotEmpty(additionalDirectives)) { + AppendList(result, "/D", additionalDirectives); + } + if (ignoreStandardIncludePath) { + result.Append("/X\n"); + } + switch (preProcessorRun) { + case PreProcessorRun.No: + break; + case PreProcessorRun.WithLineNumbers: + result.Append("/P\n"); + if (keepComments) { + result.Append("/C\n"); + } + break; + case PreProcessorRun.WithoutLineNumbers: + result.Append("/EP\n/P\n"); + if (keepComments) { + result.Append("/C\n"); + } + break; + } + return result.ToString(); + } + } + #endregion + + #region Code Generation Options + [XmlNodeName("CodeGenerationCPPOptions")] + public class CodeGenerationCPPOptions + { + [XmlAttribute("activateStringPooling")] + public bool activateStringPooling = false; + + [XmlAttribute("activateMinimalRecompilation")] + public bool activateMinimalRecompilation = false; + + [XmlAttribute("activateCPPExceptions")] + public bool activateCPPExceptions = true; + + [XmlAttribute("observeSmallTypes")] + public bool observeSmallTypes = false; + + [XmlAttribute("runTimeObservation")] + public RunTimeObservation runTimeObservation = RunTimeObservation.Standard; + + [XmlAttribute("runTimeLibrary")] + public RunTimeLibrary runTimeLibrary = RunTimeLibrary.MultiThreaded; + + [XmlAttribute("structMemberAlignment")] + public StructMemberAlignment structMemberAlignment = StructMemberAlignment.Standard; + + [XmlAttribute("bufferOverflowCheck")] + public bool bufferOverflowCheck = false; + + [XmlAttribute("functionLevelLinking")] + public bool functionLevelLinking = false; + + [XmlAttribute("enhancedInstructionSet")] + public EnhancedInstructionSet enhancedInstructionSet = EnhancedInstructionSet.NotSpecified; + + [LocalizedProperty("Activate String Pooling", + Description = "(/GF)")] + public bool ActivateStringPooling { + get { + return activateStringPooling; + } + set { + activateStringPooling = value; + } + } + + [LocalizedProperty("Activate minimal recompilation", + Description = "(/Gm)")] + public bool ActivateMinimalRecompilation { + get { + return activateMinimalRecompilation; + } + set { + activateMinimalRecompilation = value; + } + } + + [LocalizedProperty("Activate C++ exceptions", + Description = "(/EHsc)")] + public bool ActivateCPPExceptions { + get { + return activateCPPExceptions; + } + set { + activateCPPExceptions = value; + } + } + + [LocalizedProperty("Observe small types", + Description = "(/RTCc)")] + public bool ObserveSmallTypes { + get { + return observeSmallTypes; + } + set { + observeSmallTypes = value; + } + } + + [LocalizedProperty("Full Runtimeobservation", + Description = "(/RTCs, /RTCu, /RTC1)")] + public RunTimeObservation RunTimeObservation { + get { + return runTimeObservation; + } + set { + runTimeObservation = value; + } + } + + [LocalizedProperty("Runtime library", + Description = "(/MT, /MTd, /MD, /MDd, /ML, /MLd)")] + public RunTimeLibrary RunTimeLibrary { + get { + return runTimeLibrary; + } + set { + runTimeLibrary = value; + } + } + + [LocalizedProperty("Struct member alignment", + Description = "1, 2, 4, 8 or 16 byte. (/Zp[number])")] + public StructMemberAlignment StructMemberAlignment { + get { + return structMemberAlignment; + } + set { + structMemberAlignment = value; + } + } + + [LocalizedProperty("Buffer overwflow check", + Description = "(/GS)")] + public bool BufferOverflowCheck { + get { + return bufferOverflowCheck; + } + set { + bufferOverflowCheck = value; + } + } + + [LocalizedProperty("Activate function level linking", + Description = "(/Gy)")] + public bool FunctionLevelLinking { + get { + return functionLevelLinking; + } + set { + functionLevelLinking = value; + } + } + + [LocalizedProperty("Activate enhanced instruction set", + Description = "(/arch:SSE, /arch:SSE2)")] + public EnhancedInstructionSet EnhancedInstructionSet { + get { + return enhancedInstructionSet; + } + set { + enhancedInstructionSet = value; + } + } + + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + if (activateStringPooling) { + result.Append("/GF\n"); + } + if (activateMinimalRecompilation) { + result.Append("/Gm\n"); + } + if (activateCPPExceptions) { + result.Append("/EHsc\n"); + } + + if (observeSmallTypes) { + result.Append("/RTCc\n"); + } + switch (runTimeObservation) { + case RunTimeObservation.Both: + result.Append("/RTCsu\n"); + break; + case RunTimeObservation.Stack: + result.Append("/RTCs\n"); + break; + case RunTimeObservation.UninitializedVariables: + result.Append("/RTCu\n"); + break; + } + switch (runTimeLibrary) { + case RunTimeLibrary.MultiThreaded: + result.Append("/MT\n"); + break; + case RunTimeLibrary.MultiThreadedDebug: + result.Append("/MTd\n"); + break; + case RunTimeLibrary.MultiThreadedDLL: + result.Append("/MD\n"); + break; + case RunTimeLibrary.MultiThreadedDebugDLL: + result.Append("/MDd\n"); + break; + case RunTimeLibrary.SingleThreaded: + result.Append("/ML\n"); + break; + case RunTimeLibrary.SingleThreadedDebug: + result.Append("/MLd\n"); + break; + } + + switch (structMemberAlignment) { + case StructMemberAlignment.Standard: + break; + case StructMemberAlignment.Byte1: + result.Append("/Zp1\n"); + break; + case StructMemberAlignment.Byte2: + result.Append("/Zp2\n"); + break; + case StructMemberAlignment.Byte4: + result.Append("/Zp4\n"); + break; + case StructMemberAlignment.Byte8: + result.Append("/Zp8\n"); + break; + case StructMemberAlignment.Byte16: + result.Append("/Zp16\n"); + break; + } + + if (bufferOverflowCheck) { + result.Append("/GS\n"); + } + if (functionLevelLinking) { + result.Append("/Gy\n"); + } + + switch (EnhancedInstructionSet) { + case EnhancedInstructionSet.NotSpecified: + break; + case EnhancedInstructionSet.SSE: + result.Append("/arch:SSE\n"); + break; + case EnhancedInstructionSet.SSE2: + result.Append("/arch:SSE2\n"); + break; + } + return result.ToString(); + } + } + #endregion + + #region Language Options + [XmlNodeName("LanguageCPPOptions")] + public class LanguageCPPOptions + { + [XmlAttribute("deactivateLanuageExtensions")] + public bool deactivateLanuageExtensions = false; + + [XmlAttribute("standardCharTypeIsUnsigned")] + public bool standardCharTypeIsUnsigned = true; + + [XmlAttribute("wchar_tIsBuiltIn")] + public bool wchar_tIsBuiltIn = false; + + [XmlAttribute("forceForScope")] + public bool forceForScope = false; + + [XmlAttribute("addRuntimeTypeInformation")] + public bool addRuntimeTypeInformation = true; + + public bool DeactivateLanuageExtensions { + get { + return deactivateLanuageExtensions; + } + set { + deactivateLanuageExtensions = value; + } + } + public bool StandardCharTypeIsUnsigned { + get { + return standardCharTypeIsUnsigned; + } + set { + standardCharTypeIsUnsigned = value; + } + } + public bool Wchar_tIsBuiltIn { + get { + return wchar_tIsBuiltIn; + } + set { + wchar_tIsBuiltIn = value; + } + } + public bool ForceForScope { + get { + return forceForScope; + } + set { + forceForScope = value; + } + } + public bool AddRuntimeTypeInformation { + get { + return addRuntimeTypeInformation; + } + set { + addRuntimeTypeInformation = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + + if (deactivateLanuageExtensions) { + result.Append("/Za\n"); + } + + if (standardCharTypeIsUnsigned) { + result.Append("/J\n"); + } + + if (wchar_tIsBuiltIn) { + result.Append("/Zc:wchar_t\n"); + } + + if (forceForScope) { + result.Append("/Zc:forScope\n"); + } + + if (addRuntimeTypeInformation) { + result.Append("/GR\n"); + } + + return result.ToString(); + } + } + #endregion + + #region PreCompiler Header Options + [XmlNodeName("PreCompiledHeaderCPPOptions")] + public class PreCompiledHeaderCPPOptions + { + [XmlAttribute("preCompiledHeader")] + public PreCompiledHeader preCompiledHeader = PreCompiledHeader.DontUsePre; + + [XmlAttribute("headerFile")] + public string headerFile = "Stdafx.H"; + + [ConvertToRelativePath()] + [XmlAttribute("preCompiledHeaderFile")] + public string preCompiledHeaderFile = ""; + + public PreCompiledHeader PreCompiledHeader { + get { + return preCompiledHeader; + } + set { + preCompiledHeader = value; + } + } + public string HeaderFile { + get { + return headerFile; + } + set { + headerFile = value; + } + } + public string PreCompiledHeaderFile + { + get + { + return preCompiledHeaderFile; + } + set + { + preCompiledHeaderFile = value; + } + } + + private void AppendHeaderFile(StringBuilder result) + { + if (IsNotEmpty(headerFile)) { + result.Append("\""); + result.Append(headerFile); + result.Append("\""); + } + result.Append("\n"); + } + + public string GetCreatePreCompiledHeaderParameter() + { + StringBuilder result = new StringBuilder(); + result.Append("/Yc"); + AppendHeaderFile(result); + + if (IsNotEmpty(preCompiledHeaderFile)) { + AppendOption(result, "/Fp", preCompiledHeaderFile); + } + + return result.ToString(); + } + + public bool PreCompileHeader { + get { + return preCompiledHeader == PreCompiledHeader.Create || + preCompiledHeader == PreCompiledHeader.Use; + } + } + + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + switch (preCompiledHeader) { + case PreCompiledHeader.DontUsePre: + result.Append("/Y-\n"); + break; + case PreCompiledHeader.Create: + case PreCompiledHeader.Use: + result.Append("/Yu"); + AppendHeaderFile(result); + break; + case PreCompiledHeader.CreateAutomatically: + result.Append("/YX"); + AppendHeaderFile(result); + break; + +// case PreCompiledHeader.Create: +// result.Append("/Yc"); +// AppendHeaderFile(result); +// break; +// case PreCompiledHeader.Use: +// result.Append("/Yu"); +// AppendHeaderFile(result); +// break; +// case PreCompiledHeader.CreateAutomatically: +// result.Append("/YX"); +// AppendHeaderFile(result); +// break; + } + + if (IsNotEmpty(preCompiledHeaderFile)) { + AppendOption(result, "/Fp", preCompiledHeaderFile); + } + + return result.ToString(); + } + } + #endregion + + #region Output File Options + [XmlNodeName("OutputFileCPPOptions")] + public class OutputFileCPPOptions + { + [XmlAttribute("extendSourceWithAttributes")] + public bool extendSourceWithAttributes = false; + + [XmlAttribute("assemblyOutput")] + public AssemblyOutput assemblyOutput = AssemblyOutput.NoList; + + [XmlAttribute("assemblerListSaveLocation")] + public string assemblerListSaveLocation = ""; + + [XmlAttribute("objectName")] + public string objectName = ""; + + [XmlAttribute("programDatabaseName")] + public string programDatabaseName = ""; + + public bool ExtendSourceWithAttributes { + get { + return extendSourceWithAttributes; + } + set { + extendSourceWithAttributes = value; + } + } + public AssemblyOutput AssemblyOutput { + get { + return assemblyOutput; + } + set { + assemblyOutput = value; + } + } + public string AssemblerListSaveLocation { + get { + return assemblerListSaveLocation; + } + set { + assemblerListSaveLocation = value; + } + } + public string ObjectName { + get { + return objectName; + } + set { + objectName = value; + } + } + public string ProgramDatabaseName { + get { + return programDatabaseName; + } + set { + programDatabaseName = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + + if (extendSourceWithAttributes) { + result.Append("/Fx\n"); + } + + switch (assemblyOutput) { + case AssemblyOutput.ListAssembly: + result.Append("/FA\n"); + break; + case AssemblyOutput.ListAssemblyWithCode: + result.Append("/FAc\n"); + break; + case AssemblyOutput.ListAssemblyWithCodeAndSource: + result.Append("/FAcs\n"); + break; + case AssemblyOutput.ListAssemblyWithSource: + result.Append("/FAs\n"); + break; + case AssemblyOutput.NoList: + break; + } + + if (IsNotEmpty(assemblerListSaveLocation)) + { + AppendOption(result, "/Fa", assemblerListSaveLocation); + } + + if (IsNotEmpty(objectName)) + { + AppendOption(result, "/Fo", objectName); + } + + if (IsNotEmpty(programDatabaseName)) + { + AppendOption(result, "/Fd", programDatabaseName); + } + return result.ToString(); + } + } + #endregion + + #region Information Search Options + [XmlNodeName("InformationSearchCPPOptions")] + public class InformationSearchCPPOptions + { + [XmlAttribute("activateBrowseInformation")] + public bool activateBrowseInformation = false; + + [XmlAttribute("browseFile")] + public string browseFile = ""; + + public bool ActivateBrowseInformation { + get { + return activateBrowseInformation; + } + set { + activateBrowseInformation = value; + } + } + public string BrowseFile { + get { + return browseFile; + } + set { + browseFile = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + if (activateBrowseInformation) { + result.Append("/FR"); + if (IsNotEmpty(browseFile)) + { + result.Append(browseFile); + } + result.Append("\n"); + } + return result.ToString(); + } + } + #endregion + + #region Extended Options + [XmlNodeName("ExtendedCPPOptions")] + public class ExtendedCPPOptions + { + [XmlAttribute("callingConvention")] + public CallingConvention callingConvention = CallingConvention.__cdecl; + + [XmlAttribute("compileType")] + public CompileType compileType = CompileType.CPP; + + [XmlAttribute("surpressedWarnings")] + public string surpressedWarnings = ""; + + [XmlAttribute("forcedIncludes")] + public string forcedIncludes = ""; + + [XmlAttribute("forcedUsings")] + public string forcedUsings = ""; + + [XmlAttribute("showIncludes")] + public bool showIncludes = false; + + [XmlAttribute("overridePreProcessorDirectives")] + public string overridePreProcessorDirectives = ""; + + [XmlAttribute("overrideAllPreProcessorDirectives")] + public bool overrideAllPreProcessorDirectives = false; + + public CallingConvention CallingConvention { + get { + return callingConvention; + } + set { + callingConvention = value; + } + } + public CompileType CompileType { + get { + return compileType; + } + set { + compileType = value; + } + } + public string SurpressedWarnings { + get { + return surpressedWarnings; + } + set { + surpressedWarnings = value; + } + } + public string ForcedIncludes { + get { + return forcedIncludes; + } + set { + forcedIncludes = value; + } + } + public string ForcedUsings { + get { + return forcedUsings; + } + set { + forcedUsings = value; + } + } + public bool ShowIncludes { + get { + return showIncludes; + } + set { + showIncludes = value; + } + } + public string OverridePreProcessorDirectives { + get { + return overridePreProcessorDirectives; + } + set { + overridePreProcessorDirectives = value; + } + } + public bool OverrideAllPreProcessorDirectives { + get { + return overrideAllPreProcessorDirectives; + } + set { + overrideAllPreProcessorDirectives = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + switch (CallingConvention) { + case CallingConvention.__cdecl: + result.Append("/Gd\n"); + break; + case CallingConvention.__fastcall: + result.Append("/Gr\n"); + break; + case CallingConvention.__stdcall: + result.Append("/Gz\n"); + break; + } + + switch (CompileType) { + case CompileType.C: + result.Append("/TC\n"); + break; + case CompileType.CPP: + result.Append("/TP\n"); + break; + case CompileType.Standard: + break; + } + + if (IsNotEmpty(surpressedWarnings)) + { + AppendList(result, "/wd", surpressedWarnings); + } + + if (IsNotEmpty(forcedIncludes)) + { + AppendList(result, "/FI", forcedIncludes, true); + } + + if (IsNotEmpty(forcedUsings)) + { + AppendList(result, "/FU", forcedUsings, true); + } + + if (showIncludes) + { + result.Append("/showIncludes\n"); + } + + if (overrideAllPreProcessorDirectives) + { + result.Append("/u\n"); + } + else + { + if (IsNotEmpty(overridePreProcessorDirectives)) + { + AppendList(result, "/U", overridePreProcessorDirectives); + } + } + + return result.ToString(); + } + } + #endregion + + #region General Linker Options + [XmlNodeName("GeneralLinkerOptions")] + public class GeneralLinkerOptions : LocalizedObject + { + [XmlAttribute("outputFile")] + [ConvertToRelativePath()] + public string outputFile = "a.exe"; + + [XmlAttribute("showLinkerStatus")] + public ShowLinkerStatus showLinkerStatus = ShowLinkerStatus.Unselected; + + [XmlAttribute("version")] + public string version = ""; + + [XmlAttribute("incrementalLinking")] + public IncrementalLinking incrementalLinking = IncrementalLinking.Standard; + + [XmlAttribute("surpressStartLogo")] + public bool surpressStartLogo = false; + + [XmlAttribute("additionalLinkerOptions")] + public string additionalLinkerOptions = ""; + +// [XmlAttribute("ignoreImportLibrary")] +// public bool ignoreImportLibrary = true; + +// [XmlAttribute("registerOutput")] +// public bool registerOutput = false; + + [XmlAttribute("additionalLibraryDirectories")] + public string additionalLibraryDirectories = ""; + + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); +// result.Append("/OUT:");result.Append(outputFile);result.Append("\n"); + switch (ShowLinkerStatus) { + case ShowLinkerStatus.ShowAll: + result.Append("/VERBOSE\n"); + break; + case ShowLinkerStatus.ShowSome: + result.Append("/VERBOSE:LIB\n"); + break; + + } + if (IsNotEmpty(version)) { + result.Append("/VERSION:").Append(version).Append("\n"); + } + + switch (IncrementalLinking) { + case IncrementalLinking.Standard: + break; + case IncrementalLinking.No: + result.Append("/INCREMENTAL:NO\n"); + break; + case IncrementalLinking.Yes: + result.Append("/INCREMENTAL\n"); + break; + } + + if (SurpressStartLogo) { + result.Append("/NOLOGO\n"); + } + + if (IsNotEmpty(AdditionalLibraryDirectories)) { + AppendList(result, "/LIBPATH:", AdditionalLibraryDirectories, true); + } + result.Append(additionalLinkerOptions); + result.Append("\n"); + return result.ToString(); + } + + [LocalizedProperty("Output File", + Description = "Specifies the name of the output file. (/OUT:[file])")] + public string OutputFile { + get { + return outputFile; + } + set { + outputFile = value; + } + } + + [DefaultValue(ShowLinkerStatus.Unselected)] + [LocalizedProperty("Show Status", + Description = "Shows detailed progress status. (/VERBOSE, /VERBOSE:LIB)")] + public ShowLinkerStatus ShowLinkerStatus { + get { + return showLinkerStatus; + } + set { + showLinkerStatus = value; + } + } + + [DefaultValue("")] + [LocalizedProperty("Version", + Description = "Use this value as the version number in created image header. (/VERSION:[version])")] + public string Version { + get { + return version; + } + set { + version = value; + } + } + + [DefaultValue(IncrementalLinking.Standard)] + [LocalizedProperty("Enable Incremental Linking", + Description = "Enables incremental linking. (/INCREMENTAL, /INCREMENTAL:NO)")] + public IncrementalLinking IncrementalLinking { + get { + return incrementalLinking; + } + set { + incrementalLinking = value; + } + } + + [DefaultValue(false)] + [LocalizedProperty("Surpress Startup Logo", + Description = "Surpress the display of the startup logo and information messages. (/NOLOGO)")] + public bool SurpressStartLogo { + get { + return surpressStartLogo; + } + set { + surpressStartLogo = value; + } + } + +// [DefaultValue(true)] +// [LocalizedProperty("Ignore Import Library", +// Description = "Specifies that the import library generated by this configuration should not be imported into dependent projects.")] +// public bool IgnoreImportLibrary { +// get { +// return ignoreImportLibrary; +// } +// set { +// ignoreImportLibrary = value; +// } +// } + +// [LocalizedProperty("Register Output", +// Description = "Specifies whether to register the primary output of this build.")] +// public bool RegisterOutput { +// get { +// return registerOutput; +// } +// set { +// registerOutput = value; +// } +// } + + [DefaultValue("")] + [LocalizedProperty("Additional Library Directories", + Description = "Specifies one or more semi-colon delimited additonal paths to search for libraries. (/LIBPATH:[path])")] + public string AdditionalLibraryDirectories { + get { + return additionalLibraryDirectories; + } + set { + additionalLibraryDirectories = value; + } + } + + [DefaultValue("")] + [LocalizedProperty("Additional Linker Options", + Description = "Specifies additional options given to the linker.")] + public string AdditionalLinkerOptions { + get { + return additionalLinkerOptions; + } + set { + additionalLinkerOptions = value; + } + } + + + } + #endregion + + #region Input Linker Options + [XmlNodeName("InputLinkerOptions")] + public class InputLinkerOptions + { + [XmlAttribute("additionalDependencies")] + public string additionalDependencies = ""; + + [XmlAttribute("ignoreStandardLibrary")] + public bool ignoreStandardLibrary = false; + + [XmlAttribute("ignoreLibrary")] + public string ignoreLibrary = ""; + + [XmlAttribute("moduleDefinition")] + public string moduleDefinition = ""; + + [XmlAttribute("addModuleToAssembly")] + public string addModuleToAssembly = ""; + + [XmlAttribute("embedResourceToAssembly")] + public string embedResourceToAssembly = ""; + + [XmlAttribute("forcedSymbolLinks")] + public string forcedSymbolLinks = ""; + + [XmlAttribute("laterLoadedDLLs")] + public string laterLoadedDLLs = ""; + + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + if (ignoreStandardLibrary) + { + result.Append("/NODEFAULTLIB\n"); + } + else + { + if (IsNotEmpty(ignoreLibrary)) + { + AppendList(result, "/NODEFAULTLIB:", ignoreLibrary); + } + } + if (IsNotEmpty(additionalDependencies)) + { + AppendList(result, "", additionalDependencies); + } + if (IsNotEmpty(moduleDefinition)) + { + result.Append("/DEF:"); + result.Append(moduleDefinition); + result.Append("\n"); + } + if (IsNotEmpty(addModuleToAssembly)) + { + AppendList(result, "/ASSEMBLYMODULE:", addModuleToAssembly); + } + if (IsNotEmpty(embedResourceToAssembly)) + { + AppendList(result, "/ASSEMBLYRESOURCE:", embedResourceToAssembly); + } + if (IsNotEmpty(forcedSymbolLinks)) + { + AppendList(result, "/INCLUDE:", forcedSymbolLinks); + } + if (IsNotEmpty(laterLoadedDLLs)) + { + AppendList(result, "/DELAYLOAD:", laterLoadedDLLs); + } + return result.ToString(); + } + + public string AdditionalDependencies { + get { + return additionalDependencies; + } + set { + additionalDependencies = value; + } + } + + public bool IgnoreStandardLibrary { + get { + return ignoreStandardLibrary; + } + set { + ignoreStandardLibrary = value; + } + } + public string IgnoreLibrary { + get { + return ignoreLibrary; + } + set { + ignoreLibrary = value; + } + } + public string ModuleDefinition { + get { + return moduleDefinition; + } + set { + moduleDefinition = value; + } + } + public string AddModuleToAssembly { + get { + return addModuleToAssembly; + } + set { + addModuleToAssembly = value; + } + } + public string EmbedResourceToAssembly { + get { + return embedResourceToAssembly; + } + set { + embedResourceToAssembly = value; + } + } + public string ForcedSymbolLinks { + get { + return forcedSymbolLinks; + } + set { + forcedSymbolLinks = value; + } + } + public string LaterLoadedDLLs { + get { + return laterLoadedDLLs; + } + set { + laterLoadedDLLs = value; + } + } + + } + #endregion + + #region Debug Linker Options + [XmlNodeName("DebugLinkerOptions")] + public class DebugLinkerOptions + { + [XmlAttribute("generateDebugInfo")] + public bool generateDebugInfo = false; + + [XmlAttribute("generatedProgramDatabase")] + public string generatedProgramDatabase = ""; + + [XmlAttribute("removePrivateSymbols")] + public string removePrivateSymbols = ""; + + [XmlAttribute("generateMapFile")] + public bool generateMapFile = false; + + [XmlAttribute("mapFile")] + public string mapFile = ""; + + [XmlAttribute("mapExport")] + public bool mapExport = false; + + [XmlAttribute("mapLines")] + public bool mapLines = false; + + [XmlAttribute("debuggableAssembly")] + public DebuggableAssembly debuggableAssembly; + + public bool GenerateDebugInfo { + get { + return generateDebugInfo; + } + set { + generateDebugInfo = value; + } + } + public string GeneratedProgramDatabase { + get { + return generatedProgramDatabase; + } + set { + generatedProgramDatabase = value; + } + } + public string RemovePrivateSymbols { + get { + return removePrivateSymbols; + } + set { + removePrivateSymbols = value; + } + } + public bool GenerateMapFile { + get { + return generateMapFile; + } + set { + generateMapFile = value; + } + } + public string MapFile { + get { + return mapFile; + } + set { + mapFile = value; + } + } + public bool MapExport { + get { + return mapExport; + } + set { + mapExport = value; + } + } + public bool MapLines { + get { + return mapLines; + } + set { + mapLines = value; + } + } + public DebuggableAssembly DebuggableAssembly { + get { + return debuggableAssembly; + } + set { + debuggableAssembly = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + + if (generateDebugInfo) + { + result.Append("/DEBUG\n"); + } + + if (IsNotEmpty(generatedProgramDatabase)) + { + result.Append("/PDB:"); + result.Append(generatedProgramDatabase); + result.Append("\n"); + } + + if (IsNotEmpty(removePrivateSymbols)) + { + result.Append("/PDBSTRIPPED:"); + result.Append(removePrivateSymbols); + result.Append("\n"); + } + + if (generateMapFile) + { + result.Append("/MAP"); + if (IsNotEmpty(mapFile)) + { + result.Append(":"); + result.Append(mapFile); + } + result.Append("\n"); + + } + + if (mapExport) + { + result.Append("/MAPINFO:EXPORTS\n"); + } + + if (mapLines) + { + result.Append("/MAPINFO:LINES\n"); + } + + switch (debuggableAssembly) { + case DebuggableAssembly.DontEmitDebuggable: + break; + case DebuggableAssembly.DisableDebugToRuntimEnableOptimization: + result.Append("/ASSEMBLYDEBUG:DISABLE\n"); + break; + case DebuggableAssembly.EnableDebugToRuntimeDisableOptimization: + result.Append("/ASSEMBLYDEBUG\n"); + break; + } + + return result.ToString(); + } + + } + #endregion + + #region System Linker Options + [XmlNodeName("SystemLinkerOptions")] + public class SystemLinkerOptions + { + [XmlAttribute("linkerSubSystem")] + public LinkerSubSystem linkerSubSystem = LinkerSubSystem.Unselected; + + [XmlAttribute("heapAllocationSize")] + public int heapAllocationSize = 0; + + [XmlAttribute("heapCommitSize")] + public int heapCommitSize = 0; + + [XmlAttribute("stackAllocationSize")] + public int stackAllocationSize = 0; + + [XmlAttribute("stackCommitSize")] + public int stackCommitSize= 0; + + [XmlAttribute("activateBigAddresses")] + public ActivateBigAddresses activateBigAddresses = ActivateBigAddresses.Standard; + + [XmlAttribute("terminalServer")] + public TerminalServer terminalServer = TerminalServer.Standard; + + [XmlAttribute("runFromCDROM")] + public bool runFromCDROM = false; + + [XmlAttribute("runFromNetwork")] + public bool runFromNetwork = false; + + public LinkerSubSystem LinkerSubSystem { + get { + return linkerSubSystem; + } + set { + linkerSubSystem = value; + } + } + public int HeapAllocationSize { + get { + return heapAllocationSize; + } + set { + heapAllocationSize = value; + } + } + public int HeapCommitSize { + get { + return heapCommitSize; + } + set { + heapCommitSize = value; + } + } + public int StackAllocationSize { + get { + return stackAllocationSize; + } + set { + stackAllocationSize = value; + } + } + public int StackCommitSize { + get { + return stackCommitSize; + } + set { + stackCommitSize = value; + } + } + public ActivateBigAddresses ActivateBigAddresses { + get { + return activateBigAddresses; + } + set { + activateBigAddresses = value; + } + } + public TerminalServer TerminalServer { + get { + return terminalServer; + } + set { + terminalServer = value; + } + } + public bool RunFromCDROM { + get { + return runFromCDROM; + } + set { + runFromCDROM = value; + } + } + public bool RunFromNetwork { + get { + return runFromNetwork; + } + set { + runFromNetwork = value; + } + } + public string GetCommandLineParameters() + { + StringBuilder result = new StringBuilder(); + + switch (LinkerSubSystem) { + case LinkerSubSystem.Console: + result.Append("/SUBSYSTEM:CONSOLE\n"); + break; + case LinkerSubSystem.Unselected: + break; + case LinkerSubSystem.Windows: + result.Append("/SUBSYSTEM:WINDOWS\n"); + break; + } + + if (heapAllocationSize > 0) + { + result.Append("/HEAP:"); + result.Append(heapAllocationSize); + if (heapCommitSize > 0) + { + result.Append(","); + result.Append(heapCommitSize); + } + result.Append("\n"); + } + + if (stackAllocationSize > 0) + { + result.Append("/STACK:"); + result.Append(stackAllocationSize); + if (stackCommitSize > 0) + { + result.Append(","); + result.Append(stackCommitSize); + } + result.Append("\n"); + } + + switch (ActivateBigAddresses) { + case ActivateBigAddresses.NoSupport: + result.Append("/LARGEADDRESSAWARE:NO\n"); + break; + case ActivateBigAddresses.Standard: + break; + case ActivateBigAddresses.Supported: + result.Append("/LARGEADDRESSAWARE\n"); + break; + } + + switch (TerminalServer) { + case TerminalServer.Bound: + result.Append("/TSAWARE\n"); + break; + case TerminalServer.NotBound: + result.Append("/TSAWARE:NO\n"); + break; + case TerminalServer.Standard: + break; + } + + if (runFromCDROM) + { + result.Append("/SWAPRUN:CD\n"); + } + + if (runFromNetwork) + { + result.Append("/SWAPRUN:NET\n"); + } + + return result.ToString(); + } + + } + #endregion + + + public bool PreCompileHeader { + get { + return preCompiledHeaderCPPOptions.PreCompileHeader; + } + } + + public string GetPreCompiledHeaderOptions() + { + return generalCPPOptions.GetCommandLineParameters() + + optimizeCPPOptions.GetCommandLineParameters() + + preProcessorCPPOptions.GetCommandLineParameters() + + codeGenerationCPPOptions.GetCommandLineParameters() + + languageCPPOptions.GetCommandLineParameters() + + preCompiledHeaderCPPOptions.GetCreatePreCompiledHeaderParameter() + + outputFileCPPOptions.GetCommandLineParameters() + + informationSearchCPPOptions.GetCommandLineParameters() + + extendedCPPOptions.GetCommandLineParameters(); + } + + public string GetCompilerOptions() + { + return generalCPPOptions.GetCommandLineParameters() + + optimizeCPPOptions.GetCommandLineParameters() + + preProcessorCPPOptions.GetCommandLineParameters() + + codeGenerationCPPOptions.GetCommandLineParameters() + + languageCPPOptions.GetCommandLineParameters() + + preCompiledHeaderCPPOptions.GetCommandLineParameters() + + outputFileCPPOptions.GetCommandLineParameters() + + informationSearchCPPOptions.GetCommandLineParameters() + + extendedCPPOptions.GetCommandLineParameters(); + } + + public string GetLinkerOptions() + { + return generalLinkerOptions.GetCommandLineParameters() + + inputLinkerOptions.GetCommandLineParameters() + + debugLinkerOptions.GetCommandLineParameters() + + systemLinkerOptions.GetCommandLineParameters(); + } + + public string GetLinkerOptionsForCompiler() + { + StringBuilder result = new StringBuilder(); + foreach (string val in GetLinkerOptions().Split('\n')) + { + result.Append(val); + result.Append("\n"); + } + return result.ToString(); + } + + public GeneralCPPOptions generalCPPOptions = new GeneralCPPOptions(); + public OptimizeCPPOptions optimizeCPPOptions = new OptimizeCPPOptions(); + public PreProcessorCPPOptions preProcessorCPPOptions = new PreProcessorCPPOptions(); + public CodeGenerationCPPOptions codeGenerationCPPOptions = new CodeGenerationCPPOptions(); + public LanguageCPPOptions languageCPPOptions = new LanguageCPPOptions(); + public PreCompiledHeaderCPPOptions preCompiledHeaderCPPOptions = new PreCompiledHeaderCPPOptions(); + public OutputFileCPPOptions outputFileCPPOptions = new OutputFileCPPOptions(); + public InformationSearchCPPOptions informationSearchCPPOptions = new InformationSearchCPPOptions(); + public ExtendedCPPOptions extendedCPPOptions = new ExtendedCPPOptions(); + + public GeneralLinkerOptions generalLinkerOptions = new GeneralLinkerOptions(); + public InputLinkerOptions inputLinkerOptions = new InputLinkerOptions(); + public DebugLinkerOptions debugLinkerOptions = new DebugLinkerOptions(); + public SystemLinkerOptions systemLinkerOptions = new SystemLinkerOptions(); + + MiscCPPOptions miscCPPOptions = new MiscCPPOptions(); + + public override string OutputDirectory { + get { + return miscCPPOptions.outputDirectory; + } + set { + miscCPPOptions.outputDirectory = value; + } + } + + public string OutputFile { + get { + return generalLinkerOptions.OutputFile; + } + set { + generalLinkerOptions.OutputFile = value; + } + } + + public string IntermediateDirectory { + get { + return miscCPPOptions.intermediateDirectory; + } + set { + miscCPPOptions.intermediateDirectory = value; + } + } + + public ConfigurationType ConfigurationType { + get { + return miscCPPOptions.configurationType; + } + set { + miscCPPOptions.configurationType = value; + } + } + + public bool UseManagedExtensions { + get { + return miscCPPOptions.useManagedExtensions; + } + set { + miscCPPOptions.useManagedExtensions = value; + } + } + + public string AdditionalCompilerOptions { + get { + return miscCPPOptions.additionalCompilerOptions; + } + set { + miscCPPOptions.additionalCompilerOptions = value; + } + } + +// public CPPCompilerParameters(string[] additionalCompilerOptions) +// { +// this.AdditionalCompilerOptions = additionalCompilerOptions; +// } + + public CPPCompilerParameters() + { + } + + public CPPCompilerParameters(string name) + { + this.name = name; + + } + } +} diff --git a/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Project/CPPNetProject.cs b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Project/CPPNetProject.cs new file mode 100644 index 0000000000..57c47f7f88 --- /dev/null +++ b/src/AddIns/BackendBindings/CPPNetBinding/Project/Src/Project/CPPNetProject.cs @@ -0,0 +1,61 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.ComponentModel; +using System.Xml; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; + +namespace CPPBinding +{ + /// + /// This class describes a C Sharp project and it compilation options. + /// + public class CPPProject : AbstractProject + { + public override string ProjectType { + get { + return CPPLanguageBinding.LanguageName; + } + } + + public CPPProject() + { + } + + public override IConfiguration CreateConfiguration() + { + return new CPPCompilerParameters(); + } + + public CPPProject(ProjectCreateInformation info, XmlElement projectOptions) + { + if (info != null) { + Name = info.ProjectName; + Configurations.Add(CreateConfiguration("Debug")); + Configurations.Add(CreateConfiguration("Release")); + + foreach (CPPCompilerParameters parameter in Configurations) { + parameter.OutputDirectory = info.BinPath + Path.DirectorySeparatorChar + parameter.Name; + parameter.IntermediateDirectory = info.BinPath + Path.DirectorySeparatorChar + parameter.Name; + parameter.OutputAssembly = Name; + if (projectOptions != null) { + if (projectOptions.Attributes["ConfigurationType"] != null) { + parameter.ConfigurationType = (ConfigurationType)Enum.Parse(typeof(ConfigurationType), projectOptions.Attributes["ConfigurationType"].InnerText); + } + } + parameter.OutputFile = parameter.OutputDirectory + Path.DirectorySeparatorChar + Name + (parameter.ConfigurationType == ConfigurationType.Dll ? ".dll" : ".exe"); + } + } + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin new file mode 100644 index 0000000000..307072752e --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj new file mode 100644 index 0000000000..2e035f9a31 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj @@ -0,0 +1,110 @@ + + + Debug + AnyCPU + 8.0.41115 + 2.0 + {1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} + CSharpBinding + Library + 4 + False + False + OnSuccessfulBuild + Library + + + True + True + True + True + ..\..\..\..\..\AddIns\AddIns\BackendBindings\CSharpBinding\ + True + + + True + True + True + True + ..\..\..\..\..\AddIns\AddIns\BackendBindings\CSharpBinding\ + False + + + + + + + + + + + + + + + + + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + + + + + + {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} + ICSharpCode.TextEditor + False + + + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} + NRefactory + False + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + False + + + + + + + + + + + True + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj.user b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj.user new file mode 100644 index 0000000000..9cfbe798d4 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj.user @@ -0,0 +1,11 @@ + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + + 8.0.41115 + ShowAllFiles + 0 + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Configuration/AssemblyInfo.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..583fac7b1f --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("C#Binding")] +[assembly: AssemblyDescription("C# language binding for #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("www.icsharpcode.net")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 Mike Krueger")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/AdvancedBuildOptionsDialog.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/AdvancedBuildOptionsDialog.xfrm new file mode 100644 index 0000000000..ecc4feaf68 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/AdvancedBuildOptionsDialog.xfrm @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/ApplicationSettings.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/ApplicationSettings.xfrm new file mode 100644 index 0000000000..769fc5ec89 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/ApplicationSettings.xfrm @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildEvents.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildEvents.xfrm new file mode 100644 index 0000000000..61223c2808 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildEvents.xfrm @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm new file mode 100644 index 0000000000..243d8737d9 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/BuildOptions.xfrm @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/DebugOptions.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/DebugOptions.xfrm new file mode 100644 index 0000000000..b1f7bf7319 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/DebugOptions.xfrm @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/Publish.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/Publish.xfrm new file mode 100644 index 0000000000..d32a0042f6 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/Publish.xfrm @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/ReferencePaths.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/ReferencePaths.xfrm new file mode 100644 index 0000000000..46c7d351a3 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/ReferencePaths.xfrm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/Signing.xfrm b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/Signing.xfrm new file mode 100644 index 0000000000..7526bc0631 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Resources/Signing.xfrm @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs new file mode 100644 index 0000000000..a636617a76 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs @@ -0,0 +1,592 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Text; + +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.Core; + +namespace ICSharpCode.Core +{ + public class CSharpAmbience : AbstractAmbience + { + static string[,] typeConversionList = new string[,] { + {"System.Void", "void"}, + {"System.Object", "object"}, + {"System.Boolean", "bool"}, + {"System.Byte", "byte"}, + {"System.SByte", "sbyte"}, + {"System.Char", "char"}, + {"System.Enum", "enum"}, + {"System.Int16", "short"}, + {"System.Int32", "int"}, + {"System.Int64", "long"}, + {"System.UInt16", "ushort"}, + {"System.UInt32", "uint"}, + {"System.UInt64", "ulong"}, + {"System.Single", "float"}, + {"System.Double", "double"}, + {"System.Decimal", "decimal"}, + {"System.String", "string"} + }; + + static Hashtable typeConversionTable = new Hashtable(); + + public static Hashtable TypeConversionTable { + get { + return typeConversionTable; + } + } + + static CSharpAmbience() + { + for (int i = 0; i < typeConversionList.GetLength(0); ++i) { + typeConversionTable[typeConversionList[i, 0]] = typeConversionList[i, 1]; + } + } + + bool ModifierIsSet(ModifierEnum modifier, ModifierEnum query) + { + return (modifier & query) == query; + } + + public override string Convert(ModifierEnum modifier) + { + if (ShowAccessibility) { + if (ModifierIsSet(modifier, ModifierEnum.Public)) { + return "public "; + } else if (ModifierIsSet(modifier, ModifierEnum.Private)) { + return "private "; + } else if (ModifierIsSet(modifier, ModifierEnum.ProtectedAndInternal)) { + return "protected internal "; + } else if (ModifierIsSet(modifier, ModifierEnum.ProtectedOrInternal)) { + return "internal protected "; + } else if (ModifierIsSet(modifier, ModifierEnum.Internal)) { + return "internal "; + } else if (ModifierIsSet(modifier, ModifierEnum.Protected)) { + return "protected "; + } + } + + return string.Empty; + } + + string GetModifier(IDecoration decoration) + { + string ret = ""; + + if (IncludeHTMLMarkup) { + ret += ""; + } + + if (decoration.IsStatic) { + ret += "static "; + } else if (decoration.IsFinal) { + ret += "final "; + } else if (decoration.IsVirtual) { + ret += "virtual "; + } else if (decoration.IsOverride) { + ret += "override "; + } else if (decoration.IsNew) { + ret += "new "; + } + + if (IncludeHTMLMarkup) { + ret += ""; + } + + return ret; + } + + + public override string Convert(IClass c) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(c.Modifiers)); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (ShowModifiers) { + if (c.IsSealed) { + switch (c.ClassType) { + case ClassType.Delegate: + case ClassType.Struct: + case ClassType.Enum: + break; + + default: + builder.Append("sealed "); + break; + } + } else if (c.IsAbstract && c.ClassType != ClassType.Interface) { + builder.Append("abstract "); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (ShowModifiers) { + switch (c.ClassType) { + case ClassType.Delegate: + builder.Append("delegate"); + break; + case ClassType.Class: + builder.Append("class"); + break; + case ClassType.Struct: + builder.Append("struct"); + break; + case ClassType.Interface: + builder.Append("interface"); + break; + case ClassType.Enum: + builder.Append("enum"); + break; + } + builder.Append(' '); + } + if (c.ClassType == ClassType.Delegate && c.Methods.Count > 0) { + foreach(IMethod m in c.Methods) { + if (m.Name != "Invoke") continue; + + builder.Append(Convert(m.ReturnType)); + builder.Append(' '); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(c.FullyQualifiedName); + } else { + builder.Append(c.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (c.ClassType == ClassType.Delegate) { + builder.Append(" ("); + if (IncludeHTMLMarkup) builder.Append("
"); + + foreach(IMethod m in c.Methods) { + if (m.Name != "Invoke") continue; + + for (int i = 0; i < m.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + + builder.Append(Convert(m.Parameters[i])); + if (i + 1 < m.Parameters.Count) builder.Append(", "); + + if (IncludeHTMLMarkup) builder.Append("
"); + } + } + builder.Append(')'); + + } else if (ShowInheritanceList) { + if (c.BaseTypes.Count > 0) { + builder.Append(" : "); + for (int i = 0; i < c.BaseTypes.Count; ++i) { + builder.Append(c.BaseTypes[i]); + if (i + 1 < c.BaseTypes.Count) { + builder.Append(", "); + } + } + } + } + + if (IncludeBodies) { + builder.Append("\n{"); + } + + return builder.ToString(); + } + + public override string ConvertEnd(IClass c) + { + return "}"; + } + + public override string Convert(IField field) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(field.Modifiers)); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (ShowModifiers) { + if (field.IsStatic && field.IsLiteral) { + builder.Append("const "); + } else if (field.IsStatic) { + builder.Append("static "); + } + + if (field.IsReadonly) { + builder.Append("readonly "); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (field.ReturnType != null && ShowReturnType) { + builder.Append(Convert(field.ReturnType)); + builder.Append(' '); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(field.FullyQualifiedName); + } else { + builder.Append(field.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (IncludeBodies) builder.Append(";"); + + return builder.ToString(); + } + + public override string Convert(IProperty property) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(property.Modifiers)); + + if (ShowModifiers) { + builder.Append(GetModifier(property)); + } + + if (property.ReturnType != null && ShowReturnType) { + builder.Append(Convert(property.ReturnType)); + builder.Append(' '); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(property.FullyQualifiedName); + } else { + builder.Append(property.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (property.Parameters.Count > 0) { + builder.Append("("); + if (IncludeHTMLMarkup) builder.Append("
"); + + for (int i = 0; i < property.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + builder.Append(Convert(property.Parameters[i])); + if (i + 1 < property.Parameters.Count) { + builder.Append(", "); + } + if (IncludeHTMLMarkup) builder.Append("
"); + } + + builder.Append(')'); + } + + if (IncludeBodies) { + builder.Append(" { "); + + if (property.CanGet) { + builder.Append("get; "); + } + if (property.CanSet) { + builder.Append("set; "); + } + + builder.Append(" } "); + } + + return builder.ToString(); + } + + public override string Convert(IEvent e) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(e.Modifiers)); + + if (ShowModifiers) { + builder.Append(GetModifier(e)); + } + + if (e.ReturnType != null && ShowReturnType) { + builder.Append(Convert(e.ReturnType)); + builder.Append(' '); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(e.FullyQualifiedName); + } else { + builder.Append(e.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (IncludeBodies) builder.Append(";"); + + return builder.ToString(); + } + + public override string Convert(IIndexer m) + { + StringBuilder builder = new StringBuilder(); + builder.Append(Convert(m.Modifiers)); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (ShowModifiers) { + if (m.IsStatic) { + builder.Append("static "); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (m.ReturnType != null && ShowReturnType) { + builder.Append(Convert(m.ReturnType)); + builder.Append(' '); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(m.FullyQualifiedName); + } else { + builder.Append(m.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + builder.Append("this["); + if (IncludeHTMLMarkup) builder.Append("
"); + + for (int i = 0; i < m.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + builder.Append(Convert(m.Parameters[i])); + if (i + 1 < m.Parameters.Count) { + builder.Append(", "); + } + if (IncludeHTMLMarkup) builder.Append("
"); + } + + builder.Append(']'); + + if (IncludeBodies) builder.Append(";"); + + return builder.ToString(); + } + + public override string Convert(IMethod m) + { + StringBuilder builder = new StringBuilder(); + builder.Append(Convert(m.Modifiers)); + + if (ShowModifiers) { + builder.Append(GetModifier(m)); + } + + if (m.ReturnType != null && ShowReturnType) { + builder.Append(Convert(m.ReturnType)); + builder.Append(' '); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (m.IsConstructor) { + if (m.DeclaringType != null) { + builder.Append(m.DeclaringType.Name); + } else { + builder.Append(m.Name); + } + } else { + if (UseFullyQualifiedMemberNames) { + builder.Append(m.FullyQualifiedName); + } else { + builder.Append(m.Name); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + builder.Append("("); + if (IncludeHTMLMarkup) builder.Append("
"); + + for (int i = 0; i < m.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + builder.Append(Convert(m.Parameters[i])); + if (i + 1 < m.Parameters.Count) { + builder.Append(", "); + } + if (IncludeHTMLMarkup) builder.Append("
"); + } + + builder.Append(')'); + + if (IncludeBodies) { + if (m.DeclaringType != null) { + if (m.DeclaringType.ClassType == ClassType.Interface) { + builder.Append(";"); + } else { + builder.Append(" {"); + } + } else { + builder.Append(" {"); + } + } + return builder.ToString(); + } + + public override string ConvertEnd(IMethod m) + { + return "}"; + } + + public override string Convert(IReturnType returnType) + { + if (returnType == null) { + return String.Empty; + } + StringBuilder builder = new StringBuilder(); + + bool linkSet = false; + + if (UseLinkArrayList) { +// TODO: #Assembly dependance: +// SharpAssemblyReturnType ret = returnType as SharpAssemblyReturnType; +// if (ret != null) { +// if (ret.UnderlyingClass != null) { +// builder.Append(""); +// linkSet = true; +// } +// } + } + + if (returnType.FullyQualifiedName != null && typeConversionTable[returnType.FullyQualifiedName] != null) { + builder.Append(typeConversionTable[returnType.FullyQualifiedName].ToString()); + } else { + if (UseFullyQualifiedNames) { + builder.Append(returnType.FullyQualifiedName); + } else { + builder.Append(returnType.Name); + } + } + + if (linkSet) { + builder.Append(""); + } + + for (int i = 0; i < returnType.PointerNestingLevel; ++i) { + builder.Append('*'); + } + + for (int i = 0; i < returnType.ArrayCount; ++i) { + builder.Append('['); + for (int j = 1; j < returnType.ArrayDimensions[i]; ++j) { + builder.Append(','); + } + builder.Append(']'); + } + + return builder.ToString(); + } + + public override string Convert(IParameter param) + { + StringBuilder builder = new StringBuilder(); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (param.IsRef) { + builder.Append("ref "); + } else if (param.IsOut) { + builder.Append("out "); + } else if (param.IsParams) { + builder.Append("params "); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + builder.Append(Convert(param.ReturnType)); + + if (ShowParameterNames) { + builder.Append(' '); + builder.Append(param.Name); + } + return builder.ToString(); + } + + public override string WrapAttribute(string attribute) + { + return "[" + attribute + "]"; + } + + public override string WrapComment(string comment) + { + return "// " + comment; + } + + public override string GetIntrinsicTypeName(string dotNetTypeName) + { + if (typeConversionTable[dotNetTypeName] != null) { + return (string)typeConversionTable[dotNetTypeName]; + } + return dotNetTypeName; + } + + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBindingExecutionManager.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBindingExecutionManager.cs new file mode 100644 index 0000000000..0a1e315903 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpBindingExecutionManager.cs @@ -0,0 +1,85 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.IO; +//using System.Diagnostics; +//using System.Collections; +//using System.Reflection; +//using System.Resources; +//using System.Windows.Forms; +//using System.Xml; +//using System.CodeDom.Compiler; +//using System.Threading; +// +//using ICSharpCode.SharpDevelop.Project; +//using ICSharpCode.SharpDevelop.Gui; +//using ICSharpCode.Core; +// +//namespace CSharpBinding +//{ +// /// +// /// This class describes the main functionalaty of a language codon +// /// +// public class CSharpBindingExecutionManager +// { +// public void Execute(string filename, bool debug) +// { +// } +// +// public void Execute(IProject project, bool debug) +// { +// CSharpCompilerParameters parameters = (CSharpCompilerParameters)project.ActiveConfiguration; +// +// +// string directory = FileUtility.GetDirectoryNameWithSeparator(((CSharpCompilerParameters)project.ActiveConfiguration).OutputDirectory); +// string exe = ((CSharpCompilerParameters)project.ActiveConfiguration).OutputAssembly + ".exe"; +// string args = ((CSharpCompilerParameters)project.ActiveConfiguration).CommandLineParameters; +// +// +// bool customStartup = false; +// ProcessStartInfo psi; +// if (parameters.ExecuteScript != null && parameters.ExecuteScript.Length > 0) { +// customStartup = true; +// psi = new ProcessStartInfo("\"" + parameters.ExecuteScript + "\"", args); +// } else { +// if (parameters.CompileTarget == CompileTarget.Library) { +// +// MessageService.ShowError("${res:BackendBindings.ExecutionManager.CantExecuteDLLError}"); +// return; +// } +// +// string runtimeStarter = String.Empty; +// +// switch (parameters.NetRuntime) { +// case NetRuntime.Mono: +// runtimeStarter = "mono "; +// break; +// case NetRuntime.MonoInterpreter: +// runtimeStarter = "mint "; +// break; +// } +// +// if (parameters.CompileTarget != CompileTarget.WinExe && parameters.PauseConsoleOutput) { +// psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("ComSpec"), "/c " + runtimeStarter + "\"" + directory + exe + "\" " + args + " & pause"); +// } else { +// psi = new ProcessStartInfo(runtimeStarter + "\"" + directory + exe + "\""); +// psi.Arguments = args; +// } +// } +// +// psi.WorkingDirectory = Path.GetDirectoryName(directory); +// psi.UseShellExecute = false; +// DebuggerService DebuggerService = (DebuggerService)ServiceManager.Services.GetService(typeof(DebuggerService)); +// if (debug && !customStartup) { +// DebuggerService.Start(Path.Combine(directory, exe), directory, args); +// } else { +// DebuggerService.StartWithoutDebugging(psi); +// } +// } +// } +//} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs new file mode 100644 index 0000000000..faad1c6bd2 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs @@ -0,0 +1,90 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; +using System.Xml; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace CSharpBinding +{ + public class CSharpLanguageBinding : ILanguageBinding + { + public const string LanguageName = "C#"; + + public string Language { + get { + return LanguageName; + } + } + + #region routines for single file compilation + public bool CanCompile(string fileName) + { + Debug.Assert(fileName != null); + + string ext = Path.GetExtension(fileName); + if (ext == null) { + return false; + } + return ext.ToUpper() == ".CS"; + } + + public string GetCompiledOutputName(string fileName) + { + Debug.Assert(CanCompile(fileName)); + + return Path.ChangeExtension(fileName, ".exe"); + } + + public CompilerResults CompileFile(string fileName) + { + Debug.Assert(CanCompile(fileName)); + + // TODO: Implement me! + return null; + } + + public void Execute(string fileName, bool debug) + { + string exe = GetCompiledOutputName(fileName); + + + if (debug) { + DebuggerService.Start(exe, Path.GetDirectoryName(exe), ""); + } else { + ProcessStartInfo psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("ComSpec"), "/c " + "\"" + exe + "\"" + " & pause"); + psi.WorkingDirectory = Path.GetDirectoryName(exe); + psi.UseShellExecute = false; + + DebuggerService.StartWithoutDebugging(psi); + } + } + #endregion + + public IProject LoadProject(string fileName, string projectName) + { + return new CSharpProject(fileName, projectName); + } + + public IProject CreateProject(ProjectCreateInformation info, XmlElement projectOptions) + { + return new CSharpProject(info); + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs new file mode 100644 index 0000000000..23b6c8261b --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs @@ -0,0 +1,757 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.Drawing; +using System.Text; + +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Actions; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.Core; + +namespace CSharpBinding.FormattingStrategy +{ + /// + /// This class handles the auto and smart indenting in the textbuffer while + /// you type. + /// + public class CSharpFormattingStrategy : DefaultFormattingStrategy + { + public CSharpFormattingStrategy() + { + } + + #region SmartIndentLine + /// + /// Define CSharp specific smart indenting for a line :) + /// + protected override int SmartIndentLine(TextArea textArea, int lineNr) + { + if (lineNr <= 0) { + return AutoIndentLine(textArea, lineNr); + } + + string oldText = textArea.Document.GetText(textArea.Document.GetLineSegment(lineNr)); + + DocumentAccessor acc = new DocumentAccessor(textArea.Document, lineNr, lineNr); + + IndentationSettings set = new IndentationSettings(); + set.IndentString = Tab.GetIndentationString(textArea.Document); + IndentationReformatter r = new IndentationReformatter(); + + r.Reformat(acc, set); + + if (acc.ChangedLines > 0) + textArea.Document.UndoStack.UndoLast(2); + + string t = acc.Text; + if (t.Length == 0) { + // use AutoIndentation for new lines in comments / verbatim strings. + return AutoIndentLine(textArea, lineNr); + } else { + int newIndentLength = t.Length - t.TrimStart().Length; + int oldIndentLength = oldText.Length - oldText.TrimStart().Length; + if (oldIndentLength != newIndentLength && lineNr == textArea.Caret.Position.Y) { + // fix cursor position if indentation was changed + int newX = textArea.Caret.Position.X - oldIndentLength + newIndentLength; + textArea.Caret.Position = new Point(Math.Max(newX, 0), lineNr); + } + return newIndentLength; + } + } + + /// + /// This function sets the indentlevel in a range of lines. + /// + public override void IndentLines(TextArea textArea, int begin, int end) + { + if (textArea.Document.TextEditorProperties.IndentStyle != IndentStyle.Smart) { + base.IndentLines(textArea, begin, end); + return; + } + int cursorPos = textArea.Caret.Position.Y; + int oldIndentLength = 0; + + if (cursorPos >= begin && cursorPos <= end) + oldIndentLength = GetIndentation(textArea, cursorPos).Length; + + IndentationSettings set = new IndentationSettings(); + set.IndentString = Tab.GetIndentationString(textArea.Document); + IndentationReformatter r = new IndentationReformatter(); + DocumentAccessor acc = new DocumentAccessor(textArea.Document, begin, end); + r.Reformat(acc, set); + + if (cursorPos >= begin && cursorPos <= end) { + int newIndentLength = GetIndentation(textArea, cursorPos).Length; + if (oldIndentLength != newIndentLength) { + // fix cursor position if indentation was changed + int newX = textArea.Caret.Position.X - oldIndentLength + newIndentLength; + textArea.Caret.Position = new Point(Math.Max(newX, 0), cursorPos); + } + } + + if (acc.ChangedLines > 0) + textArea.Document.UndoStack.UndoLast(acc.ChangedLines); + } + #endregion + + #region Private functions + bool NeedCurlyBracket(string text) + { + int curlyCounter = 0; + + bool inString = false; + bool inChar = false; + bool verbatim = false; + + bool lineComment = false; + bool blockComment = false; + + for (int i = 0; i < text.Length; ++i) { + switch (text[i]) { + case '\r': + case '\n': + lineComment = false; + inChar = false; + if (!verbatim) inString = false; + break; + case '/': + if (blockComment) { + Debug.Assert(i > 0); + if (text[i - 1] == '*') { + blockComment = false; + } + } + if (!inString && !inChar && i + 1 < text.Length) { + if (!blockComment && text[i + 1] == '/') { + lineComment = true; + } + if (!lineComment && text[i + 1] == '*') { + blockComment = true; + } + } + break; + case '"': + if (!(inChar || lineComment || blockComment)) { + if (inString && verbatim) { + if (i + 1 < text.Length && text[i + 1] == '"') { + ++i; // skip escaped quote + inString = false; // let the string go on + } else { + verbatim = false; + } + } else if (!inString && i > 0 && text[i - 1] == '@') { + verbatim = true; + } + inString = !inString; + } + break; + case '\'': + if (!(inString || lineComment || blockComment)) { + inChar = !inChar; + } + break; + case '{': + if (!(inString || inChar || lineComment || blockComment)) { + ++curlyCounter; + } + break; + case '}': + if (!(inString || inChar || lineComment || blockComment)) { + --curlyCounter; + } + break; + case '\\': + if ((inString && !verbatim) || inChar) + ++i; // skip next character + break; + } + } + return curlyCounter > 0; + } + + bool IsInsideStringOrComment(TextArea textArea, LineSegment curLine, int cursorOffset) + { + // scan cur line if it is inside a string or single line comment (//) + bool insideString = false; + char stringstart = ' '; + bool verbatim = false; // true if the current string is verbatim (@-string) + char c = ' '; + char lastchar; + for (int i = curLine.Offset; i < cursorOffset; ++i) { + lastchar = c; + c = textArea.Document.GetCharAt(i); + if (insideString) { + if (c == stringstart) { + if (verbatim && i + 1 < cursorOffset && textArea.Document.GetCharAt(i + 1) == '"') + ++i; // skip escaped character + else + insideString = false; + } else if (c == '\\' && !verbatim) { + ++i; // skip escaped character + } + } else if (c == '/' && i + 1 < cursorOffset && textArea.Document.GetCharAt(i + 1) == '/') { + return true; + } else if (c == '"' || c == '\'') { + stringstart = c; + insideString = true; + verbatim = (c == '"') && (lastchar == '@'); + } + } + return insideString; + } + + bool IsInsideDocumentationComment(TextArea textArea, LineSegment curLine, int cursorOffset) + { + for (int i = curLine.Offset; i < cursorOffset; ++i) { + char ch = textArea.Document.GetCharAt(i); + if (ch == '"') { + // parsing strings correctly is too complicated (see above), + // but I don't now any case where a doc comment is after a string... + return false; + } + if (ch == '/' && i + 2 < cursorOffset && textArea.Document.GetCharAt(i + 1) == '/' && textArea.Document.GetCharAt(i + 2) == '/') { + return true; + } + } + return false; + } + + + + bool IsBeforeRegion(TextArea textArea, IRegion region, int lineNr) + { + if (region == null) { + return false; + } + return region.BeginLine - 2 <= lineNr && lineNr <= region.BeginLine; + } + + object GetClassMember(TextArea textArea, int lineNr, IClass c) + { + if (IsBeforeRegion(textArea, c.Region, lineNr)) { + return c; + } + + foreach (IClass inner in c.InnerClasses) { + object o = GetClassMember(textArea, lineNr, inner); + if (o != null) { + return o; + } + } + + foreach (IField f in c.Fields) { + if (IsBeforeRegion(textArea, f.Region, lineNr)) { + return f; + } + } + foreach (IProperty p in c.Properties) { + if (IsBeforeRegion(textArea, p.Region, lineNr)) { + return p; + } + } + foreach (IIndexer i in c.Indexer) { + if (IsBeforeRegion(textArea, i.Region, lineNr)) { + return i; + } + } + foreach (IEvent e in c.Events) { + if (IsBeforeRegion(textArea, e.Region, lineNr)) { + return e; + } + } + foreach (IMethod m in c.Methods) { + if (IsBeforeRegion(textArea, m.Region, lineNr)) { + return m; + } + } + return null; + } + + object GetMember(TextArea textArea, int lineNr) + { + string fileName = textArea.MotherTextEditorControl.FileName; + if (fileName != null && fileName.Length > 0 ) { + string fullPath = Path.GetFullPath(fileName); + ParseInformation parseInfo = ParserService.GetParseInformation(fullPath); + if (parseInfo != null) { + ICompilationUnit currentCompilationUnit = (ICompilationUnit)parseInfo.BestCompilationUnit; + if (currentCompilationUnit != null) { + foreach (IClass c in currentCompilationUnit.Classes) { + object o = GetClassMember(textArea, lineNr, c); + if (o != null) { + return o; + } + } + } + } + } + return null; + } + #endregion + + #region FormatLine + public override int FormatLine(TextArea textArea, int lineNr, int cursorOffset, char ch) // used for comment tag formater/inserter + { + LineSegment curLine = textArea.Document.GetLineSegment(lineNr); + LineSegment lineAbove = lineNr > 0 ? textArea.Document.GetLineSegment(lineNr - 1) : null; + + //// local string for curLine segment + string curLineText=""; + if (ch == '/') { + curLineText = textArea.Document.GetText(curLine); + string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove); + if (curLineText != null && curLineText.EndsWith("///") && (lineAboveText == null || !lineAboveText.Trim().StartsWith("///"))) { + string indentation = base.GetIndentation(textArea, lineNr); + object member = GetMember(textArea, lineNr); + if (member != null) { + StringBuilder sb = new StringBuilder(); + sb.Append(" \n"); + sb.Append(indentation); + sb.Append("/// \n"); + sb.Append(indentation); + sb.Append("/// "); + + if (member is IMethod) { + IMethod method = (IMethod)member; + if (method.Parameters != null && method.Parameters.Count > 0) { + for (int i = 0; i < method.Parameters.Count; ++i) { + sb.Append("\n"); + sb.Append(indentation); + sb.Append("/// "); + } + } + if (method.ReturnType != null && method.ReturnType.FullyQualifiedName != "System.Void") { + sb.Append("\n"); + sb.Append(indentation); + sb.Append("/// "); + } + } + textArea.Document.Insert(cursorOffset, sb.ToString()); + + textArea.Refresh(); + textArea.Caret.Position = textArea.Document.OffsetToPosition(cursorOffset + indentation.Length + "/// ".Length + " \n".Length); + return 0; + } + } + return 0; + } + if (ch != '\n' && ch != '>') { + if (IsInsideStringOrComment(textArea, curLine, cursorOffset)) { + return 0; + } + } + + switch (ch) { + case '>': + if (IsInsideDocumentationComment(textArea, curLine, cursorOffset)) { + curLineText = textArea.Document.GetText(curLine); + int column = textArea.Caret.Offset - curLine.Offset; + int index = Math.Min(column - 1, curLineText.Length - 1); + + while (index >= 0 && curLineText[index] != '<') { + --index; + if(curLineText[index] == '/') + return 0; // the tag was an end tag or already + } + + if (index > 0) { + StringBuilder commentBuilder = new StringBuilder(""); + for (int i = index; i < curLineText.Length && i < column && !Char.IsWhiteSpace(curLineText[i]); ++i) { + commentBuilder.Append(curLineText[ i]); + } + string tag = commentBuilder.ToString().Trim(); + if (!tag.EndsWith(">")) { + tag += ">"; + } + if (!tag.StartsWith("/")) { + textArea.Document.Insert(textArea.Caret.Offset, " 0) { + curLineText = textArea.Document.GetText(curLine); + } + + LineSegment nextLine = lineNr + 1 < textArea.Document.TotalNumberOfLines ? textArea.Document.GetLineSegment(lineNr + 1) : null; + string nextLineText = lineNr + 1 < textArea.Document.TotalNumberOfLines ? textArea.Document.GetText(nextLine) : ""; + + int addCursorOffset = 0; + + if (lineAbove.HighlightSpanStack != null && lineAbove.HighlightSpanStack.Count > 0) { + if (!((Span)lineAbove.HighlightSpanStack.Peek()).StopEOL) { // case for /* style comments + int index = lineAboveText.IndexOf("/*"); + if (index > 0) { + StringBuilder indentation = new StringBuilder(GetIndentation(textArea, lineNr - 1)); + for (int i = indentation.Length; i < index; ++ i) { + indentation.Append(' '); + } + //// adding curline text + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation.ToString() + " * " + curLineText); + return indentation.Length + 3 + curLineText.Length; + } + + index = lineAboveText.IndexOf("*"); + if (index > 0) { + StringBuilder indentation = new StringBuilder(GetIndentation(textArea, lineNr - 1)); + for (int i = indentation.Length; i < index; ++ i) { + indentation.Append(' '); + } + //// adding curline if present + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation.ToString() + "* " + curLineText); + return indentation.Length + 2 + curLineText.Length; + } + } else { // don't handle // lines, because they're only one lined comments + int indexAbove = lineAboveText.IndexOf("///"); + int indexNext = nextLineText.IndexOf("///"); + if (indexAbove > 0 && (indexNext != -1 || indexAbove + 4 < lineAbove.Length)) { + StringBuilder indentation = new StringBuilder(GetIndentation(textArea, lineNr - 1)); + for (int i = indentation.Length; i < indexAbove; ++ i) { + indentation.Append(' '); + } + //// adding curline text if present + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation.ToString() + "/// " + curLineText); + textArea.Document.UndoStack.UndoLast(2); + return indentation.Length + 4 /*+ curLineText.Length*/; + } + + if (IsInString(lineAboveText, curLineText)) { + textArea.Document.Insert(lineAbove.Offset + lineAbove.Length, + "\" +"); + curLine = textArea.Document.GetLineSegment(lineNr); + textArea.Document.Insert(curLine.Offset, "\""); + textArea.Document.UndoStack.UndoLast(3); + addCursorOffset = 1; + } + } + } + int result = IndentLine(textArea, lineNr) + addCursorOffset; + if (textArea.TextEditorProperties.AutoInsertCurlyBracket) { + string oldLineText = TextUtilities.GetLineAsString(textArea.Document, lineNr - 1); + if (oldLineText.EndsWith("{")) { + if (NeedCurlyBracket(textArea.Document.TextContent)) { + textArea.Document.Insert(curLine.Offset + curLine.Length, "\n}"); + IndentLine(textArea, lineNr + 1); + } + } + } + return result; + } + return 0; + } + + bool IsInString(string start, string end) + { + bool inString = false; + for (int i = 0; i < start.Length; ++i) { + char c = start[i]; + if (c == '"') { + if (!inString && i > 0 && start[i - 1] == '@') + return false; // no string line break for verbatim strings + inString = !inString; + } + if (!inString && i > 0 && start[i - 1] == '/' && (c == '/' || c == '*')) + return false; + if (inString && start[i] == '\\') + ++i; + } + if (!inString) return false; + // we are possibly in a string, or a multiline string has just ended here + // check if the closing double quote is in end. + for (int i = 0; i < end.Length; ++i) { + char c = end[i]; + if (c == '"') { + if (!inString && i > 0 && start[i - 1] == '@') + return false; // no string line break for verbatim strings + inString = !inString; + } + if (!inString && i > 0 && start[i - 1] == '/' && (c == '/' || c == '*')) + break; + if (inString && start[i] == '\\') + ++i; + } + // return true if string was closed properly + return !inString; + } + #endregion + + #region SearchBracket helper functions + static int ScanLineStart(IDocument document, int offset) + { + for (int i = offset - 1; i > 0; --i) { + if (document.GetCharAt(i) == '\n') + return i + 1; + } + return 0; + } + + /// + /// Gets the type of code at offset.
+ /// 0 = Code,
+ /// 1 = Comment,
+ /// 2 = String
+ /// Block comments and multiline strings are not supported. + ///
+ static int GetStartType(IDocument document, int linestart, int offset) + { + bool inString = false; + bool inChar = false; + bool verbatim = false; + for(int i = linestart; i < offset; i++) { + switch (document.GetCharAt(i)) { + case '/': + if (!inString && !inChar && i + 1 < document.TextLength) { + if (document.GetCharAt(i + 1) == '/') { + return 1; + } + } + break; + case '"': + if (!inChar) { + if (inString && verbatim) { + if (i + 1 < document.TextLength && document.GetCharAt(i + 1) == '"') { + ++i; // skip escaped quote + inString = false; // let the string go on + } else { + verbatim = false; + } + } else if (!inString && i > 0 && document.GetCharAt(i - 1) == '@') { + verbatim = true; + } + inString = !inString; + } + break; + case '\'': + if (!inString) inChar = !inChar; + break; + case '\\': + if ((inString && !verbatim) || inChar) + ++i; // skip next character + break; + } + } + return (inString || inChar) ? 2 : 0; + } + #endregion + + #region SearchBracketBackward + public override int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket) + { + if (offset + 1 >= document.TextLength) return -1; + // this method parses a c# document backwards to find the matching bracket + + // first try "quick find" - find the matching bracket if there is no string/comment in the way + int quickResult = base.SearchBracketBackward(document, offset, openBracket, closingBracket); + if (quickResult >= 0) return quickResult; + + // we need to parse the line from the beginning, so get the line start position + int linestart = ScanLineStart(document, offset + 1); + + // we need to know where offset is - in a string/comment or in normal code? + // ignore cases where offset is in a block comment + int starttype = GetStartType(document, linestart, offset + 1); + if (starttype != 0) { + return -1; // start position is in a comment/string + } + + // I don't see any possibility to parse a C# document backwards... + // We have to do it forwards and push all bracket positions on a stack. + Stack bracketStack = new Stack(); + bool blockComment = false; + bool lineComment = false; + bool inChar = false; + bool inString = false; + bool verbatim = false; + + for(int i = 0; i <= offset; ++i) { + char ch = document.GetCharAt(i); + switch (ch) { + case '\r': + case '\n': + lineComment = false; + inChar = false; + if (!verbatim) inString = false; + break; + case '/': + if (blockComment) { + Debug.Assert(i > 0); + if (document.GetCharAt(i - 1) == '*') { + blockComment = false; + } + } + if (!inString && !inChar && i + 1 < document.TextLength) { + if (!blockComment && document.GetCharAt(i + 1) == '/') { + lineComment = true; + } + if (!lineComment && document.GetCharAt(i + 1) == '*') { + blockComment = true; + } + } + break; + case '"': + if (!(inChar || lineComment || blockComment)) { + if (inString && verbatim) { + if (i + 1 < document.TextLength && document.GetCharAt(i + 1) == '"') { + ++i; // skip escaped quote + inString = false; // let the string go + } else { + verbatim = false; + } + } else if (!inString && offset > 0 && document.GetCharAt(i - 1) == '@') { + verbatim = true; + } + inString = !inString; + } + break; + case '\'': + if (!(inString || lineComment || blockComment)) { + inChar = !inChar; + } + break; + case '\\': + if ((inString && !verbatim) || inChar) + ++i; // skip next character + break; + default : + if (ch == openBracket) { + if (!(inString || inChar || lineComment || blockComment)) { + bracketStack.Push(i); + } + } else if (ch == closingBracket) { + if (!(inString || inChar || lineComment || blockComment)) { + if (bracketStack.Count > 0) + bracketStack.Pop(); + } + } + break; + } + } + if (bracketStack.Count > 0) return (int)bracketStack.Pop(); + return -1; + } + #endregion + + #region SearchBracketForward + public override int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket) + { + bool inString = false; + bool inChar = false; + bool verbatim = false; + + bool lineComment = false; + bool blockComment = false; + + if (offset < 0) return -1; + + // first try "quick find" - find the matching bracket if there is no string/comment in the way + int quickResult = base.SearchBracketForward(document, offset, openBracket, closingBracket); + if (quickResult >= 0) return quickResult; + + // we need to parse the line from the beginning, so get the line start position + int linestart = ScanLineStart(document, offset); + + // we need to know where offset is - in a string/comment or in normal code? + // ignore cases where offset is in a block comment + int starttype = GetStartType(document, linestart, offset); + if (starttype != 0) return -1; // start position is in a comment/string + + int brackets = 1; + + while (offset < document.TextLength) { + char ch = document.GetCharAt(offset); + switch (ch) { + case '\r': + case '\n': + lineComment = false; + inChar = false; + if (!verbatim) inString = false; + break; + case '/': + if (blockComment) { + Debug.Assert(offset > 0); + if (document.GetCharAt(offset - 1) == '*') { + blockComment = false; + } + } + if (!inString && !inChar && offset + 1 < document.TextLength) { + if (!blockComment && document.GetCharAt(offset + 1) == '/') { + lineComment = true; + } + if (!lineComment && document.GetCharAt(offset + 1) == '*') { + blockComment = true; + } + } + break; + case '"': + if (!(inChar || lineComment || blockComment)) { + if (inString && verbatim) { + if (offset + 1 < document.TextLength && document.GetCharAt(offset + 1) == '"') { + ++offset; // skip escaped quote + inString = false; // let the string go + } else { + verbatim = false; + } + } else if (!inString && offset > 0 && document.GetCharAt(offset - 1) == '@') { + verbatim = true; + } + inString = !inString; + } + break; + case '\'': + if (!(inString || lineComment || blockComment)) { + inChar = !inChar; + } + break; + case '\\': + if ((inString && !verbatim) || inChar) + ++offset; // skip next character + break; + default : + if (ch == openBracket) { + if (!(inString || inChar || lineComment || blockComment)) { + ++brackets; + } + } else if (ch == closingBracket) { + if (!(inString || inChar || lineComment || blockComment)) { + --brackets; + if (brackets == 0) { + return offset; + } + } + } + break; + } + ++offset; + } + return -1; + } + #endregion + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/DocumentAccessor.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/DocumentAccessor.cs new file mode 100644 index 0000000000..58e8610a57 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/DocumentAccessor.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.IO; + +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +namespace CSharpBinding.FormattingStrategy +{ + /// + /// Interface used for the indentation class to access the document. + /// + public interface IDocumentAccessor + { + /// Gets if something was changed in the document. + bool Dirty { get; } + /// Gets if the current line is read only (because it is not in the + /// selected text region) + bool ReadOnly { get; } + /// Gets the number of the current line. + int LineNumber { get; } + /// Gets/Sets the text of the current line. + string Text { get; set; } + /// Advances to the next line. + bool Next(); + } + + #region DocumentAccessor + public class DocumentAccessor : IDocumentAccessor + { + IDocument doc; + + int minLine; + int maxLine; + int changedLines = 0; + + public DocumentAccessor(IDocument document) + { + doc = document; + this.minLine = 0; + this.maxLine = doc.TotalNumberOfLines - 1; + } + + public DocumentAccessor(IDocument document, int minLine, int maxLine) + { + doc = document; + this.minLine = minLine; + this.maxLine = maxLine; + } + + int num = -1; + bool dirty; + string text; + LineSegment line; + + public bool ReadOnly { + get { + return num < minLine; + } + } + + public bool Dirty { + get { + return dirty; + } + } + + public int LineNumber { + get { + return num; + } + } + + public int ChangedLines { + get { + return changedLines; + } + } + + bool lineDirty = false; + + public string Text { + get { return text; } + set { + if (num < minLine) return; + text = value; + dirty = true; + lineDirty = true; + } + } + + public bool Next() + { + if (lineDirty) { + doc.Replace(line.Offset, line.Length, text); + lineDirty = false; + ++changedLines; + } + ++num; + if (num > maxLine) return false; + line = doc.GetLineSegment(num); + text = doc.GetText(line); + return true; + } + } + #endregion + + #region FileAccessor + public class FileAccessor : IDisposable, IDocumentAccessor + { + public bool Dirty { + get { + return dirty; + } + } + + public bool ReadOnly { + get { + return false; + } + } + + FileStream f; + StreamReader r; + ArrayList lines = new ArrayList(); + bool dirty = false; + + System.Text.Encoding encoding; + + string filename; + public FileAccessor(string filename) + { + this.filename = filename; + f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None); + // TODO: Auto-detect encoding + encoding = System.Text.Encoding.GetEncoding("ISO-8859-1"); + r = new StreamReader(f, encoding); + } + + int num = 0; + + public int LineNumber { + get { return num; } + } + + + string text = ""; + + public string Text { + get { + return text; + } + set { + dirty = true; + text = value; + } + } + + public bool Next() + { + if (num > 0) { + lines.Add(text); + } + text = r.ReadLine(); + ++num; + return text != null; + } + + void IDisposable.Dispose() + { + Close(); + } + + public void Close() + { + r.Close(); + f.Close(); + if (dirty) { + f = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + using (StreamWriter w = new StreamWriter(f, encoding)) { + foreach (string line in lines) { + w.WriteLine(line); + } + } + f.Close(); + } + } + } + #endregion +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/Indentation.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/Indentation.cs new file mode 100644 index 0000000000..bbd4b7d1e5 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/Indentation.cs @@ -0,0 +1,375 @@ +using System; +using System.Collections; +using System.Text; + +namespace CSharpBinding.FormattingStrategy +{ + public class IndentationSettings + { + public string IndentString = "\t"; + } + + public class IndentationReformatter + { + public struct Block + { + public string OuterIndent; + public string InnerIndent; + public string LastWord; + public char Bracket; + public bool Continuation; + public bool OneLineBlock; + public int StartLine; + + public void Indent(IndentationSettings set) + { + Indent(set, set.IndentString); + } + + public void Indent(IndentationSettings set, string str) + { + OuterIndent = InnerIndent; + InnerIndent += str; + Continuation = false; + OneLineBlock = false; + LastWord = ""; + } + } + + StringBuilder wordBuilder; + Stack blocks; // blocks contains all blocks outside of the current + Block block; // block is the current block + + bool inString = false; + bool inChar = false; + bool verbatim = false; + bool escape = false; + + bool lineComment = false; + bool blockComment = false; + + char lastRealChar = ' '; // last non-comment char + + public void Reformat(IDocumentAccessor doc, IndentationSettings set) + { + Init(); + + while (doc.Next()) { + Step(doc, set); + } + } + + public void Init() + { + wordBuilder = new StringBuilder(); + blocks = new Stack(); + block = new Block(); + block.InnerIndent = ""; + block.OuterIndent = ""; + block.Bracket = '{'; + block.Continuation = false; + block.LastWord = ""; + block.OneLineBlock = false; + block.StartLine = 0; + + inString = false; + inChar = false; + verbatim = false; + escape = false; + + lineComment = false; + blockComment = false; + + lastRealChar = ' '; // last non-comment char + } + + public void Step(IDocumentAccessor doc, IndentationSettings set) + { + string line = doc.Text.TrimStart(); + + StringBuilder indent = new StringBuilder(); + if (line.Length == 0) { + // Special threatment for empty lines: + if (blockComment || (inString && verbatim)) + return; + indent.Append(block.InnerIndent); + if (block.OneLineBlock) + indent.Append(set.IndentString); + if (block.Continuation) + indent.Append(set.IndentString); + if (doc.Text != indent.ToString()) + doc.Text = indent.ToString(); + return; + } + + if (TrimEnd(doc)) + line = doc.Text.TrimStart(); + + Block oldBlock = block; + bool startInComment = blockComment; + bool startInString = (inString && verbatim); + + #region Parse char by char + lineComment = false; + inChar = false; + escape = false; + if (!verbatim) inString = false; + + lastRealChar = '\n'; + + char lastchar = ' '; + char c = ' '; + char nextchar = line[0]; + for (int i = 0; i < line.Length; i++) { + if (lineComment) break; // cancel parsing current line + + lastchar = c; + c = nextchar; + if (i + 1 < line.Length) + nextchar = line[i + 1]; + else + nextchar = '\n'; + + if (escape) { + escape = false; + continue; + } + + #region Check for comment/string chars + switch (c) { + case '/': + if (blockComment && lastchar == '*') + blockComment = false; + if (!inString && !inChar) { + if (!blockComment && nextchar == '/') + lineComment = true; + if (!lineComment && nextchar == '*') + blockComment = true; + } + break; + case '#': + if (!(inChar || blockComment || inString)) + lineComment = true; + break; + case '"': + if (!(inChar || lineComment || blockComment)) { + inString = !inString; + if (!inString && verbatim) { + if (nextchar == '"') { + escape = true; // skip escaped quote + inString = true; + } else { + verbatim = false; + } + } else if (inString && lastchar == '@') { + verbatim = true; + } + } + break; + case '\'': + if (!(inString || lineComment || blockComment)) { + inChar = !inChar; + } + break; + case '\\': + if ((inString && !verbatim) || inChar) + escape = true; // skip next character + break; + } + #endregion + + if (lineComment || blockComment || inString || inChar) { + if (wordBuilder.Length > 0) + block.LastWord = wordBuilder.ToString(); + wordBuilder.Length = 0; + continue; + } + + if (!Char.IsWhiteSpace(c) && c != '[' && c != '/') { + if (block.Bracket == '{') + block.Continuation = true; + } + + if (Char.IsLetterOrDigit(c)) { + wordBuilder.Append(c); + } else { + if (wordBuilder.Length > 0) + block.LastWord = wordBuilder.ToString(); + wordBuilder.Length = 0; + } + + #region Push/Pop the blocks + switch (c) { + case '{': + block.OneLineBlock = false; + blocks.Push(block); + block.StartLine = doc.LineNumber; + if (block.LastWord == "switch") + block.Indent(set, set.IndentString + set.IndentString); + else + block.Indent(set); + block.Bracket = '{'; + break; + case '}': + while (block.Bracket != '{') { + if (blocks.Count == 0) break; + block = (Block)blocks.Pop(); + } + if (blocks.Count == 0) break; + block = (Block)blocks.Pop(); + block.Continuation = false; + block.OneLineBlock = false; + break; + case '(': + case '[': + blocks.Push(block); + if (block.StartLine == doc.LineNumber) + block.InnerIndent = block.OuterIndent; + else + block.StartLine = doc.LineNumber; + block.Indent(set, + (oldBlock.OneLineBlock ? set.IndentString : "") + + (oldBlock.Continuation ? set.IndentString : "") + + new String(' ', i + 1)); + block.Bracket = c; + break; + case ')': + if (blocks.Count == 0) break; + if (block.Bracket == '(') { + block = (Block)blocks.Pop(); + if (IsSingleStatementKeyword(block.LastWord)) + block.Continuation = false; + } + break; + case ']': + if (blocks.Count == 0) break; + if (block.Bracket == '[') + block = (Block)blocks.Pop(); + break; + case ';': + case ',': + block.Continuation = false; + block.OneLineBlock = false; + break; + case ':': + if (block.LastWord == "case" || line.StartsWith("case ") || line.StartsWith(block.LastWord + ":")) { + block.Continuation = false; + block.OneLineBlock = false; + } + break; + } + + if (!Char.IsWhiteSpace(c)) { + // register this char as last char + lastRealChar = c; + } + #endregion + } + #endregion + + if (wordBuilder.Length > 0) + block.LastWord = wordBuilder.ToString(); + wordBuilder.Length = 0; + + if (startInString) return; + if (startInComment && line[0] != '*') return; + if (doc.Text.StartsWith("//\t")) + return; + + if (line[0] == '}') { + indent.Append(oldBlock.OuterIndent); + oldBlock.OneLineBlock = false; + oldBlock.Continuation = false; + } else { + indent.Append(oldBlock.InnerIndent); + } + + if (indent.Length > 0 && oldBlock.Bracket == '(' && line[0] == ')') { + indent.Remove(indent.Length - 1, 1); + } else if (indent.Length > 0 && oldBlock.Bracket == '[' && line[0] == ']') { + indent.Remove(indent.Length - 1, 1); + } + + if (line[0] == ':') { + oldBlock.Continuation = true; + } else if (lastRealChar == ':' && indent.Length >= set.IndentString.Length) { + if (block.LastWord == "case" || line.StartsWith("case ") || line.StartsWith(block.LastWord + ":")) + indent.Remove(indent.Length - set.IndentString.Length, set.IndentString.Length); + } else if (lastRealChar == ')') { + if (IsSingleStatementKeyword(block.LastWord)) { + block.OneLineBlock = true; + } + } else if (block.LastWord == "else" && lastRealChar == 'e') { + block.OneLineBlock = true; + block.Continuation = false; + } + + if (doc.ReadOnly) { + // We can't change the current line, but we should accept the existing + // indentation if possible (so if the current statement is not a multiline + // statement). + if (!oldBlock.Continuation && !oldBlock.OneLineBlock && + oldBlock.StartLine == block.StartLine && + block.StartLine < doc.LineNumber && lastRealChar != ':') { + // use indent StringBuilder to get the indentation of the current line + indent.Length = 0; + line = doc.Text; // get untrimmed line + for (int i = 0; i < line.Length; ++i) { + if (!Char.IsWhiteSpace(line[i])) + break; + indent.Append(line[i]); + } + block.InnerIndent = indent.ToString(); + } + return; + } + + if (line[0] != '{') { + if (line[0] != ')' && oldBlock.Continuation && oldBlock.Bracket == '{') + indent.Append(set.IndentString); + if (oldBlock.OneLineBlock) + indent.Append(set.IndentString); + } + + // this is only for blockcomment lines starting with *, + // all others keep their old indentation + if (startInComment) + indent.Append(' '); + + if (indent.Length != (doc.Text.Length - line.Length) || + !doc.Text.StartsWith(indent.ToString()) || + Char.IsWhiteSpace(doc.Text[indent.Length])) + { + doc.Text = indent.ToString() + line; + } + } + + bool IsSingleStatementKeyword(string keyword) { + switch (keyword) { + case "if": + case "for": + case "while": + case "do": + case "foreach": + case "using": + case "lock": + return true; + default: + return false; + } + } + + bool TrimEnd(IDocumentAccessor doc) + { + string line = doc.Text; + if (!Char.IsWhiteSpace(line[line.Length - 1])) return false; + + // one space after an empty comment is allowed + if (line.EndsWith("// ")) + return false; + + doc.Text = line.TrimEnd(); + return true; + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/ApplicationSettings.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/ApplicationSettings.cs new file mode 100644 index 0000000000..50193e5d51 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/ApplicationSettings.cs @@ -0,0 +1,82 @@ +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; + +namespace CSharpBinding.OptionPanels +{ + public class ApplicationSettings : AbstractOptionPanel + { + CSharpProject project; + + public ApplicationSettings() + { + } + + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.ApplicationSettings.xfrm")); + this.project = (CSharpProject)((Properties)CustomizationObject).Get("Project"); + + ConnectBrowseButton("applicationIconBrowseButton", "applicationIconComboBox", "${res:SharpDevelop.FileFilter.Icons}|*.ico|${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + + // TODO: Suitable file filter. + ConnectBrowseButton("win32ResourceFileBrowseButton", "win32ResourceFileComboBox"); + + Get("assemblyName").Text = project.AssemblyName; + Get("assemblyName").TextChanged += new EventHandler(RefreshOutputNameTextBox); + + Get("rootNamespace").Text = project.RootNamespace; + + Get("outputType").Items.Add(StringParser.Parse("${res:Dialog.Options.PrjOptions.Configuration.CompileTarget.Exe}")); + Get("outputType").Items.Add(StringParser.Parse("${res:Dialog.Options.PrjOptions.Configuration.CompileTarget.WinExe}")); + Get("outputType").Items.Add(StringParser.Parse("${res:Dialog.Options.PrjOptions.Configuration.CompileTarget.Library}")); + Get("outputType").Items.Add(StringParser.Parse("${res:Dialog.Options.PrjOptions.Configuration.CompileTarget.Module}")); + + Get("outputType").SelectedIndex = (int)project.OutputType; + Get("outputType").SelectedIndexChanged += new EventHandler(RefreshOutputNameTextBox); + + Get("startupObject").Text = project.StartupObject; + + Get("applicationIcon").Text = project.ApplicationIcon; + Get("applicationIcon").TextChanged += new EventHandler(ApplicationIconComboBoxTextChanged); + + Get("win32ResourceFile").Text = project.Win32Resource; + Get("projectFolder").Text = project.Directory; + Get("projectFile").Text = Path.GetFileName(project.FileName); + + RefreshOutputNameTextBox(null, EventArgs.Empty); + } + + public override bool StorePanelContents() + { + project.AssemblyName = Get("assemblyName").Text; + project.RootNamespace = Get("rootNamespace").Text; + project.OutputType = (OutputType)Get("outputType").SelectedIndex; + Console.WriteLine("Set output type to : " + project.OutputType); + project.StartupObject = Get("startupObject").Text; + project.ApplicationIcon = Get("applicationIcon").Text; + project.Win32Resource = Get("win32ResourceFile").Text; + project.Name = Path.GetFileNameWithoutExtension(Get("projectFile").Text); + return true; + } + + void RefreshOutputNameTextBox(object sender, EventArgs e) + { + Get("outputName").Text = Get("assemblyName").Text + MSBuildProject.GetExtension((OutputType)Get("outputType").SelectedIndex); + } + + void ApplicationIconComboBoxTextChanged(object sender, EventArgs e) + { + string applicationIcon = Get("applicationIcon").Text; + if (File.Exists(applicationIcon)) { + Get("applicationIcon").Image = Image.FromFile(applicationIcon); + } + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildEvents.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildEvents.cs new file mode 100644 index 0000000000..b706225025 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildEvents.cs @@ -0,0 +1,44 @@ +using System; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace CSharpBinding.OptionPanels +{ + public class BuildEvents : AbstractOptionPanel + { + CSharpProject project; + + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.BuildEvents.xfrm")); + ConnectBrowseButton("preBuildEventBrowseButton", + "preBuildEventTextBox", + "${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + ConnectBrowseButton("postBuildEventBrowseButton", + "postBuildEventTextBox", + "${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + + this.project = (CSharpProject)((Properties)CustomizationObject).Get("Project"); + + Get("preBuildEvent").Text = project.PreBuildEvent; + Get("postBuildEvent").Text = project.PostBuildEvent; + + Get("runPostBuildEvent").Items.Add("Always"); + Get("runPostBuildEvent").Items.Add("On successful build"); + Get("runPostBuildEvent").Items.Add("When the build updates the project output"); + + Get("runPostBuildEvent").SelectedIndex = (int)project.RunPostBuildEvent; + } + + public override bool StorePanelContents() + { + project.PreBuildEvent = Get("preBuildEvent").Text; + project.PostBuildEvent = Get("postBuildEvent").Text; + project.RunPostBuildEvent = (RunPostBuildEvent)Get("runPostBuildEvent").SelectedIndex; + return true; + } + } +} diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs new file mode 100644 index 0000000000..9f91f008e2 --- /dev/null +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/OptionPanels/BuildOptions.cs @@ -0,0 +1,148 @@ +using System; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +namespace CSharpBinding.OptionPanels +{ + public class BuildOptions : AbstractOptionPanel + { + CSharpProject project; + + public BuildOptions() + { + } + + void ShowAdvancedOptions(object sender, EventArgs e) + { + using (AdvancedBuildOptionsDialog advancedBuildOptionsDialog = new AdvancedBuildOptionsDialog(project)) { + advancedBuildOptionsDialog.ShowDialog(WorkbenchSingleton.MainForm); + } + } + string Config = "Debug"; + string Platform = "AnyCPU"; + + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.BuildOptions.xfrm")); + this.project = (CSharpProject)((Properties)CustomizationObject).Get("Project"); + + ConnectBrowseFolder("outputPathBrowseButton", "outputPathTextBox", "${res:Dialog.Options.PrjOptions.Configuration.FolderBrowserDescription}"); + Get
+ protected override int SmartIndentLine(TextArea textArea, int lineNr) + { + + doCasing = PropertyService.Get("VBBinding.TextEditor.EnableCasing", true); + IDocument document = textArea.Document; + if (lineNr <= 0) + return AutoIndentLine(textArea, lineNr); + LineSegment lineAbove = document.GetLineSegment(lineNr - 1); + string lineAboveText = document.GetText(lineAbove.Offset, lineAbove.Length).Trim(); + + LineSegment curLine = document.GetLineSegment(lineNr); + string oldLineText = document.GetText(curLine.Offset, curLine.Length); + string curLineText = oldLineText.Trim(); + + // remove comments + string texttoreplace = Regex.Replace(lineAboveText, "'.*$", "", RegexOptions.Singleline).Trim(); + // remove string content + foreach (Match match in Regex.Matches(texttoreplace, "\"[^\"]*?\"")) { + texttoreplace = texttoreplace.Remove(match.Index, match.Length).Insert(match.Index, new String('-', match.Length)); + } + + string curLineReplace = Regex.Replace(curLineText, "'.*$", "", RegexOptions.Singleline).Trim(); + // remove string content + foreach (Match match in Regex.Matches(curLineReplace, "\"[^\"]*?\"")) { + curLineReplace = curLineReplace.Remove(match.Index, match.Length).Insert(match.Index, new String('-', match.Length)); + } + + StringBuilder b = new StringBuilder(GetIndentation(textArea, lineNr - 1)); + + string indentString = Tab.GetIndentationString(document); + + if (texttoreplace.IndexOf(':') > 0) + texttoreplace = texttoreplace.Substring(0, texttoreplace.IndexOf(':')).TrimEnd(); + + bool matched = false; + foreach (VBStatement statement in statements) { + if (statement.IndentPlus == 0) continue; + if (Regex.IsMatch(curLineReplace, statement.EndRegex, RegexOptions.IgnoreCase)) { + for (int i = 0; i < statement.IndentPlus; ++i) { + RemoveIndent(b); + } + if (doCasing && !statement.EndStatement.EndsWith(" ")) + curLineText = statement.EndStatement; + matched = true; + } + if (Regex.IsMatch(texttoreplace, statement.StartRegex, RegexOptions.IgnoreCase)) { + for (int i = 0; i < statement.IndentPlus; ++i) { + b.Append(indentString); + } + matched = true; + } + if (matched) + break; + } + + if (lineNr >= 2) { + if (texttoreplace.EndsWith("_")) { + // Line continuation + char secondLastChar = ' '; + for (int i = texttoreplace.Length - 2; i >= 0; --i) { + secondLastChar = texttoreplace[i]; + if (!Char.IsWhiteSpace(secondLastChar)) + break; + } + if (secondLastChar != '>') { + // is not end of attribute + LineSegment line2Above = document.GetLineSegment(lineNr - 2); + string lineAboveText2 = document.GetText(line2Above.Offset, line2Above.Length).Trim(); + lineAboveText2 = Regex.Replace(lineAboveText2, "'.*$", "", RegexOptions.Singleline).Trim(); + if (!lineAboveText2.EndsWith("_")) { + b.Append(indentString); + } + } + } else { + LineSegment line2Above = document.GetLineSegment(lineNr - 2); + string lineAboveText2 = document.GetText(line2Above.Offset, line2Above.Length).Trim(); + lineAboveText2 = StripComment(lineAboveText2); + if (lineAboveText2.EndsWith("_")) { + char secondLastChar = ' '; + for (int i = texttoreplace.Length - 2; i >= 0; --i) { + secondLastChar = texttoreplace[i]; + if (!Char.IsWhiteSpace(secondLastChar)) + break; + } + if (secondLastChar != '>') + RemoveIndent(b); + } + } + } + + if (IsElseConstruct(curLineText)) + RemoveIndent(b); + + if (IsElseConstruct(lineAboveText)) + b.Append(indentString); + + int indentLength = b.Length; + b.Append(curLineText); + if (b.ToString() != oldLineText) + textArea.Document.Replace(curLine.Offset, curLine.Length, b.ToString()); + return indentLength; + } + + bool IsElseConstruct(string line) + { + string t = StripComment(line).ToLower(); + if (t.StartsWith("case ")) return true; + if (t == "else" || t.StartsWith("elseif ")) return true; + if (t == "catch" || t.StartsWith("catch ")) return true; + if (t == "finally") return true; + + return false; + } + + string StripComment(string text) + { + return Regex.Replace(text, "'.*$", "", RegexOptions.Singleline).Trim(); + } + + void RemoveIndent(StringBuilder b) + { + if (b.Length == 0) return; + if (b[b.Length - 1] == '\t') { + b.Remove(b.Length - 1, 1); + } else { + for (int j = 0; j < 4; ++j) { + if (b.Length == 0) return; + if (b[b.Length - 1] != ' ') + break; + b.Remove(b.Length - 1, 1); + } + } + } + + public override int FormatLine(TextArea textArea, int lineNr, int cursorOffset, char ch) + { + + doCasing = PropertyService.Get("VBBinding.TextEditor.EnableCasing", true); + doInsertion = PropertyService.Get("VBBinding.TextEditor.EnableEndConstructs", true); + + if (lineNr > 0) { + LineSegment curLine = textArea.Document.GetLineSegment(lineNr); + LineSegment lineAbove = lineNr > 0 ? textArea.Document.GetLineSegment(lineNr - 1) : null; + + string curLineText = textArea.Document.GetText(curLine.Offset, curLine.Length); + string lineAboveText = textArea.Document.GetText(lineAbove.Offset, lineAbove.Length); + + if (ch == '\n' && lineAboveText != null) { + int undoCount = 1; + + // remove comments + string texttoreplace = Regex.Replace(lineAboveText, "'.*$", "", RegexOptions.Singleline); + // remove string content + MatchCollection strmatches = Regex.Matches(texttoreplace, "\"[^\"]*?\"", RegexOptions.Singleline); + foreach (Match match in strmatches) { + texttoreplace = texttoreplace.Remove(match.Index, match.Length).Insert(match.Index, new String('-', match.Length)); + } + + if (doCasing) { + foreach (string keyword in keywords) { + string regex = "(?:\\W|^)(" + keyword + ")(?:\\W|$)"; + MatchCollection matches = Regex.Matches(texttoreplace, regex, RegexOptions.IgnoreCase | RegexOptions.Singleline); + foreach (Match match in matches) { + textArea.Document.Replace(lineAbove.Offset + match.Groups[1].Index, match.Groups[1].Length, keyword); + ++undoCount; + } + } + } + + if (doInsertion) { + foreach (VBStatement statement in statements) { + if (Regex.IsMatch(texttoreplace.Trim(), statement.StartRegex, RegexOptions.IgnoreCase)) { + string indentation = GetIndentation(textArea, lineNr - 1); + if (isEndStatementNeeded(textArea, statement, lineNr)) { + textArea.Document.Insert(textArea.Caret.Offset, "\n" + indentation + statement.EndStatement); + ++undoCount; + } + for (int i = 0; i < statement.IndentPlus; i++) { + indentation += Tab.GetIndentationString(textArea.Document); + } + + textArea.Document.Replace(curLine.Offset, curLine.Length, indentation + curLineText.Trim()); + textArea.Document.UndoStack.UndoLast(undoCount + 1); + return indentation.Length; + } + } + } + + + if (IsInString(lineAboveText)) { + if (IsFinishedString(curLineText)) { + textArea.Document.Insert(lineAbove.Offset + lineAbove.Length, + "\" & _"); + curLine = textArea.Document.GetLineSegment(lineNr); + textArea.Document.Insert(curLine.Offset, "\""); + + if (IsElseConstruct(lineAboveText)) + SmartIndentLine(textArea, lineNr - 1); + int result = SmartIndentLine(textArea, lineNr) + 1; + textArea.Document.UndoStack.UndoLast(undoCount + 3); + return result; + } else { + textArea.Document.Insert(lineAbove.Offset + lineAbove.Length, + "\""); + if (IsElseConstruct(lineAboveText)) + SmartIndentLine(textArea, lineNr - 1); + int result = SmartIndentLine(textArea, lineNr); + textArea.Document.UndoStack.UndoLast(undoCount + 2); + return result; + } + } else { + string indent = GetIndentation(textArea, lineNr - 1); + if (indent.Length > 0) { + string newLineText = indent + TextUtilities.GetLineAsString(textArea.Document, lineNr).Trim(); + curLine = textArea.Document.GetLineSegment(lineNr); + textArea.Document.Replace(curLine.Offset, curLine.Length, newLineText); + ++undoCount; + } + if (IsElseConstruct(lineAboveText)) + SmartIndentLine(textArea, lineNr - 1); + textArea.Document.UndoStack.UndoLast(undoCount); + return indent.Length; + } + } + } + return 0; + } + + bool IsInString(string start) + { + bool inString = false; + for (int i = 0; i < start.Length; i++) { + if (start[i] == '"') + inString = !inString; + if (!inString && start[i] == '\'') + return false; + } + return inString; + } + bool IsFinishedString(string end) + { + bool inString = true; + for (int i = 0; i < end.Length; i++) { + if (end[i] == '"') + inString = !inString; + if (!inString && end[i] == '\'') + break; + } + return !inString; + } + + bool isEndStatementNeeded(TextArea textArea, VBStatement statement, int lineNr) + { + int count = 0; + + for (int i = 0; i < textArea.Document.TotalNumberOfLines; i++) { + LineSegment line = textArea.Document.GetLineSegment(i); + string lineText = textArea.Document.GetText(line.Offset, line.Length).Trim(); + + if (lineText.StartsWith("'")) { + continue; + } + + if (Regex.IsMatch(lineText, statement.StartRegex, RegexOptions.IgnoreCase)) { + count++; + } else if (Regex.IsMatch(lineText, statement.EndRegex, RegexOptions.IgnoreCase)) { + count--; + } + } + return count > 0; + } + + class VBStatement + { + public string StartRegex = ""; + public string EndRegex = ""; + public string EndStatement = ""; + + public int IndentPlus = 0; + + public VBStatement() + { + } + + public VBStatement(string startRegex, string endRegex, string endStatement, int indentPlus) + { + StartRegex = startRegex; + EndRegex = endRegex; + EndStatement = endStatement; + IndentPlus = indentPlus; + } + } + + + #region SearchBracket + public override int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket) + { + bool inString = false; + char ch; + int brackets = -1; + for (int i = offset; i > 0; --i) { + ch = document.GetCharAt(i); + if (ch == openBracket && !inString) { + ++brackets; + if (brackets == 0) return i; + } else if (ch == closingBracket && !inString) { + --brackets; + } else if (ch == '"') { + inString = !inString; + } else if (ch == '\n') { + int lineStart = ScanLineStart(document, i); + if (lineStart >= 0) { // line could have a comment + inString = false; + for (int j = lineStart; j < i; ++j) { + ch = document.GetCharAt(j); + if (ch == '"') inString = !inString; + if (ch == '\'' && !inString) { + // comment found! + // Skip searching in the comment: + i = j; + break; + } + } + } + inString = false; + } + } + return -1; + } + + static int ScanLineStart(IDocument document, int offset) + { + bool hasComment = false; + for (int i = offset - 1; i > 0; --i) { + char ch = document.GetCharAt(i); + if (ch == '\n') { + if (!hasComment) return -1; + return i + 1; + } else if (ch == '\'') { + hasComment = true; + } + } + return 0; + } + + public override int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket) + { + bool inString = false; + bool inComment = false; + int brackets = 1; + for (int i = offset; i < document.TextLength; ++i) { + char ch = document.GetCharAt(i); + if (ch == '\n') { + inString = false; + inComment = false; + } + if (inComment) continue; + if (ch == '"') inString = !inString; + if (inString) continue; + if (ch == '\'') { + inComment = true; + } else if (ch == openBracket) { + ++brackets; + } else if (ch == closingBracket) { + --brackets; + if (brackets == 0) return i; + } + } + return -1; + } + #endregion + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/CodeGenerationPanel.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/CodeGenerationPanel.cs new file mode 100644 index 0000000000..cb0c7060ef --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/CodeGenerationPanel.cs @@ -0,0 +1,78 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace VBBinding +{ + public class CodeGenerationPanel : AbstractOptionPanel + { + VBCompilerParameters compilerParameters = null; + + + static + + public override bool ReceiveDialogMessage(DialogMessage message) + { + if (message == DialogMessage.OK) { + if (compilerParameters == null) { + return true; + } + + + + compilerParameters.DefineSymbols = ControlDictionary["symbolsTextBox"].Text; + compilerParameters.MainClass = ControlDictionary["mainClassTextBox"].Text; + compilerParameters.Imports = ControlDictionary["importsTextBox"].Text; + compilerParameters.RootNamespace = ControlDictionary["RootNamespaceTextBox"].Text; + + compilerParameters.Debugmode = ((CheckBox)ControlDictionary["generateDebugInformationCheckBox"]).Checked; + compilerParameters.Optimize = ((CheckBox)ControlDictionary["enableOptimizationCheckBox"]).Checked; + compilerParameters.GenerateOverflowChecks = ((CheckBox)ControlDictionary["generateOverflowChecksCheckBox"]).Checked; + compilerParameters.TreatWarningsAsErrors = ((CheckBox)ControlDictionary["warningsAsErrorsCheckBox"]).Checked; + + compilerParameters.OptionExplicit = ((CheckBox)ControlDictionary["optionExplicitCheckBox"]).Checked ; + compilerParameters.OptionStrict = ((CheckBox)ControlDictionary["optionStrictCheckBox"]).Checked; + } + return true; + } + + void SetValues(object sender, EventArgs e) + { + this.compilerParameters = (VBCompilerParameters)((Properties)CustomizationObject).Get("Config"); + + ControlDictionary["symbolsTextBox"].Text = compilerParameters.DefineSymbols; + ControlDictionary["mainClassTextBox"].Text = compilerParameters.MainClass; + ControlDictionary["importsTextBox"].Text = compilerParameters.Imports; + ControlDictionary["RootNamespaceTextBox"].Text = compilerParameters.RootNamespace; + + + ((CheckBox)ControlDictionary["generateDebugInformationCheckBox"]).Checked = compilerParameters.Debugmode; + ((CheckBox)ControlDictionary["enableOptimizationCheckBox"]).Checked = compilerParameters.Optimize; + ((CheckBox)ControlDictionary["generateOverflowChecksCheckBox"]).Checked = compilerParameters.GenerateOverflowChecks; + ((CheckBox)ControlDictionary["warningsAsErrorsCheckBox"]).Checked = compilerParameters.TreatWarningsAsErrors; + + ((CheckBox)ControlDictionary["optionExplicitCheckBox"]).Checked = compilerParameters.OptionExplicit; + ((CheckBox)ControlDictionary["optionStrictCheckBox"]).Checked = compilerParameters.OptionStrict; + } + + static + public CodeGenerationPanel() : base(PropertyService.DataDirectory + @"\resources\panels\ProjectOptions\VBNetCodeGenerationPanel.xfrm") + { + CustomizationObjectChanged += new EventHandler(SetValues); + + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/GuiMessageRecipient.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/GuiMessageRecipient.cs new file mode 100644 index 0000000000..e1b76419b0 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/GuiMessageRecipient.cs @@ -0,0 +1,66 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; + +namespace VBBinding +{ + [Serializable()] + class GuiMessageRecipient : IMessageRecipient + { + class StatusForm : Form + { + Label statusLabel; + + public StatusForm() + { + this.Text = "VB.DOC status"; + this.ControlBox = false; + this.StartPosition = FormStartPosition.CenterScreen; + this.ShowInTaskbar = false; + + this.Size = new System.Drawing.Size(400, 50); + + statusLabel = new Label(); + statusLabel.Dock = DockStyle.Fill; + statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + Controls.Add(statusLabel); + } + + public void Status(string statusMessage) + { + statusLabel.Text = statusMessage; + Application.DoEvents(); + } + } + + StatusForm messageForm; + + public GuiMessageRecipient() + { + messageForm = new StatusForm(); + messageForm.Show(); + } + + public void Finished() + { + messageForm.Close(); + } + + public void DisplayStatusMessage(string message) + { + messageForm.Status(message); + } + + public void DisplayErrorMessage(string message) + { + // message doesn't work in this app domain + System.Windows.Forms.MessageBox.Show(message); + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/OutputOptionsPanel.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/OutputOptionsPanel.cs new file mode 100644 index 0000000000..e80795ef6d --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/OutputOptionsPanel.cs @@ -0,0 +1,161 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace VBBinding +{ + public class OutputOptionsPanel : AbstractOptionPanel + { + VBCompilerParameters compilerParameters; + static + + + public override bool ReceiveDialogMessage(DialogMessage message) + { + if (message == DialogMessage.OK) { + if (compilerParameters == null) { + return true; + } + + + if (!FileUtility.IsValidFileName(ControlDictionary["assemblyNameTextBox"].Text)) { + MessageBox.Show("Invalid assembly name specified", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); + return false; + } + if (!FileUtility.IsValidFileName(ControlDictionary["outputDirectoryTextBox"].Text)) { + MessageBox.Show("Invalid output directory specified", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); + return false; + } + + if (ControlDictionary["win32IconTextBox"].Text.Length > 0) { + if (!FileUtility.IsValidFileName(ControlDictionary["win32IconTextBox"].Text)) { + MessageBox.Show("Invalid Win32Icon specified", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); + return false; + } + if (!File.Exists(ControlDictionary["win32IconTextBox"].Text)) { + MessageBox.Show("Win32Icon doesn't exists", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); + return false; + } + } + + compilerParameters.CompileTarget = (CompileTarget)((ComboBox)ControlDictionary["compileTargetComboBox"]).SelectedIndex; + compilerParameters.OutputAssembly = ControlDictionary["assemblyNameTextBox"].Text; + compilerParameters.OutputDirectory = ControlDictionary["outputDirectoryTextBox"].Text; + compilerParameters.CommandLineParameters = ControlDictionary["parametersTextBox"].Text; + compilerParameters.ExecuteBeforeBuild = ControlDictionary["executeBeforeTextBox"].Text; + compilerParameters.ExecuteAfterBuild = ControlDictionary["executeAfterTextBox"].Text; + compilerParameters.ExecuteScript = ControlDictionary["executeScriptTextBox"].Text; + compilerParameters.Win32Icon = ControlDictionary["win32IconTextBox"].Text; + compilerParameters.ExecuteBeforeBuildArguments = ControlDictionary["executeBeforeArgumentsTextBox"].Text; + compilerParameters.ExecuteAfterBuildArguments = ControlDictionary["executeAfterArgumentsTextBox"].Text; + + compilerParameters.PauseConsoleOutput = ((CheckBox)ControlDictionary["pauseConsoleOutputCheckBox"]).Checked; + } + return true; + } + + void SetValues(object sender, EventArgs e) + { + this.compilerParameters = (VBCompilerParameters)((Properties)CustomizationObject).Get("Config"); + + ((ComboBox)ControlDictionary["compileTargetComboBox"]).SelectedIndex = (int)compilerParameters.CompileTarget; + ControlDictionary["win32IconTextBox"].Text = compilerParameters.Win32Icon; + ControlDictionary["assemblyNameTextBox"].Text = compilerParameters.OutputAssembly; + ControlDictionary["outputDirectoryTextBox"].Text = compilerParameters.OutputDirectory; + ControlDictionary["parametersTextBox"].Text = compilerParameters.CommandLineParameters; + ControlDictionary["executeScriptTextBox"].Text = compilerParameters.ExecuteScript; + ControlDictionary["executeBeforeTextBox"].Text = compilerParameters.ExecuteBeforeBuild; + ControlDictionary["executeAfterTextBox"].Text = compilerParameters.ExecuteAfterBuild; + ControlDictionary["executeBeforeArgumentsTextBox"].Text = compilerParameters.ExecuteBeforeBuildArguments; + ControlDictionary["executeAfterArgumentsTextBox"].Text = compilerParameters.ExecuteAfterBuildArguments; + + ((CheckBox)ControlDictionary["pauseConsoleOutputCheckBox"]).Checked = compilerParameters.PauseConsoleOutput; + } + + void SelectFolder(object sender, EventArgs e) + { + FolderDialog fdiag = new FolderDialog(); + + if (fdiag.DisplayDialog("${res:Dialog.Options.PrjOptions.Configuration.FolderBrowserDescription}") == DialogResult.OK) { + ControlDictionary["outputDirectoryTextBox"].Text = fdiag.Path; + } + } + + void SelectFile2(object sender, EventArgs e) + { + OpenFileDialog fdiag = new OpenFileDialog(); + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + + if(fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["executeBeforeTextBox"].Text = fdiag.FileName; + } + } + + void SelectFile3(object sender, EventArgs e) + { + OpenFileDialog fdiag = new OpenFileDialog(); + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + + if(fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["executeAfterTextBox"].Text = fdiag.FileName; + } + } + void SelectFile4(object sender, EventArgs e) + { + OpenFileDialog fdiag = new OpenFileDialog(); + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + + if(fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["executeScriptTextBox"].Text = fdiag.FileName; + } + } + void SelectWin32Icon(object sender, EventArgs e) + { + using (OpenFileDialog fdiag = new OpenFileDialog()) { + fdiag.AddExtension = true; + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.Icons}|*.ico|${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + fdiag.CheckFileExists = true; + + if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["win32IconTextBox"].Text = fdiag.FileName; + } + } + } + + static + public OutputOptionsPanel() : base(PropertyService.DataDirectory + @"\resources\panels\ProjectOptions\OutputPanel.xfrm") + { + CustomizationObjectChanged += new EventHandler(SetValues); + ControlDictionary["browseButton"].Click += new EventHandler(SelectFolder); + ControlDictionary["browseButton2"].Click += new EventHandler(SelectFile2); + ControlDictionary["browseButton3"].Click += new EventHandler(SelectFile3); + ControlDictionary["browseButton4"].Click += new EventHandler(SelectFile4); + ControlDictionary["browseWin32IconButton"].Click += new EventHandler(SelectWin32Icon); + + + ((ComboBox)ControlDictionary["compileTargetComboBox"]).Items.Add(ResourceService.GetString("Dialog.Options.PrjOptions.Configuration.CompileTarget.Exe")); + ((ComboBox)ControlDictionary["compileTargetComboBox"]).Items.Add(ResourceService.GetString("Dialog.Options.PrjOptions.Configuration.CompileTarget.WinExe")); + ((ComboBox)ControlDictionary["compileTargetComboBox"]).Items.Add(ResourceService.GetString("Dialog.Options.PrjOptions.Configuration.CompileTarget.Library")); + ((ComboBox)ControlDictionary["compileTargetComboBox"]).Items.Add(ResourceService.GetString("Dialog.Options.PrjOptions.Configuration.CompileTarget.Module")); + + } + } + +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/TextEditorOptionsPanel.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/TextEditorOptionsPanel.cs new file mode 100644 index 0000000000..31b80e6459 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/TextEditorOptionsPanel.cs @@ -0,0 +1,38 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace VBBinding +{ + public class TextEditorOptionsPanel : AbstractOptionPanel + { + public override void LoadPanelContents() + { + SetupFromXml(Path.Combine(PropertyService.DataDirectory, + @"resources\panels\VBSpecificTextEditorOptions.xfrm")); + ((CheckBox)ControlDictionary["enableEndConstructsCheckBox"]).Checked = PropertyService.Get("VBBinding.TextEditor.EnableEndConstructs", true); + ((CheckBox)ControlDictionary["enableCasingCheckBox"]).Checked = PropertyService.Get("VBBinding.TextEditor.EnableCasing", true); + } + + public override bool StorePanelContents() + { + PropertyService.Set("VBBinding.TextEditor.EnableEndConstructs", ((CheckBox)ControlDictionary["enableEndConstructsCheckBox"]).Checked); + PropertyService.Set("VBBinding.TextEditor.EnableCasing", ((CheckBox)ControlDictionary["enableCasingCheckBox"]).Checked); + + return true; + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/VBCompilerPanel.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/VBCompilerPanel.cs new file mode 100644 index 0000000000..ab2d5f4c81 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/VBCompilerPanel.cs @@ -0,0 +1,47 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace VBBinding +{ + public class VBCompilerPanel : AbstractOptionPanel + { + VBCompilerParameters config = null; + + public override void LoadPanelContents() + { + SetupFromXml(Path.Combine(PropertyService.DataDirectory, + @"resources\panels\VBCompilerPanel.xfrm")); + + this.config = (VBCompilerParameters)((Properties)CustomizationObject).Get("Config"); + + + ((ComboBox)ControlDictionary["compilerVersionComboBox"]).Items.Add("Standard"); + foreach (string runtime in FileUtility.GetAvaiableRuntimeVersions()) { + ((ComboBox)ControlDictionary["compilerVersionComboBox"]).Items.Add(runtime); + } + + ((ComboBox)ControlDictionary["compilerVersionComboBox"]).Text = config.VBCompilerVersion.Length == 0 ? "Standard" : config.VBCompilerVersion; + } + + public override bool StorePanelContents() + { + config.VBCompilerVersion = ControlDictionary["compilerVersionComboBox"].Text; + return true; + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/VBDocConfigurationPanel.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/VBDocConfigurationPanel.cs new file mode 100644 index 0000000000..cace4332ef --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Gui/VBDocConfigurationPanel.cs @@ -0,0 +1,88 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace VBBinding +{ + public class VBDOCConfigurationPanel : AbstractOptionPanel + { + VBCompilerParameters compilerParameters = null; + VBProject project = null; + + static + static + + /// + /// Returns if the filename will be parsed when running VB.DOC. + /// + public static bool IsFileIncluded(string filename, VBProject project) + { + VBCompilerParameters compilerparameters = (VBCompilerParameters)project.ActiveConfiguration; + return Array.IndexOf(compilerparameters.VBDOCFiles, filename) == -1; + } + + + public VBDOCConfigurationPanel() : base(PropertyService.DataDirectory + @"\resources\panels\ProjectOptions\VBDOCConfigurationPanel.xfrm") + { + CustomizationObjectChanged += new EventHandler(SetValues); + ControlDictionary["BrowseOutputFileButton"].Click += new EventHandler(BrowseOutputFileButton_Click); + } + + private void BrowseOutputFileButton_Click(object sender, EventArgs e) { + SaveFileDialog dialog = new SaveFileDialog(); + dialog.Filter = "XML files (*.xml)|*.xml"; + if(dialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ((TextBox)ControlDictionary["OutputFileTextBox"]).Text = dialog.FileName; + } + } + + public override bool ReceiveDialogMessage(DialogMessage message) + { + if (message == DialogMessage.OK) { + if (compilerParameters == null) { + return true; + } + + compilerParameters.VBDOCOutputFile = ((TextBox)ControlDictionary["OutputFileTextBox"]).Text; + compilerParameters.VBDOCCommentPrefix = ((TextBox)ControlDictionary["CommentPrefixTextBox"]).Text; + + string[] files = new string[((CheckedListBox)ControlDictionary["FileListBox"]).Items.Count - ((CheckedListBox)ControlDictionary["FileListBox"]).CheckedIndices.Count]; + int count = 0; + for(int index = 0; index < ((CheckedListBox)ControlDictionary["FileListBox"]).Items.Count; index++) { + if(((CheckedListBox)ControlDictionary["FileListBox"]).GetItemChecked(index) == false) { + files[count] = (string)((CheckedListBox)ControlDictionary["FileListBox"]).Items[index]; + count++; + } + } + compilerParameters.VBDOCFiles = files; + } + return true; + } + + void SetValues(object sender, EventArgs e) + { + this.compilerParameters = (VBCompilerParameters)((Properties)CustomizationObject).Get("Config"); + project = (VBProject)((Properties)CustomizationObject).Get("Project"); + + ((TextBox)ControlDictionary["OutputFileTextBox"]).Text = compilerParameters.VBDOCOutputFile; + ((TextBox)ControlDictionary["CommentPrefixTextBox"]). Text = compilerParameters.VBDOCCommentPrefix; + + foreach(ProjectFile pfile in project.ProjectFiles) { + bool included = IsFileIncluded(pfile.Name, project); + ((CheckedListBox)ControlDictionary["FileListBox"]).Items.Add(pfile.Name, included); + } + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs new file mode 100644 index 0000000000..6736a77716 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs @@ -0,0 +1,371 @@ +using System; +using System.Text; +using ICSharpCode.SharpDevelop.Dom; + +namespace VBBinding.Parser +{ + /// + /// Description of ExpressionFinder. + /// + public class ExpressionFinder : IExpressionFinder + { + public string FindExpression(string inText, int offset) + { + this.text = FilterComments(inText, ref offset); + this.text = text; + this.offset = this.lastAccept = offset; + this.state = START; + if (this.text == null) { + return null; + } + while (state != ERROR) { + ReadNextToken(); + //Console.WriteLine("cur state {0} got token {1}/{3} going to {2}", GetStateName(state), GetTokenName(curTokenType), GetStateName(stateTable[state, curTokenType]), curTokenType); + state = stateTable[state, curTokenType]; + + if (state == ACCEPT || state == ACCEPT2) { + lastAccept = this.offset; + } + if (state == ACCEPTNOMORE) { + return this.text.Substring(this.offset + 1, offset - this.offset); + } + } + return this.text.Substring(this.lastAccept + 1, offset - this.lastAccept); + } + + #region Comment Filter and 'inside string watcher' + int initialOffset; + public string FilterComments(string text, ref int offset) + { + this.initialOffset = offset; + StringBuilder outText = new StringBuilder(); + int curOffset = 0; + while (curOffset <= initialOffset) { + char ch = text[curOffset]; + + switch (ch) { + case '@': + if (curOffset + 1 < text.Length && text[curOffset + 1] == '"') { + outText.Append(text[curOffset++]); // @ + outText.Append(text[curOffset++]); // " + if (!ReadVerbatimString(outText, text, ref curOffset)) { + return null; + } + }else{ + outText.Append(ch); + ++curOffset; + } + break; + case '"': + outText.Append(ch); + curOffset++; + if (!ReadString(outText, text, ref curOffset)) { + return null; + } + break; + case '\'': + offset -= 1; + curOffset += 1; + if (!ReadToEOL(text, ref curOffset, ref offset)) { + return null; + } + break; + default: + outText.Append(ch); + ++curOffset; + break; + } + } + + return outText.ToString(); + } + + bool ReadToEOL(string text, ref int curOffset, ref int offset) + { + while (curOffset <= initialOffset) { + char ch = text[curOffset++]; + --offset; + if (ch == '\n') { + return true; + } + } + return false; + } + + bool ReadString(StringBuilder outText, string text, ref int curOffset) + { + while (curOffset <= initialOffset) { + char ch = text[curOffset++]; + outText.Append(ch); + if (ch == '"') { + return true; + } + } + return false; + } + + bool ReadVerbatimString(StringBuilder outText, string text, ref int curOffset) + { + while (curOffset <= initialOffset) { + char ch = text[curOffset++]; + outText.Append(ch); + if (ch == '"') { + if (curOffset < text.Length && text[curOffset] == '"') { + outText.Append(text[curOffset++]); + } else { + return true; + } + } + } + return false; + } + + bool ReadMultiLineComment(string text, ref int curOffset, ref int offset) + { + while (curOffset <= initialOffset) { + char ch = text[curOffset++]; + --offset; + if (ch == '*') { + if (curOffset < text.Length && text[curOffset] == '/') { + ++curOffset; + --offset; + return true; + } + } + } + return false; + } + #endregion + + #region mini backward lexer + string text; + int offset; + + char GetNext() + { + if (offset >= 0) { + return text[offset--]; + } + return '\0'; + } + + char Peek() + { + if (offset >= 0) { + return text[offset]; + } + return '\0'; + } + + void UnGet() + { + ++offset; + } + + // tokens for our lexer + static int Err = 0; + static int Dot = 1; + static int StrLit = 2; + static int Ident = 3; + static int New = 4; +// static int Bracket = 5; + static int Parent = 6; + static int Curly = 7; + static int Using = 8; + int curTokenType; + + readonly static string[] tokenStateName = new string[] { + "Err", "Dot", "StrLit", "Ident", "New", "Bracket", "Paren", "Curly", "Using" + }; + string GetTokenName(int state) + { + return tokenStateName[state]; + } + + void ReadNextToken() + { + char ch = GetNext(); + + curTokenType = Err; + if (ch == '\0' || ch == '\n' || ch == '\r') { + return; + } + while (Char.IsWhiteSpace(ch)) { + ch = GetNext(); + if (ch == '\n' || ch == '\r') { + return; + } + } + + switch (ch) { + case '}': + if (ReadBracket('{', '}')) { + curTokenType = Curly; + } + break; + case ')': + if (ReadBracket('(', ')')) { + curTokenType = Parent; + } + break; + case ']': + if (ReadBracket('[', ']')) { + curTokenType = Ident; + } + break; + case '.': + curTokenType = Dot; + break; + case '\'': + case '"': + if (ReadStringLiteral(ch)) { + curTokenType = StrLit; + } + break; + default: + if (IsIdentifierPart(ch)) { + string ident = ReadIdentifier(ch); + if (ident != null) { + switch (ident.ToLower()) { + case "new": + curTokenType = New; + break; + case "imports": + curTokenType = Using; + break; + default: + curTokenType = Ident; + break; + } + } + } + break; + } + } + + bool ReadStringLiteral(char litStart) + { + while (true) { + char ch = GetNext(); + if (ch == '\0') { + return false; + } + if (ch == litStart) { + if (Peek() == '@' && litStart == '"') { + GetNext(); + } + return true; + } + } + } + + bool ReadBracket(char openBracket, char closingBracket) + { + int curlyBraceLevel = 0; + int squareBracketLevel = 0; + int parenthesisLevel = 0; + switch (openBracket) { + case '(': + parenthesisLevel++; + break; + case '[': + squareBracketLevel++; + break; + case '{': + curlyBraceLevel++; + break; + } + + while (parenthesisLevel != 0 || squareBracketLevel != 0 || curlyBraceLevel != 0) { + char ch = GetNext(); + if (ch == '\0') { + return false; + } + switch (ch) { + case '(': + parenthesisLevel--; + break; + case '[': + squareBracketLevel--; + break; + case '{': + curlyBraceLevel--; + break; + case ')': + parenthesisLevel++; + break; + case ']': + squareBracketLevel++; + break; + case '}': + curlyBraceLevel++; + break; + } + } + return true; + } + + string ReadIdentifier(char ch) + { + string identifier = ch.ToString(); + while (IsIdentifierPart(Peek())) { + identifier = GetNext() + identifier; + } + return identifier; + } + + bool IsIdentifierPart(char ch) + { + return Char.IsLetterOrDigit(ch) || ch == '_'; + } + #endregion + + #region finite state machine + readonly static int ERROR = 0; + readonly static int START = 1; + readonly static int DOT = 2; + readonly static int MORE = 3; + readonly static int CURLY = 4; + readonly static int CURLY2 = 5; + readonly static int CURLY3 = 6; + + readonly static int ACCEPT = 7; + readonly static int ACCEPTNOMORE = 8; + readonly static int ACCEPT2 = 9; + + readonly static string[] stateName = new string[] { + "ERROR", + "START", + "DOT", + "MORE", + "CURLY", + "CURLY2", + "CURLY3", + "ACCEPT", + "ACCEPTNOMORE", + "ACCEPT2" + }; + + string GetStateName(int state) + { + return stateName[state]; + } + + int state = 0; + int lastAccept = 0; + static int[,] stateTable = new int[,] { + // Err, Dot, Str, ID, New, Brk, Par, Cur, Using + /*ERROR*/ { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, + /*START*/ { ERROR, DOT, ACCEPT, ACCEPT, ERROR, MORE, ACCEPT2, CURLY, ACCEPTNOMORE}, + /*DOT*/ { ERROR, ERROR, ACCEPT, ACCEPT, ERROR, MORE, ACCEPT, CURLY, ERROR}, + /*MORE*/ { ERROR, ERROR, ACCEPT, ACCEPT, ERROR, MORE, ACCEPT2, CURLY, ERROR}, + /*CURLY*/ { ERROR, ERROR, ERROR, ERROR, ERROR, CURLY2, ERROR, ERROR, ERROR}, + /*CURLY2*/ { ERROR, ERROR, ERROR, CURLY3, ERROR, ERROR, ERROR, ERROR, ERROR}, + /*CURLY3*/ { ERROR, ERROR, ERROR, ERROR, ACCEPTNOMORE, ERROR, ERROR, ERROR, ERROR}, + /*ACCEPT*/ { ERROR, MORE, ERROR, ERROR, ACCEPT, ERROR, ERROR, ERROR, ACCEPTNOMORE}, + /*ACCEPTNOMORE*/ { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, + /*ACCEPT2*/ { ERROR, MORE, ERROR, ACCEPT, ACCEPT, ERROR, ERROR, ERROR, ERROR}, + }; + #endregion + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs new file mode 100644 index 0000000000..b1cc58baf6 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/Parser.cs @@ -0,0 +1,127 @@ +// +// +// +// +// +// +using System; +using System.IO; +using System.Collections; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; + +namespace VBBinding.Parser +{ + public class TParser : ICSharpCode.SharpDevelop.Dom.IParser + { + ///IParser Interface + string[] lexerTags; + + public string[] LexerTags { + get { + return lexerTags; + } + set { + lexerTags = value; + } + } + public IExpressionFinder ExpressionFinder { + get { + return new ExpressionFinder(); + } + } + public bool CanParse(string fileName) + { + return Path.GetExtension(fileName).ToUpper() == ".VB"; + } + public bool CanParse(IProject project) + { + return project.ProjectType == "VBNET"; + } + + void RetrieveRegions(ICompilationUnit cu, SpecialTracker tracker) + { + for (int i = 0; i < tracker.CurrentSpecials.Count; ++i) { + PreProcessingDirective directive = tracker.CurrentSpecials[i] as PreProcessingDirective; + if (directive != null) { + if (directive.Cmd.ToLower() == "#region") { + int deep = 1; + for (int j = i + 1; j < tracker.CurrentSpecials.Count; ++j) { + PreProcessingDirective nextDirective = tracker.CurrentSpecials[j] as PreProcessingDirective; + if(nextDirective != null) { + switch (nextDirective.Cmd.ToLower()) { + case "#region": + ++deep; + break; + case "#end": + if (nextDirective.Arg.ToLower() == "region") { + --deep; + if (deep == 0) { + cu.FoldingRegions.Add(new FoldingRegion(directive.Arg.Trim('"'), new DefaultRegion(directive.Start, nextDirective.End))); + goto end; + } + } + break; + } + } + } + end: ; + } + } + } + } + + public ICompilationUnitBase Parse(string fileName) + { + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(fileName); + p.Lexer.SpecialCommentTags = lexerTags; + p.Parse(); + + NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(); + visitor.Visit(p.CompilationUnit, null); + visitor.Cu.FileName = fileName; + visitor.Cu.ErrorsDuringCompile = p.Errors.count > 0; + + RetrieveRegions(visitor.Cu, p.Lexer.SpecialTracker); + AddCommentTags(visitor.Cu, p.Lexer.TagComments); + return visitor.Cu; + } + + public ICompilationUnitBase Parse(string fileName, string fileContent) + { + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(ICSharpCode.NRefactory.Parser.SupportedLanguages.VBNet, new StringReader(fileContent)); + p.Lexer.SpecialCommentTags = lexerTags; + p.Parse(); + + NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(); + visitor.Visit(p.CompilationUnit, null); + visitor.Cu.FileName = fileName; + visitor.Cu.ErrorsDuringCompile = p.Errors.count > 0; + visitor.Cu.Tag = p.CompilationUnit; + + RetrieveRegions(visitor.Cu, p.Lexer.SpecialTracker); + AddCommentTags(visitor.Cu, p.Lexer.TagComments); + return visitor.Cu; + } + + void AddCommentTags(ICompilationUnit cu, ArrayList tagComments) + { + foreach (ICSharpCode.NRefactory.Parser.TagComment tagComment in tagComments) { + DefaultRegion tagRegion = new DefaultRegion(tagComment.StartPosition.Y, tagComment.StartPosition.X); + ICSharpCode.SharpDevelop.Dom.Tag tag = new ICSharpCode.SharpDevelop.Dom.Tag(tagComment.Tag, tagRegion); + tag.CommentString = tagComment.CommentText; + cu.TagComments.Add(tag); + } + } + + public IResolver CreateResolver() + { + return new ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver(ICSharpCode.NRefactory.Parser.SupportedLanguages.VBNet); + } + + ///////// IParser Interface END + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBCompilerParameters.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBCompilerParameters.cs new file mode 100644 index 0000000000..81321d8ae2 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBCompilerParameters.cs @@ -0,0 +1,279 @@ +// +// +// +// +// +// + +using System; +using System.Xml; +using System.Diagnostics; +using System.ComponentModel; + +using ICSharpCode.SharpDevelop.Internal.Project; + +namespace VBBinding { + + public enum CompileTarget + { + Exe, + WinExe, + Library, + Module + }; + + /// + /// This class handles project specific compiler parameters + /// + public class VBCompilerParameters : AbstractProjectConfiguration + { + [XmlNodeName("CodeGeneration")] + class CodeGeneration + { + [XmlAttribute("compilerversion")] + public string vbCompilerVersion = String.Empty; + + [XmlAttribute("includedebuginformation")] + public bool debugmode = true; + + [XmlAttribute("optimize")] + public bool optimize = true; + + [XmlAttribute("generateoverflowchecks")] + public bool generateOverflowChecks = true; + + [XmlAttribute("rootnamespace")] + public string rootnamespace = String.Empty; + + [XmlAttribute("mainclass")] + public string mainclass = null; + + [XmlAttribute("target")] + public CompileTarget compiletarget = CompileTarget.Exe; + + [XmlAttribute("definesymbols")] + public string definesymbols = String.Empty; + + [XmlAttribute("optionexplicit")] + public bool optionExplicit = true; + + [XmlAttribute("optionstrict")] + public bool optionStrict = false; + + [ConvertToRelativePathAttribute()] + [XmlAttribute("win32Icon")] + public string win32Icon = String.Empty; + + [XmlAttribute("imports")] + public string imports = String.Empty; + } + + [XmlNodeName("Execution")] + class Execution + { + [XmlAttribute("consolepause")] + public bool pauseconsoleoutput = true; + + [XmlAttribute("commandlineparameters")] + public string commandLineParameters = String.Empty; + + } + + [XmlNodeName("VBDOC")] + class VBDOC + { + [XmlAttribute("outputfile")] + [ConvertToRelativePathAttribute()] + public string outputfile = String.Empty; + + [XmlAttribute("filestoparse")] + public string filestoparse = String.Empty; + + [XmlAttribute("commentprefix")] + public string commentprefix = "'"; + } + + CodeGeneration codeGeneration = new CodeGeneration(); + VBDOC vbdoc = new VBDOC(); + Execution execution = new Execution(); + + [Browsable(false)] + public string VBCompilerVersion + { + get { + return codeGeneration.vbCompilerVersion; + } + set { + codeGeneration.vbCompilerVersion = value; + } + } + + public string CommandLineParameters + { + get { + return execution.commandLineParameters; + } + set { + execution.commandLineParameters = value; + } + } + public bool GenerateOverflowChecks + { + get { + return codeGeneration.generateOverflowChecks; + } + set { + codeGeneration.generateOverflowChecks = value; + } + } + + public string Imports + { + get { + return codeGeneration.imports; + } + set { + codeGeneration.imports = value; + } + } + + public string Win32Icon + { + get { + return codeGeneration.win32Icon; + } + set { + codeGeneration.win32Icon = value; + } + } + + public string RootNamespace + { + get { + return codeGeneration.rootnamespace; + } + set { + codeGeneration.rootnamespace = value; + } + } + + public string DefineSymbols + { + get { + return codeGeneration.definesymbols; + } + set { + codeGeneration.definesymbols = value; + } + } + + public bool PauseConsoleOutput + { + get { + return execution.pauseconsoleoutput; + } + set { + execution.pauseconsoleoutput = value; + } + } + + public bool Debugmode + { + get { + return codeGeneration.debugmode; + } + set { + codeGeneration.debugmode = value; + } + } + + public bool Optimize + { + get { + return codeGeneration.optimize; + } + set { + codeGeneration.optimize = value; + } + } + + public string MainClass + { + get { + return codeGeneration.mainclass; + } + set { + codeGeneration.mainclass = value; + } + } + + public CompileTarget CompileTarget + { + get { + return codeGeneration.compiletarget; + } + set { + codeGeneration.compiletarget = value; + } + } + + public bool OptionExplicit + { + get { + return codeGeneration.optionExplicit; + } + set { + codeGeneration.optionExplicit = value; + } + } + + public bool OptionStrict + { + get { + return codeGeneration.optionStrict; + } + set { + codeGeneration.optionStrict = value; + } + } + + public string VBDOCOutputFile + { + get { + return vbdoc.outputfile; + } + set { + vbdoc.outputfile = value; + } + } + + public string[] VBDOCFiles + { + get { + return vbdoc.filestoparse.Split(';'); + } + set { + vbdoc.filestoparse = System.String.Join(";", value); + } + } + + public string VBDOCCommentPrefix + { + get { + return vbdoc.commentprefix; + } + set { + vbdoc.commentprefix = value; + } + } + + public VBCompilerParameters() + { + } + + public VBCompilerParameters(string name) + { + this.name = name; + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBProject.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBProject.cs new file mode 100644 index 0000000000..10defddb7d --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBProject.cs @@ -0,0 +1,74 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.ComponentModel; +using System.Xml; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; + +namespace VBBinding +{ + /// + /// This class describes a VB.NET project and it compilation options. + /// + public class VBProject : AbstractProject + { + public override string ProjectType { + get { + return VBLanguageBinding.LanguageName; + } + } + + public override IConfiguration CreateConfiguration() + { + return new VBCompilerParameters(); + } + + public VBProject() + { + } + + public VBProject(ProjectCreateInformation info, XmlElement projectOptions) + { + if (info != null) { + Name = info.ProjectName; + + VBCompilerParameters debug = (VBCompilerParameters)CreateConfiguration("Debug"); + debug.Optimize = false; + Configurations.Add(debug); + + VBCompilerParameters release = (VBCompilerParameters)CreateConfiguration("Release"); + debug.Optimize = true; + release.Debugmode = false; + release.GenerateOverflowChecks = false; + release.TreatWarningsAsErrors = false; + Configurations.Add(release); + + XmlElement el = projectOptions; + + foreach (VBCompilerParameters parameter in Configurations) { + parameter.OutputDirectory = info.BinPath + Path.DirectorySeparatorChar + parameter.Name; + parameter.OutputAssembly = Name; + + if (el != null) { + if (el.Attributes["Target"] != null) { + parameter.CompileTarget = (CompileTarget)Enum.Parse(typeof(CompileTarget), el.Attributes["Target"].InnerText); + } + if (el.Attributes["PauseConsoleOutput"] != null) { + parameter.PauseConsoleOutput = Boolean.Parse(el.Attributes["PauseConsoleOutput"].InnerText); + } + } + } + } + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBAmbience.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBAmbience.cs new file mode 100644 index 0000000000..d730b4131f --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBAmbience.cs @@ -0,0 +1,570 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Text; + +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.Core; + +namespace ICSharpCode.Core +{ + public class VBAmbience : AbstractAmbience + { + static string[,] typeConversionList = new string[,] { + {"System.String", "String"}, + {"System.Single", "Single"}, + {"System.Int16", "Short"}, + {"System.Void", "Void"}, + {"System.Object", "Object"}, + {"System.Int64", "Long"}, + {"System.Int32", "Integer"}, + {"System.Double", "Double"}, + {"System.Char", "Char"}, + {"System.Boolean", "Boolean"}, + {"System.Byte", "Byte"}, + {"System.Decimal", "Decimal"}, + {"System.DateTime", "Date"}, + }; + + static Hashtable typeConversionTable = new Hashtable(); + + static VBAmbience() + { + for (int i = 0; i < typeConversionList.GetLength(0); ++i) { + typeConversionTable[typeConversionList[i, 0]] = typeConversionList[i, 1]; + } + } + + string GetModifier(IDecoration decoration) + { + StringBuilder builder = new StringBuilder(); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (decoration.IsStatic) { + builder.Append("Shared "); + } + if (decoration.IsAbstract) { + builder.Append("MustOverride "); + } else if (decoration.IsFinal) { + builder.Append("NotOverridable "); + } else if (decoration.IsVirtual) { + builder.Append("Overridable "); + } else if (decoration.IsOverride) { + builder.Append("Overrides "); + } else if (decoration.IsNew) { + builder.Append("Shadows "); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + return builder.ToString(); + } + + public override string Convert(ModifierEnum modifier) + { + StringBuilder builder = new StringBuilder(); + if (ShowAccessibility) { + if ((modifier & ModifierEnum.Public) == ModifierEnum.Public) { + builder.Append("Public"); + } else if ((modifier & ModifierEnum.Private) == ModifierEnum.Private) { + builder.Append("Private"); + } else if ((modifier & (ModifierEnum.Protected | ModifierEnum.Internal)) == (ModifierEnum.Protected | ModifierEnum.Internal)) { + builder.Append("Protected Friend"); + } else if ((modifier & ModifierEnum.ProtectedOrInternal) == ModifierEnum.ProtectedOrInternal) { + builder.Append("Protected Friend"); + } else if ((modifier & ModifierEnum.Internal) == ModifierEnum.Internal) { + builder.Append("Friend"); + } else if ((modifier & ModifierEnum.Protected) == ModifierEnum.Protected) { + builder.Append("Protected"); + } + builder.Append(' '); + } + return builder.ToString(); + } + + public override string Convert(IClass c) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(c.Modifiers)); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (ShowModifiers) { + if (c.IsSealed) { + if (c.ClassType == ClassType.Class) { + builder.Append("NotInheritable "); + } + } else if (c.IsAbstract && c.ClassType != ClassType.Interface) { + builder.Append("MustInherit "); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + switch (c.ClassType) { + case ClassType.Delegate: + builder.Append("Delegate "); + if (ShowReturnType) { + foreach (IMethod m in c.Methods) { + if (m.Name != "Invoke") { + continue; + } + + if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { + builder.Append("Sub"); + } else { + builder.Append("Function"); + } + } + } + break; + case ClassType.Class: + builder.Append("Class"); + break; + case ClassType.Struct: + builder.Append("Structure"); + break; + case ClassType.Interface: + builder.Append("Interface"); + break; + case ClassType.Enum: + builder.Append("Enum"); + break; + } + builder.Append(' '); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(c.FullyQualifiedName); + } else { + builder.Append(c.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (c.ClassType == ClassType.Delegate) { + builder.Append("("); + if (IncludeHTMLMarkup) builder.Append("
"); + + foreach (IMethod m in c.Methods) { + if (m.Name != "Invoke") continue; + + for (int i = 0; i < m.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + + builder.Append(Convert(m.Parameters[i])); + if (i + 1 < m.Parameters.Count) builder.Append(", "); + + if (IncludeHTMLMarkup) builder.Append("
"); + } + } + + builder.Append(")"); + + foreach (IMethod m in c.Methods) { + if (m.Name != "Invoke") continue; + + if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { + } else { + if (ShowReturnType) { + builder.Append(" As "); + builder.Append(Convert(m.ReturnType)); + } + } + } + + } else if (ShowInheritanceList) { + if (c.BaseTypes.Count > 0) { + builder.Append(" Inherits "); + for (int i = 0; i < c.BaseTypes.Count; ++i) { + builder.Append(c.BaseTypes[i]); + if (i + 1 < c.BaseTypes.Count) { + builder.Append(", "); + } + } + } + } + + return builder.ToString(); + } + + public override string ConvertEnd(IClass c) + { + StringBuilder builder = new StringBuilder(); + + builder.Append("End "); + + switch (c.ClassType) { + case ClassType.Delegate: + builder.Append("Delegate"); + break; + case ClassType.Class: + builder.Append("Class"); + break; + case ClassType.Struct: + builder.Append("Structure"); + break; + case ClassType.Interface: + builder.Append("Interface"); + break; + case ClassType.Enum: + builder.Append("Enum"); + break; + } + + return builder.ToString(); + } + + public override string Convert(IField field) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(field.Modifiers)); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (ShowModifiers) { + if (field.IsStatic && field.IsLiteral) { + builder.Append("Const "); + } else if (field.IsStatic) { + builder.Append("Shared "); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(field.FullyQualifiedName); + } else { + builder.Append(field.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (field.ReturnType != null && ShowReturnType) { + builder.Append(" As "); + builder.Append(Convert(field.ReturnType)); + } + + return builder.ToString(); + } + + public override string Convert(IProperty property) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(property.Modifiers)); + + if (ShowModifiers) { + builder.Append(GetModifier(property)); + } + + if (property.CanGet && !property.CanSet) { + builder.Append("ReadOnly "); + } + + if (property.CanSet && !property.CanGet) { + builder.Append("WriteOnly "); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(property.FullyQualifiedName); + } else { + builder.Append(property.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (property.Parameters.Count > 0) { + builder.Append("("); + if (IncludeHTMLMarkup) builder.Append("
"); + + for (int i = 0; i < property.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + builder.Append(Convert(property.Parameters[i])); + if (i + 1 < property.Parameters.Count) { + builder.Append(", "); + } + if (IncludeHTMLMarkup) builder.Append("
"); + } + + builder.Append(')'); + } + + if (property.ReturnType != null && ShowReturnType) { + builder.Append(" As "); + builder.Append(Convert(property.ReturnType)); + } + + return builder.ToString(); + } + + public override string Convert(IEvent e) + { + StringBuilder builder = new StringBuilder(); + + builder.Append(Convert(e.Modifiers)); + + if (ShowModifiers) { + builder.Append(GetModifier(e)); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(e.FullyQualifiedName); + } else { + builder.Append(e.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (e.ReturnType != null && ShowReturnType) { + builder.Append(" As "); + builder.Append(Convert(e.ReturnType)); + } + + return builder.ToString(); + } + + public override string Convert(IIndexer m) + { + StringBuilder builder = new StringBuilder(); + builder.Append(Convert(m.Modifiers)); + + if (ShowModifiers) { + if (m.IsStatic) { + builder.Append("Shared "); + } + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (UseFullyQualifiedMemberNames) { + builder.Append(m.FullyQualifiedName); + } else { + builder.Append(m.Name); + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + builder.Append("Item("); + if (IncludeHTMLMarkup) builder.Append("
"); + + for (int i = 0; i < m.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + builder.Append(Convert(m.Parameters[i])); + if (i + 1 < m.Parameters.Count) { + builder.Append(", "); + } + if (IncludeHTMLMarkup) builder.Append("
"); + } + + builder.Append(")"); + + if (m.ReturnType != null && ShowReturnType) { + builder.Append(" As "); + builder.Append(Convert(m.ReturnType)); + } + + return builder.ToString(); + } + + public override string Convert(IMethod m) + { + StringBuilder builder = new StringBuilder(); + builder.Append(Convert(m.Modifiers)); + + if (ShowModifiers) { + builder.Append(GetModifier(m)); + } + if (ShowReturnType) { + if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { + builder.Append("Sub "); + } else { + builder.Append("Function "); + } + } + + string dispName = UseFullyQualifiedMemberNames ? m.FullyQualifiedName : m.Name; + if (m.Name == "ctor" || m.Name == "cctor" || m.Name == "#ctor" || m.Name == "#cctor" || m.IsConstructor) { + dispName = "New"; + } + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + builder.Append(dispName); + + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + builder.Append("("); + if (IncludeHTMLMarkup) builder.Append("
"); + + for (int i = 0; i < m.Parameters.Count; ++i) { + if (IncludeHTMLMarkup) builder.Append("   "); + builder.Append(Convert(m.Parameters[i])); + if (i + 1 < m.Parameters.Count) { + builder.Append(", "); + } + if (IncludeHTMLMarkup) builder.Append("
"); + } + + builder.Append(')'); + + if (ShowReturnType && m.ReturnType != null && m.ReturnType.FullyQualifiedName != "System.Void") { + builder.Append(" As "); + builder.Append(Convert(m.ReturnType)); + } + + return builder.ToString(); + } + + public override string ConvertEnd(IMethod m) + { + if (m.ReturnType == null || m.ReturnType.FullyQualifiedName == "System.Void") { + return "End Sub"; + } else { + return "End Function"; + } + } + + public override string Convert(IReturnType returnType) + { + if (returnType == null) { + return String.Empty; + } + StringBuilder builder = new StringBuilder(); + + bool linkSet = false; +// TODO: #Assembly dependance: + +// if (UseLinkArrayList) { +// SharpAssemblyReturnType ret = returnType as SharpAssemblyReturnType; +// if (ret != null) { +// if (ret.UnderlyingClass != null) { +// builder.Append(""); +// linkSet = true; +// } +// } +// } + + if (returnType.FullyQualifiedName != null && typeConversionTable[returnType.FullyQualifiedName] != null) { + builder.Append(typeConversionTable[returnType.FullyQualifiedName].ToString()); + } else { + builder.Append(UseFullyQualifiedNames ? returnType.FullyQualifiedName : returnType.Name); + } + + if (linkSet) { + builder.Append(""); + } + + for (int i = 0; i < returnType.PointerNestingLevel; ++i) { + builder.Append('*'); + } + + for (int i = 0; i < returnType.ArrayCount; ++i) { + builder.Append('('); + for (int j = 1; j < returnType.ArrayDimensions[i]; ++j) { + builder.Append(','); + } + builder.Append(')'); + } + + return builder.ToString(); + } + + public override string Convert(IParameter param) + { + StringBuilder builder = new StringBuilder(); + if (ShowParameterNames) { + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + if (param.IsRef || param.IsOut) { + builder.Append("ByRef "); + } else if (param.IsParams) { + builder.Append("ByVal ParamArray "); + } else { + builder.Append("ByVal "); + } + if (IncludeHTMLMarkup) { + builder.Append(""); + } + + + builder.Append(param.Name); + builder.Append(" As "); + } + + builder.Append(Convert(param.ReturnType)); + + return builder.ToString(); + } + + public override string WrapAttribute(string attribute) + { + return "<" + attribute + ">"; + } + + public override string WrapComment(string comment) + { + return "' " + comment; + } + + public override string GetIntrinsicTypeName(string dotNetTypeName) + { + if (typeConversionTable[dotNetTypeName] != null) { + return (string)typeConversionTable[dotNetTypeName]; + } + return dotNetTypeName; + } + } + +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBBindingCompilerServices.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBBindingCompilerServices.cs new file mode 100644 index 0000000000..6a48fa95b3 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBBindingCompilerServices.cs @@ -0,0 +1,308 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Collections; +using System.IO; +using System.Diagnostics; +using System.CodeDom.Compiler; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +namespace VBBinding { + + /// + /// This class controls the compilation of VB.net files and VB.net projects + /// + public class VBBindingCompilerServices + { + + PropertyService PropertyService = (PropertyService)ServiceManager.Services.GetService(typeof(PropertyService)); + + public string GetCompiledOutputName(string fileName) + { + return Path.ChangeExtension(fileName, ".exe"); + } + + public string GetCompiledOutputName(IProject project) + { + VBProject p = (VBProject)project; + VBCompilerParameters compilerparameters = (VBCompilerParameters)p.ActiveConfiguration; + return FileUtility.GetDirectoryNameWithSeparator(compilerparameters.OutputDirectory) + compilerparameters.OutputAssembly + (compilerparameters.CompileTarget == CompileTarget.Library ? ".dll" : ".exe"); + } + + public bool CanCompile(string fileName) + { + return Path.GetExtension(fileName) == ".vb"; + } + + string GetCompilerName(string compilerVersion) + { + string runtimeDirectory = Path.Combine(FileUtility.NETFrameworkInstallRoot, compilerVersion); + if (compilerVersion.Length == 0 || compilerVersion == "Standard" || !Directory.Exists(runtimeDirectory)) { + runtimeDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); + } + return '"' + Path.Combine(runtimeDirectory, "vbc.exe") + '"'; + } + + string GenerateOptions(VBCompilerParameters compilerparameters, string outputFileName) + { + StringBuilder sb = new StringBuilder(); + + sb.Append("\"/out:");sb.Append(outputFileName);sb.Append('"');sb.Append(Environment.NewLine); + + sb.Append("/nologo");sb.Append(Environment.NewLine); + sb.Append("/utf8output");sb.Append(Environment.NewLine); + + if (compilerparameters.Debugmode) { + sb.Append("/debug+");sb.Append(Environment.NewLine); + sb.Append("/debug:full");sb.Append(Environment.NewLine); + } + + if (compilerparameters.Optimize) { + sb.Append("/optimize");sb.Append(Environment.NewLine); + } + + if (compilerparameters.OptionStrict) { + sb.Append("/optionstrict+");sb.Append(Environment.NewLine); + } + + if (compilerparameters.OptionExplicit) { + sb.Append("/optionexplicit+");sb.Append(Environment.NewLine); + } else { + sb.Append("/optionexplicit-");sb.Append(Environment.NewLine); + } + + if (compilerparameters.Win32Icon != null && compilerparameters.Win32Icon.Length > 0 && File.Exists(compilerparameters.Win32Icon)) { + sb.Append("/win32icon:");sb.Append('"');sb.Append(compilerparameters.Win32Icon);sb.Append('"');sb.Append(Environment.NewLine); + } + + if (compilerparameters.RootNamespace!= null && compilerparameters.RootNamespace.Length > 0) { + sb.Append("/rootnamespace:");sb.Append('"');sb.Append(compilerparameters.RootNamespace);sb.Append('"');sb.Append(Environment.NewLine); + } + + if (compilerparameters.DefineSymbols.Length > 0) { + sb.Append("/define:");sb.Append('"');sb.Append(compilerparameters.DefineSymbols);sb.Append('"');sb.Append(Environment.NewLine); + } + + if (compilerparameters.MainClass != null && compilerparameters.MainClass.Length > 0) { + sb.Append("/main:");sb.Append(compilerparameters.MainClass);sb.Append(Environment.NewLine); + } + + if(compilerparameters.Imports.Length > 0) { + sb.Append("/imports:");sb.Append(compilerparameters.Imports);sb.Append(Environment.NewLine); + } + + switch (compilerparameters.CompileTarget) { + case CompileTarget.Exe: + sb.Append("/target:exe"); + break; + case CompileTarget.WinExe: + sb.Append("/target:winexe"); + break; + case CompileTarget.Library: + sb.Append("/target:library"); + break; + case CompileTarget.Module: + sb.Append("/target:module"); + break; + default: + throw new NotSupportedException("unknwon compile target:" + compilerparameters.CompileTarget); + } + sb.Append(Environment.NewLine); + return sb.ToString(); + } + + public ICompilerResult CompileFile(string filename) + { + string output = ""; + string error = ""; + string exe = Path.ChangeExtension(filename, ".exe"); + VBCompilerParameters compilerparameters = new VBCompilerParameters(); + string stdResponseFileName = PropertyService.DataDirectory + Path.DirectorySeparatorChar + "vb.rsp"; + + string responseFileName = Path.GetTempFileName(); + + StreamWriter writer = new StreamWriter(responseFileName); + writer.WriteLine(GenerateOptions(compilerparameters, exe)); + writer.WriteLine('"' + filename + '"'); + writer.Close(); + + string compilerName = GetCompilerName(compilerparameters.VBCompilerVersion); + string outstr = compilerName + " \"@" + responseFileName + "\" \"@" + stdResponseFileName + "\""; + + TempFileCollection tf = new TempFileCollection (); + Executor.ExecWaitWithCapture(outstr, tf, ref output, ref error); + + ICompilerResult result = ParseOutput(tf, output); + + File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + WriteManifestFile(exe); + return result; + } + + public ICompilerResult CompileProject(IProject project) + { + VBProject p = (VBProject)project; + VBCompilerParameters compilerparameters = (VBCompilerParameters)p.ActiveConfiguration; + string exe = FileUtility.GetDirectoryNameWithSeparator(compilerparameters.OutputDirectory) + compilerparameters.OutputAssembly + (compilerparameters.CompileTarget == CompileTarget.Library ? ".dll" : ".exe"); + string responseFileName = Path.GetTempFileName(); + string stdResponseFileName = PropertyService.DataDirectory + Path.DirectorySeparatorChar + "vb.rsp"; + + foreach (ProjectFile finfo in project.ProjectFiles) { + if (Path.GetFileName(finfo.Name).ToLower() == "app.config") { + try { + File.Copy(finfo.Name, exe + ".config", true); + } catch (Exception ex) { + + MessageService.ShowError(ex); + } + break; + } + } + + StreamWriter writer = new StreamWriter(responseFileName); + writer.WriteLine(GenerateOptions(compilerparameters, exe)); + + foreach (ProjectReference lib in p.ProjectReferences) { + string fileName = lib.GetReferencedFileName(p); + writer.WriteLine("\"/r:" + fileName + "\""); + } + + // write source files and embedded resources + foreach (ProjectFile finfo in p.ProjectFiles) { + if (finfo.Subtype != Subtype.Directory) { + switch (finfo.BuildAction) { + case BuildAction.Compile: + writer.WriteLine('"' + finfo.Name + '"'); + break; + + case BuildAction.EmbedAsResource: + writer.WriteLine("\"/res:" + finfo.Name + "\""); + break; + } + } + } + + TempFileCollection tf = new TempFileCollection (); + writer.Close(); + + string output = ""; + string error = ""; + string compilerName = GetCompilerName(compilerparameters.VBCompilerVersion); + string outstr = compilerName + " \"@" + responseFileName + "\" \"@" + stdResponseFileName + "\""; + + Executor.ExecWaitWithCapture(outstr, tf, ref output, ref error); + ICompilerResult result = ParseOutput(tf, output); + project.CopyReferencesToOutputPath(false); + + File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + if (compilerparameters.CompileTarget != CompileTarget.Library) { + WriteManifestFile(exe); + } + return result; + } + + // code duplication: see C# backend : CSharpBindingCompilerManager + void WriteManifestFile(string fileName) + { + string manifestFile = fileName + ".manifest"; + if (File.Exists(manifestFile)) { + return; + } + StreamWriter sw = new StreamWriter(manifestFile); + sw.WriteLine(""); + sw.WriteLine(""); + sw.WriteLine(""); + sw.WriteLine(" "); + sw.WriteLine(" "); + sw.WriteLine(" "); + sw.WriteLine(" "); + sw.WriteLine(" "); + sw.WriteLine(""); + sw.Close(); + } + + ICompilerResult ParseOutput(TempFileCollection tf, string file) + { + StringBuilder compilerOutput = new StringBuilder(); + + StreamReader sr = File.OpenText(file); + + // skip fist whitespace line + sr.ReadLine(); + + CompilerResults cr = new CompilerResults(tf); + + while (true) { + string next = sr.ReadLine(); + compilerOutput.Append(next);compilerOutput.Append(Environment.NewLine); + if (next == null) { + break; + } + CompilerError error = new CompilerError(); + + int index = next.IndexOf(": "); + if (index < 0) { + continue; + } + + string description = null; + string errorwarning = null; + string location = null; + + string s1 = next.Substring(0, index); + string s2 = next.Substring(index + 2); + index = s2.IndexOf(": "); + + if (index == -1) { + errorwarning = s1; + description = s2; + } else { + location = s1; + s1 = s2.Substring(0, index); + s2 = s2.Substring(index + 2); + errorwarning = s1; + description = s2; + } + + if (location != null) { + int idx1 = location.LastIndexOf('('); + int idx2 = location.LastIndexOf(')'); + if (idx1 >= 0 && idx2 >= 0) { + string filename = location.Substring(0, idx1); + error.Line = Int32.Parse(location.Substring(idx1 + 1, idx2 - idx1 - 1)); + error.FileName = Path.GetFullPath(filename.Trim()); // + "\\" + Path.GetFileName(filename); + } + } + + string[] what = errorwarning.Split(' '); + error.IsWarning = what[0] == "warning"; + error.ErrorNumber = what[what.Length - 1]; + + error.ErrorText = description; + + cr.Errors.Add(error); + } + sr.Close(); + return new DefaultCompilerResult(cr, compilerOutput.ToString()); + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBBindingExecutionServices.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBBindingExecutionServices.cs new file mode 100644 index 0000000000..ab8bc30f27 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBBindingExecutionServices.cs @@ -0,0 +1,81 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; +using System.Xml; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace VBBinding +{ + /// + /// This class controls the compilation of C Sharp files and C Sharp projects + /// + public class VBBindingExecutionServices + { + + public void Execute(string filename, bool debug) + { + string exe = Path.ChangeExtension(filename, ".exe"); + DebuggerService DebuggerService = (DebuggerService)ServiceManager.Services.GetService(typeof(DebuggerService)); + if (debug) { + DebuggerService.Start(exe, Path.GetDirectoryName(exe), ""); + } else { + ProcessStartInfo psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("ComSpec"), "/c " + "\"" + exe + "\"" + " & pause"); + psi.WorkingDirectory = Path.GetDirectoryName(exe); + psi.UseShellExecute = false; + + DebuggerService.StartWithoutDebugging(psi); + } + } + + public void Execute(IProject project, bool debug) + { + VBCompilerParameters parameters = (VBCompilerParameters)project.ActiveConfiguration; + + + string directory = FileUtility.GetDirectoryNameWithSeparator(parameters.OutputDirectory); + string exe = parameters.OutputAssembly + ".exe"; + string args = parameters.CommandLineParameters; + + ProcessStartInfo psi; +// bool customStartup = false; + if (parameters.CompileTarget != CompileTarget.WinExe && parameters.PauseConsoleOutput && !debug) { +// customStartup = true; + psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("ComSpec"), "/c \"" + directory + exe + "\" " + args + " & pause"); + } else { + if (parameters.CompileTarget == CompileTarget.Library) { + + MessageService.ShowError("${res:BackendBindings.ExecutionManager.CantExecuteDLLError}"); + return; + } + + psi = new ProcessStartInfo(directory + exe); + psi.Arguments = args; + } + + psi.WorkingDirectory = Path.GetDirectoryName(directory); + psi.UseShellExecute = false; + DebuggerService DebuggerService = (DebuggerService)ServiceManager.Services.GetService(typeof(DebuggerService)); + if (debug /*&& !customStartup*/) { + DebuggerService.Start(Path.Combine(directory, exe), directory, args); + } else { + DebuggerService.StartWithoutDebugging(psi); + } + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBDOCCommand.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBDOCCommand.cs new file mode 100644 index 0000000000..6f7618c9ca --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBDOCCommand.cs @@ -0,0 +1,98 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Collections.Specialized; +using System.Windows.Forms; +using System.Reflection; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Internal.Project; + +namespace VBBinding +{ + //// + /// Provides functions to run VB.DOC and to read the configuration of VB.DOC. + /// + public class VBDOCCommand : AbstractMenuCommand + { + /// + /// Runs VB.DOC for the given project + /// + public override void Run() + { + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + VBProject project = (VBProject)projectService.CurrentSelectedProject; + VBCompilerParameters compilerParameters = (VBCompilerParameters)project.ActiveConfiguration; + + Options options = new Options(); + string extension = compilerParameters.CompileTarget == CompileTarget.Exe ? ".dll" : ".exe"; + options.AssemblyFile = Path.Combine(compilerParameters.OutputDirectory, compilerParameters.OutputAssembly) + extension; + + ArrayList files = new ArrayList(); + foreach(ProjectFile file in project.ProjectFiles) { + if(VBDOCConfigurationPanel.IsFileIncluded(file.Name, project)) { + files.Add(file.Name); + } + } + + options.Files = (string[])files.ToArray(typeof(string)); + options.GlobalImports = compilerParameters.Imports.Split(','); + options.OutputXML = compilerParameters.VBDOCOutputFile; + options.Prefix = compilerParameters.VBDOCCommentPrefix; + options.RootNamespace = compilerParameters.RootNamespace; + + ArrayList referenceDirs = new ArrayList(); + string mainDirectory = Path.GetDirectoryName(options.AssemblyFile); + + foreach(ProjectReference projectFile in project.ProjectReferences) { + if(projectFile.ReferenceType == ReferenceType.Assembly) { + string referenceDir = Path.GetDirectoryName(projectFile.Reference); + if(referenceDir.ToLower() != mainDirectory.ToLower() && referenceDirs.Contains(referenceDir) == false) { + referenceDirs.Add(referenceDir); + } + } + } + + StringCollection errors = options.Validate(); + + if(errors.Count > 0) { + string message = ""; + foreach(string description in errors) { + message += description + "\n"; + } + MessageBox.Show(message, "Invalid VB.DOC options", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + VBDOCRunner runner = new VBDOCRunner(); + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(resolve); + GuiMessageRecipient messageRecipient = new GuiMessageRecipient(); + + try { + runner.RunVBDOC(options, messageRecipient); + } catch(Exception ex) { + MessageBox.Show("Documentation generation failed:\n" + ex.Message); + } finally { + messageRecipient.Finished(); + AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(resolve); + } + + } + + Assembly resolve(object sender, ResolveEventArgs e) + { + if(e.Name.StartsWith("CommentExtractor")) { + return Assembly.GetAssembly(typeof(VBDOCRunner)); + } + return null; + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBLanguageBinding.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBLanguageBinding.cs new file mode 100644 index 0000000000..2501f28e77 --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBLanguageBinding.cs @@ -0,0 +1,86 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.Windows.Forms; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; + +namespace VBBinding +{ + public class VBLanguageBinding : ILanguageBinding + { + public const string LanguageName = "VBNET"; + + VBBindingCompilerServices compilerServices = new VBBindingCompilerServices(); + VBBindingExecutionServices executionServices = new VBBindingExecutionServices(); + + public string Language { + get { + return LanguageName; + } + } + + public void Execute(string filename, bool debug) + { + Debug.Assert(executionServices != null); + executionServices.Execute(filename, debug); + } + + public void Execute(IProject project, bool debug) + { + Debug.Assert(executionServices != null); + executionServices.Execute(project, debug); + } + + public string GetCompiledOutputName(string fileName) + { + Debug.Assert(compilerServices != null); + return compilerServices.GetCompiledOutputName(fileName); + } + + public string GetCompiledOutputName(IProject project) + { + Debug.Assert(compilerServices != null); + return compilerServices.GetCompiledOutputName(project); + } + + public bool CanCompile(string fileName) + { + Debug.Assert(compilerServices != null); + return compilerServices.CanCompile(fileName); + } + + public ICompilerResult CompileFile(string fileName) + { + Debug.Assert(compilerServices != null); + return compilerServices.CompileFile(fileName); + } + + public ICompilerResult CompileProject(IProject project) + { + Debug.Assert(compilerServices != null); + return compilerServices.CompileProject(project); + } + + public ICompilerResult RecompileProject(IProject project) + { + return CompileProject(project); + } + + public IProject CreateProject(ProjectCreateInformation info, XmlElement projectOptions) + { + return new VBProject(info, projectOptions); + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj new file mode 100644 index 0000000000..27cce051fb --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj @@ -0,0 +1,83 @@ + + + Debug + AnyCPU + 8.0.40607 + 2.0 + {6b2fd2d9-5550-49f9-ad75-bbc1cd2ae698} + NewProject + VBNetBinding + Library + 4 + False + False + OnSuccessfulBuild + + + True + True + True + True + ..\..\..\..\..\AddIns\AddIns\BackendBindings\VBNetBinding\ + False + + + True + True + True + True + ..\..\..\..\..\AddIns\AddIns\BackendBindings\VBNetBinding\ + False + + + + + + + + + ..\..\..\..\..\bin\ICSharpCode.Core.dll + False + + + ..\..\..\..\..\bin\ICSharpCode.TextEditor.dll + False + + + ..\..\..\..\..\bin\ICSharpCode.XmlForms.dll + False + + + ..\..\..\..\..\bin\SharpDevelop.Base.dll + False + + + ..\..\..\..\..\bin\ICSharpCode.NRefactory.dll + False + + + ..\..\..\..\..\AddIns\AddIns\BackendBindings\VBNetBinding\CommentExtractor.dll + True + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj.user b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj.user new file mode 100644 index 0000000000..f4a96146fe --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj.user @@ -0,0 +1,8 @@ + + + ..\..\..\..\bin\SharpDevelop.exe + + + ..\..\..\..\bin\SharpDevelop.exe + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/VBNetBinding/RequiredLibraries/CommentExtractor.dll b/src/AddIns/BackendBindings/VBNetBinding/RequiredLibraries/CommentExtractor.dll new file mode 100644 index 0000000000..2d92af90fd Binary files /dev/null and b/src/AddIns/BackendBindings/VBNetBinding/RequiredLibraries/CommentExtractor.dll differ diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Resources/WixBinding.addin b/src/AddIns/BackendBindings/WixBinding/Project/Resources/WixBinding.addin new file mode 100644 index 0000000000..a82af83af1 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Resources/WixBinding.addin @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/AssemblyInfo.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/AssemblyInfo.cs new file mode 100644 index 0000000000..bf61b90709 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("Wix Binding")] +[assembly: AssemblyDescription("Wix installer binding for #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("www.icsharpcode.net")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 Mike Krueger")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs new file mode 100644 index 0000000000..9d5cadc0da --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/CompilerParametersPanel.cs @@ -0,0 +1,39 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.WixBinding +{ + public class CompilerParametersPanel : AbstractOptionPanel + { + WixCompilerParameters compilerParameters = null; + + public override void LoadPanelContents() + { + this.compilerParameters = (WixCompilerParameters)((Properties)CustomizationObject).Get("Config"); + + System.Windows.Forms.PropertyGrid grid = new System.Windows.Forms.PropertyGrid(); + grid.Dock = DockStyle.Fill; + grid.SelectedObject = compilerParameters; + Controls.Add(grid); + } + + public override bool StorePanelContents() + { + return true; + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs new file mode 100644 index 0000000000..ce40c8ba78 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/LinkerParametersPanel.cs @@ -0,0 +1,39 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.WixBinding +{ + public class LinkerParametersPanel : AbstractOptionPanel + { + WixCompilerParameters compilerParameters = null; + + public override void LoadPanelContents() + { + this.compilerParameters = (WixCompilerParameters)((Properties)CustomizationObject).Get("Config"); + + System.Windows.Forms.PropertyGrid grid = new System.Windows.Forms.PropertyGrid(); + grid.Dock = DockStyle.Fill; + grid.SelectedObject = compilerParameters; + Controls.Add(grid); + } + + public override bool StorePanelContents() + { + return true; + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerParameters.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerParameters.cs new file mode 100644 index 0000000000..19a4c7067e --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixCompilerParameters.cs @@ -0,0 +1,31 @@ +// +// +// +// +// +// + +using System; +using System.Xml; +using System.Diagnostics; +using System.ComponentModel; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Internal.Project; + +namespace ICSharpCode.WixBinding +{ + /// + /// This class handles project specific compiler parameters + /// + public class WixCompilerParameters : AbstractProjectConfiguration + { + + public WixCompilerParameters() + { + } + public WixCompilerParameters(string name) + { + this.name = name; + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs new file mode 100644 index 0000000000..435bf91583 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs @@ -0,0 +1,51 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.ComponentModel; +using System.Xml; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; + +namespace ICSharpCode.WixBinding +{ + public class WixProject : AbstractProject + { + public override string ProjectType { + get { + return WixLanguageBinding.LanguageName; + } + } + + public WixProject() + { + } + + public override IConfiguration CreateConfiguration() + { + return new WixCompilerParameters(); + } + + public WixProject(ProjectCreateInformation info, XmlElement projectOptions) + { + if (info != null) { + Name = info.ProjectName; + Configurations.Add(CreateConfiguration("Debug")); + Configurations.Add(CreateConfiguration("Release")); + foreach (WixCompilerParameters parameter in Configurations) { + parameter.OutputDirectory = info.BinPath + Path.DirectorySeparatorChar + parameter.Name; + parameter.OutputAssembly = Name; + } + + } + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixCompilerManager.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixCompilerManager.cs new file mode 100644 index 0000000000..fc2f8e2c24 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixCompilerManager.cs @@ -0,0 +1,220 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using System.CodeDom.Compiler; +using System.Windows.Forms; + +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.WixBinding +{ + /// + /// Description of WixCompilerManager. + /// + public class WixCompilerManager + { + + + public string GetCompiledOutputName(string fileName) + { + return Path.ChangeExtension(fileName, ".msi"); + } + + public string GetCompiledOutputName(IProject project) + { + WixProject p = (WixProject)project; + WixCompilerParameters compilerparameters = (WixCompilerParameters)p.ActiveConfiguration; + string exe = FileUtility.GetDirectoryNameWithSeparator(compilerparameters.OutputDirectory) + compilerparameters.OutputAssembly + ".msi"; + return exe; + } + + public bool CanCompile(string fileName) + { + return Path.GetExtension(fileName).ToUpper() == ".WXS"; + } + + ICompilerResult Compile(WixCompilerParameters compilerparameters, string[] fileNames) + { + string output = String.Empty; + string error = String.Empty; + + string responseFileName = Path.GetTempFileName(); + + StreamWriter writer = new StreamWriter(responseFileName); + + + writer.WriteLine("-dDATADIR=\"" + PropertyService.DataDirectory + "\""); + foreach (string fileName in fileNames) { + writer.WriteLine("\"" + Path.GetFullPath(fileName) + "\""); + } + + string wixobj = Path.GetFullPath(FileUtility.GetDirectoryNameWithSeparator(compilerparameters.OutputDirectory) + compilerparameters.OutputAssembly + ".wixobj"); + writer.WriteLine("-out \"" + wixobj + "\""); + + writer.Close(); + + string compilerName = GetCompilerName(); + string outstr = compilerName + " \"@" + responseFileName + "\""; + + TempFileCollection tf = new TempFileCollection(); + Executor.ExecWaitWithCapture(outstr, Path.GetFullPath(compilerparameters.OutputDirectory), tf, ref output, ref error); + + ICompilerResult result = ParseOutput(tf, output); + + Console.WriteLine(result.CompilerOutput); + File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + return result; + } + + ICompilerResult Link(WixCompilerParameters compilerparameters, string[] fileNames) + { + string output = String.Empty; + string error = String.Empty; + + string responseFileName = Path.GetTempFileName(); + + StreamWriter writer = new StreamWriter(responseFileName); + + string wixobj = Path.GetFullPath(FileUtility.GetDirectoryNameWithSeparator(compilerparameters.OutputDirectory) + compilerparameters.OutputAssembly + ".wixobj"); + writer.WriteLine("\"" + wixobj + "\""); + string exe = Path.ChangeExtension(wixobj, ".msi"); + writer.WriteLine("-out \"" + exe + "\""); + writer.Close(); + + string linkerName = GetLinkerName(); + string outstr = linkerName + " \"@" + responseFileName + "\""; + Console.WriteLine(Path.GetFullPath(compilerparameters.OutputDirectory)); + TempFileCollection tf = new TempFileCollection(); + Executor.ExecWaitWithCapture(outstr, Path.GetFullPath(compilerparameters.OutputDirectory), tf, ref output, ref error); + + ICompilerResult result = ParseOutput(tf, output); + + File.Delete(responseFileName); + File.Delete(output); + File.Delete(error); + return result; + } + + public ICompilerResult CompileFile(string fileName, WixCompilerParameters compilerparameters) + { + compilerparameters.OutputDirectory = Path.GetDirectoryName(fileName); + compilerparameters.OutputAssembly = Path.GetFileNameWithoutExtension(fileName); + + ICompilerResult result = Compile(compilerparameters, new string[] { fileName }); + if (result.CompilerResults.Errors.Count > 0) { + return result; + } + ICompilerResult linkResult = Link(compilerparameters, new string[] { fileName }); + return new DefaultCompilerResult(linkResult.CompilerResults, result.CompilerOutput + linkResult.CompilerOutput); + } + + public ICompilerResult CompileProject(IProject project) + { + WixProject p = (WixProject)project; + WixCompilerParameters compilerparameters = (WixCompilerParameters)p.ActiveConfiguration; + + ArrayList fileNames = new ArrayList(); + + foreach (ProjectFile finfo in p.ProjectFiles) { + if (finfo.Subtype != Subtype.Directory) { + switch (finfo.BuildAction) { + case BuildAction.Compile: + fileNames.Add(finfo.Name); + break; +// case BuildAction.EmbedAsResource: +// writer.WriteLine("\"/res:" + finfo.Name + "\""); +// break; + } + } + } + + ICompilerResult result = Compile(compilerparameters, (string[])fileNames.ToArray(typeof(string))); + if (result.CompilerResults.Errors.Count > 0) { + return result; + } + return Link(compilerparameters, (string[])fileNames.ToArray(typeof(string))); + } + + string GetCompilerName() + { + return Path.Combine(Path.Combine(Application.StartupPath, "wix"), "candle.exe"); + } + + string GetLinkerName() + { + return Path.Combine(Path.Combine(Application.StartupPath, "wix"), "light.exe"); + } + + ICompilerResult ParseOutput(TempFileCollection tf, string file) + { + StringBuilder compilerOutput = new StringBuilder(); + + StreamReader sr = File.OpenText(file); + + // skip fist whitespace line + sr.ReadLine(); + + CompilerResults cr = new CompilerResults(tf); + +// // we have 2 formats for the error output the csc gives : +// Regex normalError = new Regex(@"(?.*)\((?\d+),(?\d+)\):\s+(?\w+)\s+(?[\d\w]+):\s+(?.*)", RegexOptions.Compiled); +// Regex generalError = new Regex(@"(?.+)\s+(?[\d\w]+):\s+(?.*)", RegexOptions.Compiled); +// + while (true) { + string curLine = sr.ReadLine(); + compilerOutput.Append(curLine); + compilerOutput.Append('\n'); + if (curLine == null) { + break; + } +// curLine = curLine.Trim(); +// if (curLine.Length == 0) { +// continue; +// } +// +// CompilerError error = new CompilerError(); +// +// // try to match standard errors +// Match match = normalError.Match(curLine); +// if (match.Success) { +// error.Column = Int32.Parse(match.Result("${column}")); +// error.Line = Int32.Parse(match.Result("${line}")); +// error.FileName = Path.GetFullPath(match.Result("${file}")); +// error.IsWarning = match.Result("${error}") == "warning"; +// error.ErrorNumber = match.Result("${number}"); +// error.ErrorText = match.Result("${message}"); +// } else { +// match = generalError.Match(curLine); // try to match general csc errors +// if (match.Success) { +// error.IsWarning = match.Result("${error}") == "warning"; +// error.ErrorNumber = match.Result("${number}"); +// error.ErrorText = match.Result("${message}"); +// } else { // give up and skip the line +// continue; +//// error.IsWarning = false; +//// error.ErrorText = curLine; +// } +// } +// +// cr.Errors.Add(error); + } + sr.Close(); + return new DefaultCompilerResult(cr, compilerOutput.ToString()); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixExecutionManager.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixExecutionManager.cs new file mode 100644 index 0000000000..5e2ce9f371 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixExecutionManager.cs @@ -0,0 +1,56 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; +using System.Xml; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.WixBinding +{ + /// + /// This class describes the main functionalaty of a language codon + /// + public class WixExecutionManager + { + public void Execute(string filename, bool debug) + { + string exe = Path.ChangeExtension(filename, ".msi"); + ProcessStartInfo psi = new ProcessStartInfo("\"" + exe + "\""); + psi.WorkingDirectory = Path.GetDirectoryName(exe); + psi.UseShellExecute = true; + + DebuggerService DebuggerService = (DebuggerService)ServiceManager.Services.GetService(typeof(DebuggerService)); + DebuggerService.StartWithoutDebugging(psi); + } + + public void Execute(IProject project, bool debug) + { + WixCompilerParameters parameters = (WixCompilerParameters)project.ActiveConfiguration; + + + string exe = Path.GetFullPath(Path.Combine(parameters.OutputDirectory, parameters.OutputAssembly) + ".msi"); + Console.WriteLine("EXE: " + exe); + ProcessStartInfo psi = new ProcessStartInfo("\"" + exe + "\""); + psi.WorkingDirectory = Path.GetDirectoryName(exe); + psi.UseShellExecute = true; + + DebuggerService DebuggerService = (DebuggerService)ServiceManager.Services.GetService(typeof(DebuggerService)); + DebuggerService.StartWithoutDebugging(psi); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixLanguageBinding.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixLanguageBinding.cs new file mode 100644 index 0000000000..2b32119662 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixLanguageBinding.cs @@ -0,0 +1,92 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Diagnostics; +using System.Collections; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; +using System.Xml; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.Templates; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.WixBinding +{ + public class WixLanguageBinding : ILanguageBinding + { + public const string LanguageName = "WIX"; + + WixExecutionManager executionManager = new WixExecutionManager(); + WixCompilerManager compilerManager = new WixCompilerManager(); + + public string Language { + get { + return LanguageName; + } + } + + public void Execute(string filename, bool debug) + { + Debug.Assert(executionManager != null); + executionManager.Execute(filename, debug); + } + + public void Execute(IProject project, bool debug) + { + Debug.Assert(executionManager != null); + executionManager.Execute(project, debug); + } + + public string GetCompiledOutputName(string fileName) + { + Debug.Assert(compilerManager != null); + return compilerManager.GetCompiledOutputName(fileName); + } + + public string GetCompiledOutputName(IProject project) + { + Debug.Assert(compilerManager != null); + return compilerManager.GetCompiledOutputName(project); + } + + public bool CanCompile(string fileName) + { + Debug.Assert(compilerManager != null); + return compilerManager.CanCompile(fileName); + } + + public ICompilerResult CompileFile(string fileName) + { + Debug.Assert(compilerManager != null); + WixCompilerParameters param = new WixCompilerParameters(); + param.OutputAssembly = Path.ChangeExtension(fileName, ".msi"); + return compilerManager.CompileFile(fileName, param); + } + + public ICompilerResult CompileProject(IProject project) + { + Debug.Assert(compilerManager != null); + return compilerManager.CompileProject(project); + } + + public ICompilerResult RecompileProject(IProject project) + { + return CompileProject(project); + } + + public IProject CreateProject(ProjectCreateInformation info, XmlElement projectOptions) + { + return new WixProject(info, projectOptions); + } + } +} diff --git a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj new file mode 100644 index 0000000000..7cd09212f4 --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.40607 + 2.0 + {e1b288a2-08ee-4318-8bbb-8ab72c69e33e} + ICSharpCode.WixBinding + WixBinding + Library + 4 + False + False + OnSuccessfulBuild + + + True + True + True + True + ..\..\..\..\..\AddIns\AddIns\BackendBindings\WixBinding\ + True + + + True + True + True + True + ..\..\..\..\..\AddIns\AddIns\BackendBindings\WixBinding\ + False + + + + + + + + + ..\..\..\..\..\bin\ICSharpCode.Core.dll + False + + + ..\..\..\..\..\bin\ICSharpCode.TextEditor.dll + False + + + ..\..\..\..\..\bin\ICSharpCode.XmlForms.dll + False + + + ..\..\..\..\..\bin\SharpDevelop.Base.dll + True + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj.user b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj.user new file mode 100644 index 0000000000..be2479913f --- /dev/null +++ b/src/AddIns/BackendBindings/WixBinding/Project/WixBinding.csproj.user @@ -0,0 +1,6 @@ + + + ..\..\..\..\bin\SharpDevelop.exe + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Resources/AssemblyScout.addin b/src/AddIns/DisplayBindings/AssemblyScout/Project/Resources/AssemblyScout.addin new file mode 100644 index 0000000000..ffe02bb0c6 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Resources/AssemblyScout.addin @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Resources/AssemblyScoutOptions.xfrm b/src/AddIns/DisplayBindings/AssemblyScout/Project/Resources/AssemblyScoutOptions.xfrm new file mode 100644 index 0000000000..0fc2a4ccf6 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Resources/AssemblyScoutOptions.xfrm @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyInfo.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyInfo.cs new file mode 100644 index 0000000000..2ff1ec1ff0 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyInfo.cs @@ -0,0 +1,29 @@ +// +// +// +// +// +// + +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle("Objectbrowser for SharpDevelop")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] + +// the current contributor comes first in the copyright, the former second +// and so on :) +// SharpDevelop IS OUR project not MINE :) +// Mike +[assembly: AssemblyCopyright("Georg Brandl, Markus Palme, Mike Krüger")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: AssemblyVersion("2.0.0.1")] + +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutBinding.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutBinding.cs new file mode 100644 index 0000000000..013bb2d35a --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutBinding.cs @@ -0,0 +1,51 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Resources; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using UI = WeifenLuo.WinFormsUI; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + /////////////////////////////////////////// + // AssemblyScoutBinding class + /////////////////////////////////////////// + public class AssemblyScoutBinding : IDisplayBinding + { + public bool CanCreateContentForFile(string fileName) + { + return Path.GetExtension(fileName).ToUpper() == ".DLL" || + Path.GetExtension(fileName).ToUpper() == ".EXE"; + } + + public bool CanCreateContentForLanguage(string language) + { + return false; + } + + + public IViewContent CreateContentForFile(string fileName) + { + AssemblyScoutViewContent wrapper = new AssemblyScoutViewContent(); + wrapper.Load(fileName); + return wrapper; + } + + public IViewContent CreateContentForLanguage(string language, string content) + { + return null; + } + } + +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutCommand.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutCommand.cs new file mode 100644 index 0000000000..43b61fe066 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutCommand.cs @@ -0,0 +1,25 @@ +// +// +// +// +// +// + +using System; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class AssemblyScoutCommand : AbstractMenuCommand + { + + public override void Run() { + AssemblyScoutViewContent vw; + vw = new AssemblyScoutViewContent(); + vw.LoadStdAssemblies(); + vw.LoadRefAssemblies(); + WorkbenchSingleton.Workbench.ShowView(vw); + } + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutCommands.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutCommands.cs new file mode 100644 index 0000000000..a30ef7ef13 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutCommands.cs @@ -0,0 +1,84 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Resources; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Commands; + +using ICSharpCode.SharpDevelop.AddIns.AssemblyScout; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout.Commands +{ + public class LoadAssemblyCommand : AssemblyScoutCommand + { + public override void Run() + { + AssemblyScoutViewContent vc = GetViewContent(); + if (vc == null) return; + + vc.Tree.LoadAssembly(null, null); + } + } + + public class LoadRefAssembliesCommand : AssemblyScoutCommand + { + public override void Run() + { + AssemblyScoutViewContent vc = GetViewContent(); + if (vc == null) return; + + vc.LoadRefAssemblies(); + } + + } + + public class LoadStdAssembliesCommand : AssemblyScoutCommand + { + public override void Run() + { + AssemblyScoutViewContent vc = GetViewContent(); + if (vc == null) return; + + vc.LoadStdAssemblies(); + } + + } + + public class BackCommand : AssemblyScoutCommand + { + public override void Run() + { + AssemblyScoutViewContent vc = GetViewContent(); + if (vc == null) return; + + vc.Tree.GoBack(); + } + + } + + public class AssemblyScoutCommand : AbstractMenuCommand + { + protected AssemblyScoutViewContent GetViewContent() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + + return (window.ViewContent as AssemblyScoutViewContent); + } + + public override void Run() + { + + } + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutOptionPanel.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutOptionPanel.cs new file mode 100644 index 0000000000..7d209dee58 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutOptionPanel.cs @@ -0,0 +1,71 @@ +// +// +// +// +// +// + +using System; +using System.Diagnostics; +using System.Reflection; +using System.IO; +using System.Drawing; +using System.Collections; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.Core; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class AssemblyScoutOptionPanel : AbstractOptionPanel + { + Control[] combos = new Control[] {}; + + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("AssemblyScoutOptions.xfrm")); + + combos = new Control[] { + ControlDictionary["privateTypesBox"], + ControlDictionary["internalTypesBox"], + ControlDictionary["privateMembersBox"], + ControlDictionary["internalMembersBox"] + }; + + foreach(ComboBox combo in combos) { + Debug.Assert(combo != null); + combo.Items.Add(StringParser.Parse("${res:Dialog.Options.IDEOptions.AssemblyScout.Show}")); + combo.Items.Add(StringParser.Parse("${res:Dialog.Options.IDEOptions.AssemblyScout.GreyOut}")); + combo.Items.Add(StringParser.Parse("${res:Dialog.Options.IDEOptions.AssemblyScout.Hide}")); + + combo.SelectedIndex = PropertyService.Get("AddIns.AssemblyScout." + combo.Name, 1); + } + + ((CheckBox)ControlDictionary["showReturnTypesBox"]).Checked + = PropertyService.Get("AddIns.AssemblyScout.ShowReturnTypes", true); + ((CheckBox)ControlDictionary["showResourcePreviewBox"]).Checked + = PropertyService.Get("AddIns.AssemblyScout.ShowResPreview", true); + ((CheckBox)ControlDictionary["showSpecialMethodsBox"]).Checked + = PropertyService.Get("AddIns.AssemblyScout.ShowSpecialMethods", true); + } + + public override bool StorePanelContents() + { + PropertyService.Set("AddIns.AssemblyScout.ShowReturnTypes", ((CheckBox)ControlDictionary["showReturnTypesBox"]).Checked); + PropertyService.Set("AddIns.AssemblyScout.ShowResPreview", ((CheckBox)ControlDictionary["showResourcePreviewBox"]).Checked); + PropertyService.Set("AddIns.AssemblyScout.ShowSpecialMethods", ((CheckBox)ControlDictionary["showSpecialMethodsBox"]).Checked); + + foreach(ComboBox combo in combos) { + PropertyService.Set("AddIns.AssemblyScout." + combo.Name, combo.SelectedIndex); + } + + return true; + } + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutViewContent.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutViewContent.cs new file mode 100644 index 0000000000..96492da1c0 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyScoutViewContent.cs @@ -0,0 +1,306 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Resources; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.Core; +using ICSharpCode.Core; +using UI = WeifenLuo.WinFormsUI; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + /////////////////////////////////////////// + // AssemblyScoutViewContent Class + /////////////////////////////////////////// + public class AssemblyScoutViewContent : AbstractViewContent + { + public ResourceService ress = (ResourceService)ServiceManager.Services.GetService(typeof(ResourceService)); + + public UI.DockPanel leftTabs, rightTabs; + Control control = null; + AssemblyTree tree = null; + + public override Control Control { + get { + return control; + } + } + + public AssemblyTree Tree { + get { + return tree; + } + } + + string untitledName = ""; + public override string UntitledName { + get { + return untitledName; + } + set { + untitledName = value; + } + } + +// public override string TitleName { +// get { +// return filename; +// } +// set { +// filename = value; +// OnTitleNameChanged(null); +// } +// } + + public override string TabPageText { + get { + return "Assemblies"; + } + } + + public override bool IsDirty { + get { + return false; + } + set { + } + } + + public override bool IsViewOnly { + get { + return true; + } + } + + IWorkbenchWindow workbenchWindow; + public override IWorkbenchWindow WorkbenchWindow { + get { + return workbenchWindow; + } + set { + workbenchWindow = value; + if (FileName == "") { + workbenchWindow.Title = ress.GetString("ObjectBrowser.AssemblyScout"); + } else { + workbenchWindow.Title = FileName; + } + } + } + + public override void RedrawContent() + { + } + + public override void Dispose() + { + try { + foreach(Control ctl in Control.Controls) { + ctl.Dispose(); + } + } catch { + return; + } + } + + public void SaveFile() + { + } + + public bool CanCreateContentForFile(string fileName) + { + return Path.GetExtension(fileName) == ".dll" || Path.GetExtension(fileName) == ".exe"; + } + + public bool CanCreateContentForLanguage(string language) + { + return false; + } + + + public IViewContent CreateContentForFile(string fileName) + { + Load(fileName); + return this; + } + + public void Undo() + { + } + + public void Redo() + { + } + + public IViewContent CreateContentForLanguage(string language, string content) + { + return null; + } + + public override void Save() + { + } + + public override void Save(string filename) + { + } + + public override void Load(string filename) + { + tree.LoadFile(filename); + this.FileName = filename; + this.TitleName = Path.GetFileName(filename); + } + + + + public AssemblyScoutViewContent() + { + Panel panel = new Panel(); + panel.Dock = DockStyle.Fill; + + leftTabs = new UI.DockPanel(); + leftTabs.Dock = DockStyle.Left; + leftTabs.Width = 400; + leftTabs.AllowDrop = false; + leftTabs.AllowRedocking = false; + + AssemblyTree assemblyTree = new AssemblyTree(this); + this.tree = assemblyTree; + + UI.DockContent treeviewpage = new UI.DockContent(); + treeviewpage.Text = ress.GetString("ObjectBrowser.Tree"); + treeviewpage.Icon = ResourceService.GetIcon("Icons.16x16.Class"); + treeviewpage.DockPadding.All = 8; + treeviewpage.Controls.Add(assemblyTree); + treeviewpage.DockableAreas = UI.DockAreas.Document; + treeviewpage.CloseButton = false; + treeviewpage.Show(leftTabs); + + UI.DockContent indexviewpage = new UI.DockContent(); + indexviewpage.Text = ress.GetString("ObjectBrowser.Search"); + indexviewpage.Icon = ResourceService.GetIcon("Icons.16x16.FindIcon"); + SearchPanel SearchPanel = new SearchPanel(assemblyTree); + SearchPanel.ParentDisplayInfo = this; + indexviewpage.DockPadding.All = 8; + indexviewpage.Controls.Add(SearchPanel); + indexviewpage.DockableAreas = UI.DockAreas.Document; + indexviewpage.CloseButton = false; + indexviewpage.Show(leftTabs); + + Splitter vsplitter = new Splitter(); + vsplitter.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + + vsplitter.Location = new System.Drawing.Point(0, 200); + vsplitter.TabIndex = 5; + vsplitter.TabStop = false; + vsplitter.Size = new System.Drawing.Size(3, 273); + vsplitter.Dock = DockStyle.Left; + + + rightTabs = new UI.DockPanel(); + rightTabs.Dock = DockStyle.Fill; + rightTabs.AllowDrop = false; + rightTabs.AllowRedocking = false; + + UI.DockContent memberpage = new UI.DockContent(); + memberpage.Text = ress.GetString("ObjectBrowser.Info"); + memberpage.Icon = ResourceService.GetIcon("Icons.16x16.Information"); + memberpage.DockPadding.All = 8; + memberpage.Controls.Add(new InfoView(assemblyTree)); + memberpage.DockableAreas = UI.DockAreas.Document; + memberpage.CloseButton = false; + memberpage.Show(rightTabs); + + UI.DockContent ildasmviewpage = new UI.DockContent(); + ildasmviewpage.Text = ress.GetString("ObjectBrowser.Disasm"); + ildasmviewpage.Icon = ResourceService.GetIcon("Icons.16x16.ILDasm"); + ildasmviewpage.DockPadding.All = 8; + ildasmviewpage.Controls.Add(new ILDasmView(assemblyTree)); + ildasmviewpage.DockableAreas = UI.DockAreas.Document; + ildasmviewpage.CloseButton = false; + ildasmviewpage.Show(rightTabs); + + UI.DockContent sourceviewpage = new UI.DockContent(); + sourceviewpage.Text = ress.GetString("ObjectBrowser.Source"); + sourceviewpage.Icon = ResourceService.GetIcon("Icons.16x16.TextFileIcon"); + sourceviewpage.DockPadding.All = 8; + sourceviewpage.Controls.Add(new SourceView(assemblyTree)); + sourceviewpage.DockableAreas = UI.DockAreas.Document; + sourceviewpage.CloseButton = false; + sourceviewpage.Show(rightTabs); + + UI.DockContent xmlviewpage = new UI.DockContent(); + xmlviewpage.Text = ress.GetString("ObjectBrowser.XML"); + xmlviewpage.Icon = ResourceService.GetIcon("Icons.16x16.XMLFileIcon"); + xmlviewpage.DockPadding.All = 8; + xmlviewpage.Controls.Add(new XmlView(assemblyTree)); + xmlviewpage.DockableAreas = UI.DockAreas.Document; + xmlviewpage.CloseButton = false; + xmlviewpage.Show(rightTabs); + + UI.DockContent extproppage = new UI.DockContent(); + extproppage.Text = ress.GetString("ObjectBrowser.Extended"); + extproppage.Icon = ResourceService.GetIcon("Icons.16x16.Property"); + extproppage.DockPadding.All = 8; + extproppage.Controls.Add(new ExtendedPropsPanel(assemblyTree)); + extproppage.DockableAreas = UI.DockAreas.Document; + extproppage.CloseButton = false; + extproppage.Show(rightTabs); + + panel.Controls.Add(rightTabs); + panel.Controls.Add(vsplitter); + panel.Controls.Add(leftTabs); + + treeviewpage.Activate(); + memberpage.Activate(); + + this.control = panel; + this.TitleName = ress.GetString("ObjectBrowser.AssemblyScout"); + } + + public void LoadStdAssemblies() { + //try { + tree.AddAssembly(SA.SharpAssembly.Load("mscorlib")); + tree.AddAssembly(SA.SharpAssembly.Load("System")); + tree.AddAssembly(SA.SharpAssembly.Load("System.Xml")); + tree.AddAssembly(SA.SharpAssembly.Load("System.Windows.Forms")); + tree.AddAssembly(SA.SharpAssembly.Load("System.Drawing")); + tree.AddAssembly(SA.SharpAssembly.Load("System.Data")); + tree.AddAssembly(SA.SharpAssembly.Load("System.Design")); + tree.AddAssembly(SA.SharpAssembly.Load("System.Web")); + //} catch {} + } + + public void LoadRefAssemblies() { + IProjectService projectService = (IProjectService)ServiceManager.Services.GetService(typeof(IProjectService)); + try { + if (projectService.CurrentSelectedProject == null) return; + foreach(ProjectReference pr in projectService.CurrentSelectedProject.ProjectReferences) { + if (pr.ReferenceType == ReferenceType.Project || pr.ReferenceType == ReferenceType.Typelib) continue; + if (!tree.IsAssemblyLoaded(pr.GetReferencedFileName(null))) { + try { + tree.LoadFile(pr.GetReferencedFileName(null)); + } catch (Exception) { + //MessageBox.Show("Object Browser error:\nError loading assembly " + pr.GetReferencedFileName(null) + ".", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + } + } catch (Exception) {} + + } + + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyTree.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyTree.cs new file mode 100644 index 0000000000..04216f4998 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/AssemblyTree.cs @@ -0,0 +1,657 @@ +// +// +// +// +// +// + +using System; +using System.Xml; +using System.Collections; +using System.IO; +using System.Drawing; +using System.Drawing.Printing; +using System.Windows.Forms; +using System.Threading; +using System.Resources; +using System.Text; + +using Microsoft.Win32; +using System.Diagnostics; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Internal.Project.Collections; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Internal.ExternalTool; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class AssemblyTree : TreeView + { + static AmbienceService AmbienceService = (AmbienceService)ServiceManager.Services.GetService(typeof(AmbienceService)); + public static IAmbience CurrentAmbience = AmbienceService.CurrentAmbience; + + public ResourceService ress = (ResourceService)ServiceManager.Services.GetService(typeof(ResourceService)); + + ArrayList assemblies = new ArrayList(); + AssemblyScoutViewContent _parent; + PropertyService propSvc; + + public ShowOptions showInternalTypes, showInternalMembers; + public ShowOptions showPrivateTypes, showPrivateMembers; + + public bool showSpecial = false; + + MenuItem mnuBack; + MenuItem mnuLoadAsm, mnuLoadStd, mnuLoadRef; + //MenuItem mnuShowPrivTypes, mnuShowIntTypes; + //MenuItem mnuShowPrivMem, mnuShowIntMem, mnuShowSpecial; + MenuItem mnuRemAsm, mnuCopyTree, mnuSaveRes, mnuJump, mnuOpenRef, mnuDisAsm; + + Stack history = new Stack(); + bool histback = false; + + AssemblyTreeNode selnode; + + public event EventHandler Changed; + + public AssemblyTree(AssemblyScoutViewContent parent) : base() + { + if (Changed != null) {} // only to prevent these pesky compiler warning :) M.K. + + Dock = DockStyle.Fill; + + string resPrefix = "ObjectBrowser.Menu."; + + + propSvc = (PropertyService)ServiceManager.Services.GetService(typeof(PropertyService)); + + this.ImageList = ClassBrowserIconService.ImageList; + + LabelEdit = false; + HotTracking = false; + AllowDrop = true; + HideSelection = false; + //Sorted = true; + + mnuBack = new MenuItem(ress.GetString(resPrefix + "GoBack"), new EventHandler(Back)); + mnuLoadAsm = new MenuItem(ress.GetString(resPrefix + "LoadAssembly"), new EventHandler(LoadAssembly)); + mnuLoadStd = new MenuItem(ress.GetString(resPrefix + "LoadStd"), new EventHandler(LoadStdAssemblies)); + mnuLoadRef = new MenuItem(ress.GetString(resPrefix + "LoadRef"), new EventHandler(LoadRefAssemblies)); + //mnuShowPrivTypes = new MenuItem(ress.GetString(resPrefix + "ShowPrivTypes"), new EventHandler(ShowPrivTypesEvt)); + //mnuShowIntTypes = new MenuItem(ress.GetString(resPrefix + "ShowIntTypes"), new EventHandler(ShowIntTypesEvt)); + //mnuShowPrivMem = new MenuItem(ress.GetString(resPrefix + "ShowPrivMem"), new EventHandler(ShowPrivMemEvt)); + //mnuShowIntMem = new MenuItem(ress.GetString(resPrefix + "ShowIntMem"), new EventHandler(ShowIntMemEvt)); + //mnuShowSpecial = new MenuItem(ress.GetString(resPrefix + "ShowSpecial"), new EventHandler(ShowSpecialEvt)); + mnuRemAsm = new MenuItem(ress.GetString(resPrefix + "RemoveAsm"), new EventHandler(RemoveAssembly)); + mnuCopyTree = new MenuItem(ress.GetString(resPrefix + "CopyTree"), new EventHandler(CopyAssemblyTree)); + mnuSaveRes = new MenuItem(ress.GetString(resPrefix + "SaveRes"), new EventHandler(SaveCurrentResource)); + mnuJump = new MenuItem(ress.GetString(resPrefix + "JumpType"), new EventHandler(JumpLink)); + mnuOpenRef = new MenuItem(ress.GetString(resPrefix + "OpenRef"), new EventHandler(OpenReference)); + mnuDisAsm = new MenuItem(ress.GetString(resPrefix + "DisasmToFile"), new EventHandler(DisAssembly)); + + ContextMenu = new ContextMenu(new MenuItem[] { + mnuBack, + new MenuItem("-"), + mnuLoadAsm, + mnuLoadStd, + mnuLoadRef, + new MenuItem("-"), + // mnuShowPrivTypes, + // mnuShowIntTypes, + // new MenuItem("-"), + // mnuShowPrivMem, + // mnuShowIntMem, + // mnuShowSpecial, + // new MenuItem("-"), + mnuRemAsm, + mnuCopyTree, + mnuSaveRes, + mnuJump, + mnuOpenRef, + mnuDisAsm + }); + + showPrivateTypes = (ShowOptions)propSvc.Get("AddIns.AssemblyScout.privateTypesBox", 1); + showInternalTypes = (ShowOptions)propSvc.Get("AddIns.AssemblyScout.internalTypesBox", 1); + showPrivateMembers = (ShowOptions)propSvc.Get("AddIns.AssemblyScout.privateMembersBox", 1); + showInternalMembers = (ShowOptions)propSvc.Get("AddIns.AssemblyScout.internalMembersBox", 1); + showSpecial = propSvc.Get("AddIns.AssemblyScout.ShowSpecialMethods", false); + + _parent = parent; + } + + public ArrayList Assemblies { + get { + return assemblies; + } + } + + public PrintDocument PrintDocument { + get { + return null; + } + } + + public bool WriteProtected { + get { + return false; + } + set { + } + } + + public void LoadFile(string fileName) + { + AddAssembly(SA.SharpAssembly.LoadFrom(fileName)); + } + + public bool IsAssemblyLoaded(string filename) + { + try { + foreach(SA.SharpAssembly asm in assemblies) { + if (asm.Location == filename) return true; + } + } catch { + } + return false; + } + + public void SaveFile(string filename) + { + } + + public void AddAssembly(SA.SharpAssembly assembly) + { + try { + if (IsAssemblyLoaded(assembly.Location)) return; + + assemblies.Add(assembly); + + TreeNode node = new FolderNode(System.IO.Path.GetFileNameWithoutExtension(assembly.Location), assembly, NodeType.Assembly, 0, 1); + Nodes.Add(node); + PopulateTree((AssemblyTreeNode)node); + } catch (Exception e) { + MessageBox.Show("Could not load assembly: " + e.ToString()); + } + } + + public void RePopulateTreeView() + { + foreach (AssemblyTreeNode node in Nodes) { + node.Populate(showPrivateTypes, showInternalTypes); + PopulateTree(node); + } + } + + public void PopulateTree(AssemblyTreeNode parentnode) + { + if (!parentnode.Populated) + parentnode.Populate(showPrivateTypes, showInternalTypes); + + foreach (AssemblyTreeNode node in parentnode.Nodes) { + if (!node.Populated) { + node.Populate(showPrivateTypes, showInternalTypes); + } + PopulateTree(node); + } + } + + public void GoToMember(IMember member) + { + string paramtext = ""; + + TypeNode typenode = GetTypeNode((SA.SharpAssembly)member.DeclaringType.DeclaredIn, member.DeclaringType.Namespace, member.DeclaringType.FullyQualifiedName); + if (typenode == null) return; + + bool isEnum = false; + if (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Enum) isEnum = true; + + paramtext = MemberNode.GetShortMemberName(member, isEnum); + + if (!typenode.MembersPopulated) { + typenode.PopulateMembers(showPrivateMembers, showInternalMembers, showSpecial); + } + + TreeNode foundnode = typenode.GetNodeFromChildren(paramtext); + if (foundnode == null) return; + + foundnode.EnsureVisible(); + SelectedNode = foundnode; + } + + public void GoToNamespace(SA.SharpAssembly asm, string name) + { + foreach (AssemblyTreeNode node in Nodes) { + SA.SharpAssembly assembly = (SA.SharpAssembly)node.Attribute; + if (asm.FullName == assembly.FullName) { + + // curnode contains Filename node + AssemblyTreeNode curnode = (AssemblyTreeNode)node.GetNodeFromChildren(Path.GetFileName(assembly.Location)); + + TreeNode tnode = curnode.GetNodeFromChildren(name); // get namespace node + if (tnode == null) return; + tnode.EnsureVisible(); + SelectedNode = tnode; + return; + } + } + + // execute if assembly containing the type is not loaded + AddAssembly(asm); + GoToNamespace(asm, name); + } + + private TypeNode GetTypeNode(SA.SharpAssembly targetAssembly, string Namespace, string FullName) + { + foreach (AssemblyTreeNode node in Nodes) { + SA.SharpAssembly assembly = (SA.SharpAssembly)node.Attribute; + if (targetAssembly.FullName == assembly.FullName) { + + // curnode contains Filename node + AssemblyTreeNode curnode = (AssemblyTreeNode)node.GetNodeFromChildren(Path.GetFileName(assembly.Location)); + + TreeNode path; + + if (Namespace == null || Namespace == "") { + path = curnode; + } else { + TreeNode tnode = curnode.GetNodeFromChildren(Namespace); // get namespace node + if (tnode == null) { + return null; // TODO : returns null if the tree isn't up to date. + } else { + path = tnode; + } + } + + string nodename = FullName.Substring(Namespace.Length + 1); + + TreeNode foundnode = node.GetNodeFromCollection(path.Nodes, nodename); + return (TypeNode)foundnode; + } + } + + // execute if assembly containing the type is not loaded + AddAssembly(targetAssembly); + return GetTypeNode(targetAssembly, Namespace, FullName); + + } + + public void GoToType(IClass type) + { + AssemblyTreeNode node = GetTypeNode((SA.SharpAssembly)type.DeclaredIn, type.Namespace, type.FullyQualifiedName); + if (node == null) { + Console.WriteLine("No node for type found"); + return; + } + + node.EnsureVisible(); + SelectedNode = node; + } + + public void GoToType(IReturnType type) + { + AssemblyTreeNode node = GetTypeNode((SA.SharpAssembly)type.DeclaredIn, type.Namespace, type.FullyQualifiedName); + if (node == null) return; + + node.EnsureVisible(); + SelectedNode = node; + } + + protected override void OnDoubleClick(EventArgs e) + { + AssemblyTreeNode rn = (AssemblyTreeNode)SelectedNode; + if (rn == null) + return; + switch (rn.Type) { + + case NodeType.Link: // clicked on link, jump to link. + if (rn.Attribute is Type) { + GoToType((IClass)rn.Attribute); + } + break; + + case NodeType.Reference: // clicked on assembly reference, open assembly + // check if the assembly is open + RefNodeAttribute attr = (RefNodeAttribute)rn.Attribute; + OpenAssemblyByName(attr); + break; + } + } + + public void OpenAssemblyByName(RefNodeAttribute attr) + { + foreach (AssemblyTreeNode node in Nodes) { + if (node.Type == NodeType.Assembly) { + if (attr.RefName.FullName == ((SA.SharpAssembly)node.Attribute).FullName) { // if yes, return + node.EnsureVisible(); + SelectedNode = node; + return; + } + } + } + try { + AddAssembly(SA.SharpAssembly.Load(attr.RefName.FullName, System.IO.Path.GetDirectoryName(attr.Assembly.Location))); + OpenAssemblyByName(attr); + } catch(Exception ex) { + MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.LoadError"), attr.RefName.Name, ex.Message), ress.GetString("Global.ErrorText"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + + protected override void OnBeforeCollapse(TreeViewCancelEventArgs e) + { + base.OnBeforeCollapse(e); + ((AssemblyTreeNode)e.Node).OnCollapse(); + } + + protected override void OnBeforeExpand(TreeViewCancelEventArgs e) + { + base.OnBeforeExpand(e); + + AssemblyTreeNode rn = (AssemblyTreeNode)e.Node; + if (!rn.Populated) + rn.Populate(showPrivateTypes, showInternalTypes); + + if (e.Node is TypeNode) { + TypeNode tn = e.Node as TypeNode; + + if (!tn.MembersPopulated) + tn.PopulateMembers(showPrivateMembers, showInternalMembers, showSpecial); + } + + ((AssemblyTreeNode)e.Node).OnExpand(); + } + + protected override void OnMouseDown(MouseEventArgs ev) + { + base.OnMouseDown(ev); + + AssemblyTreeNode node = GetNodeAt(ev.X, ev.Y) as AssemblyTreeNode; + if (node != null) { + if (ev.Button == MouseButtons.Right) histback = true; + SelectedNode = node; + histback = false; + mnuRemAsm.Visible = (node.Type == NodeType.Assembly); + mnuDisAsm.Visible = (node.Type == NodeType.Assembly); + mnuCopyTree.Visible = (node.Type == NodeType.Library); + mnuSaveRes.Visible = (node.Type == NodeType.Resource); + mnuJump.Visible = (node.Type == NodeType.Link); + mnuOpenRef.Visible = (node.Type == NodeType.Reference); + selnode = node; + } else { + mnuRemAsm.Visible = false; + mnuDisAsm.Visible = false; + mnuCopyTree.Visible = false; + mnuSaveRes.Visible = false; + mnuJump.Visible = false; + mnuOpenRef.Visible = false; + selnode = null; + } + + } + + public void LoadAssembly(object sender, EventArgs e) + { + using (SelectReferenceDialog selDialog = new SelectReferenceDialog(new TempProject())) { + if (selDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + + foreach (ProjectReference refInfo in selDialog.ReferenceInformations) { + if (refInfo.ReferenceType == ReferenceType.Typelib) continue; + if (refInfo.ReferenceType == ReferenceType.Project) continue; + + if (!IsAssemblyLoaded(refInfo.GetReferencedFileName(null))) { + try { + LoadFile(refInfo.GetReferencedFileName(null)); + } catch (Exception) {} + } + } + } + } + } + + void LoadStdAssemblies(object sender, EventArgs e) + { + _parent.LoadStdAssemblies(); + } + + void LoadRefAssemblies(object sender, EventArgs e) + { + _parent.LoadRefAssemblies(); + } + /* + void ShowPrivTypesEvt(object sender, EventArgs e) + { + showPrivateTypes = !showPrivateTypes; + propSvc.Set("ObjectBrowser.ShowPrivTypes", showPrivateTypes); + mnuShowPrivTypes.Checked = showPrivateTypes; + RePopulateTreeView(); + } + + void ShowIntTypesEvt(object sender, EventArgs e) + { + showInternalTypes = !showInternalTypes; + propSvc.Set("ObjectBrowser.ShowIntTypes", showInternalTypes); + mnuShowIntTypes.Checked = showInternalTypes; + RePopulateTreeView(); + } + + void ShowPrivMemEvt(object sender, EventArgs e) + { + showPrivateMembers = !showPrivateMembers; + propSvc.Set("ObjectBrowser.ShowPrivMembers", showPrivateMembers); + mnuShowPrivMem.Checked = showPrivateMembers; + RePopulateTreeView(); + } + + void ShowIntMemEvt(object sender, EventArgs e) + { + showInternalMembers = !showInternalMembers; + propSvc.Set("ObjectBrowser.ShowIntMembers", showInternalMembers); + mnuShowIntMem.Checked = showInternalMembers; + RePopulateTreeView(); + } + + void ShowSpecialEvt(object sender, EventArgs e) + { + showSpecial = !showSpecial; + propSvc.Set("ObjectBrowser.ShowSpecialMethods", showSpecial); + mnuShowSpecial.Checked = showSpecial; + RePopulateTreeView(); + } + */ + + public void RemoveAssembly(object sender, EventArgs e) + { + if (selnode == null) return; + if (selnode.Type != NodeType.Assembly) return; + + assemblies.Remove((SA.SharpAssembly)selnode.Attribute); + selnode.Remove(); + } + + public void CopyAssemblyTree(object sender, EventArgs e) + { + if (selnode == null) return; + if (selnode.Type != NodeType.Library) return; + + StringBuilder stb = new StringBuilder(); + + stb.Append(selnode.Text + "\n"); + GetSubNodeText(selnode, stb, 1); + + Clipboard.SetDataObject(stb.ToString(), true); + + } + + private static void GetSubNodeText(TreeNode node, StringBuilder build, int indentLevel) { + foreach (TreeNode tn in node.Nodes) { + build.Append('\t', indentLevel); + build.Append(tn.Text + "\n"); + GetSubNodeText(tn, build, indentLevel + 1); + } + } + + + + public void DisAssembly(object sender, EventArgs e) + { + if (selnode == null) return; + if (selnode.Type != NodeType.Assembly) return; + + SA.SharpAssembly asm = (SA.SharpAssembly)selnode.Attribute; + + SaveFileDialog sdialog = new SaveFileDialog(); + sdialog.AddExtension = true; + sdialog.FileName = asm.Name; + sdialog.Filter = "IL files (*.il)|*.il"; + sdialog.DefaultExt = ".il"; + sdialog.InitialDirectory = Path.GetDirectoryName(asm.Location); + + DialogResult dr = sdialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + sdialog.Dispose(); + if(dr != DialogResult.OK) return; + + try { + string args = '"' + asm.Location + "\" /NOBAR /OUT=\"" + sdialog.FileName + "\" /ALL "; + RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\.NETFramework"); + string cmd = (string)regKey.GetValue("sdkInstallRoot"); + if (cmd == null) cmd = (string)regKey.GetValue("sdkInstallRootv1.1"); + ProcessStartInfo psi = new ProcessStartInfo(FileUtility.GetDirectoryNameWithSeparator(cmd) + + "bin\\ildasm.exe", args); + + psi.RedirectStandardError = true; + psi.RedirectStandardOutput = true; + psi.RedirectStandardInput = true; + psi.UseShellExecute = false; + psi.CreateNoWindow = true; + + Process process = Process.Start(psi); + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.ILDasmOutput"), output)); + } catch(Exception ex) { + MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.ILDasmError"), ex.ToString())); + } + } + + public void SaveCurrentResource(object sender, EventArgs e) + { + if (selnode == null) return; + if (selnode.Type != NodeType.Resource) return; + + SA.SharpAssembly asm = (SA.SharpAssembly)selnode.Attribute; + SaveResource(asm, selnode.Text); + + } + + public void SaveResource(SA.SharpAssembly asm, string name) + { + SaveFileDialog sdialog = new SaveFileDialog(); + sdialog.AddExtension = true; + sdialog.FileName = name; + sdialog.Filter = ress.GetString("ObjectBrowser.Filters.Binary") + "|*.*"; + sdialog.DefaultExt = ".bin"; + + DialogResult dr = sdialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + sdialog.Dispose(); + if(dr != DialogResult.OK) return; + + try { + byte[] res = asm.GetManifestResource(name); + FileStream fstr = new FileStream(sdialog.FileName, FileMode.Create); + BinaryWriter wr = new BinaryWriter(fstr); + wr.Write(res); + fstr.Close(); + } catch { + } + + } + + public void JumpLink(object sender, EventArgs e) + { + if (selnode == null) return; + if (selnode.Type != NodeType.Link) return; + + OnDoubleClick(e); + } + + public void OpenReference(object sender, EventArgs e) + { + if (selnode == null) return; + if (selnode.Type != NodeType.Reference) return; + + OnDoubleClick(e); + } + + void Back(object sender, EventArgs e) + { + if (history.Count == 0) return; + try { + histback = true; + TreeNode selnode = history.Pop() as TreeNode; + if (selnode != null) { + selnode.EnsureVisible(); + SelectedNode = selnode; + } + } finally { + histback = false; + } + } + + protected override void OnBeforeSelect(TreeViewCancelEventArgs ev) + { + base.OnBeforeSelect(ev); + if (!histback) { + // HACK : stack is cleared if too much elements + if (history.Count >= 100) history.Clear(); + history.Push(SelectedNode); + } + } + + public void GoBack() + { + try { + Back(mnuBack, new EventArgs()); + } catch {} + } + + public class RefNodeAttribute + { + public SA.SharpAssembly Assembly; + public SA.SharpAssemblyName RefName; + + public RefNodeAttribute(SA.SharpAssembly asm, SA.SharpAssemblyName name) + { + Assembly = asm; + RefName = name; + } + } + + protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e) + { + base.OnMouseUp(e); + + if (e.Button == MouseButtons.XButton1) { + GoBack(); + } + } + + } + + public class TreeNodeComparer : IComparer + { + public int Compare(object x, object y) + { + return String.Compare(((TreeNode)x).Text, ((TreeNode)y).Text); + } + } + + public enum ShowOptions + { + Show = 0, + GreyOut = 1, + Hide = 2 + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/ExtendedPropPanel.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/ExtendedPropPanel.cs new file mode 100644 index 0000000000..f01499d16b --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/ExtendedPropPanel.cs @@ -0,0 +1,201 @@ +// created on 11.12.2002 at 16:10 +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Reflection; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout { + + public class ExtendedPropsPanel : System.Windows.Forms.Panel + { + PropertyViewer props; + AssemblyTree _tree; + + public ExtendedPropsPanel(AssemblyTree tree) + { + _tree = tree; + _tree.AfterSelect += new TreeViewEventHandler(SelectNode); + + InitializeComponents(); + } + + void InitializeComponents() + { + Dock = DockStyle.Fill; + + props = new PropertyViewer(_tree); + props.Size = new Size(Width, Height); + props.Dock = DockStyle.Fill; + props.BackClick += new EventHandler(back_click); + + Controls.Add(props); + } + + void back_click(object sender, EventArgs e) + { + try { + _tree.GoBack(); + } catch {} + } + + void SelectNode(object sender, TreeViewEventArgs e) + { + AssemblyTreeNode node = (AssemblyTreeNode)e.Node; + object toShow = node.Attribute; + + switch(node.Type) { + case NodeType.Assembly: + case NodeType.Library: + case NodeType.Reference: + case NodeType.Module: + case NodeType.Link: + case NodeType.Type: + case NodeType.Constructor: + case NodeType.Event: + case NodeType.Field: + case NodeType.Method: + case NodeType.Property: + break; + case NodeType.Resource: + case NodeType.Folder: + case NodeType.Namespace: + case NodeType.SubTypes: + case NodeType.SuperTypes: + toShow = null; + break; + default: + toShow = null; + break; + } + props.ShowObject(toShow, node.Text, node.Type.ToString()); + } + } + + public class PropertyViewer : System.Windows.Forms.UserControl + { + ListView list = new ListView(); + GradientLabel cap = new GradientLabel(); + Label typ = new Label(); + LinkLabel back = new LinkLabel(); + ColumnHeader namecol; + ColumnHeader valuecol; + + AssemblyTree tree; + + public event EventHandler BackClick; + + private System.ComponentModel.Container components = null; + + public PropertyViewer(AssemblyTree _tree) + { + tree = _tree; + InitializeComponent(); + + } + + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + private void InitializeComponent() + { + cap.Location = new Point(0, 0); + cap.Size = new Size(Width, 32); + cap.Text = tree.ress.GetString("ObjectBrowser.Welcome"); + cap.Font = new Font("Tahoma", 14); + cap.BackColor = SystemColors.ControlLight; + cap.TextAlign = ContentAlignment.MiddleLeft; + cap.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; + + string backt = tree.ress.GetString("ObjectBrowser.Back"); + back.Size = new Size(40, 16); + back.Location = new Point(Width - back.Width, 44); + back.Text = backt; + back.TextAlign = ContentAlignment.TopRight; + back.Anchor = AnchorStyles.Top | AnchorStyles.Right; + back.Links.Add(0, backt.Length); + back.LinkClicked += new LinkLabelLinkClickedEventHandler(back_click); + + typ.Location = new Point(0, 44); + typ.Size = new Size(Width - back.Width, 16); + typ.Font = new Font(Font, FontStyle.Bold); + typ.Text = tree.ress.GetString("ObjectBrowser.WelcomeText"); + typ.TextAlign = ContentAlignment.TopLeft; + typ.Anchor = cap.Anchor; + + list.Location = new Point(0, 72); + list.Size = new Size(Width, Height - list.Top); + list.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; + list.FullRowSelect = true; + list.GridLines = true; + list.View = View.Details; + + namecol = new ColumnHeader(); + namecol.Text = tree.ress.GetString("ObjectBrowser.Props.Property"); + namecol.Width = 120; + + valuecol = new ColumnHeader(); + valuecol.Text = tree.ress.GetString("ObjectBrowser.Props.Value"); + valuecol.Width = 300; + + list.Columns.Add(namecol); + list.Columns.Add(valuecol); + + Controls.AddRange(new System.Windows.Forms.Control[] {cap, typ, list, back}); + } + + public void ShowObject(object obj, string title, string subtitle) + { + cap.Text = title; + typ.Text = subtitle; + list.Items.Clear(); + + if (obj == null) + { + return; + } + + SetProps(obj); + + } + + void SetProps(object o) + { + Type type = o.GetType(); + PropertyInfo[] pi = type.GetProperties(); + + for(int i=0; i < pi.Length; ++i) + { + object ret = null; + try + { + ret = type.InvokeMember(pi[i].Name, BindingFlags.GetProperty, null, o, new object [] {}); + + AddItem(pi[i].Name, (ret == null) ? "" : ret.ToString()); + } + catch + { + } + } + } + + void AddItem(string name, string val) + { + list.Items.Add(new ListViewItem(new string[] {name, val})); + } + + void back_click(object sender, LinkLabelLinkClickedEventArgs ev) + { + BackClick(this, EventArgs.Empty); + } + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/ILDasmView.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/ILDasmView.cs new file mode 100644 index 0000000000..9b6bcd553a --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/ILDasmView.cs @@ -0,0 +1,138 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Diagnostics; +using System.Drawing.Printing; +using System.Windows.Forms; +using System.Drawing; +using ICSharpCode.Core; +using Microsoft.Win32; + +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class ILDasmView : UserControl + { + CheckBox chk = new CheckBox(); + RichTextBox tb = new RichTextBox(); + AssemblyTree tree; + + public ILDasmView(AssemblyTree tree) + { + this.tree = tree; + + Dock = DockStyle.Fill; + + tb.Location = new Point(0, 24); + tb.Size = new Size(Width, Height - 24); + tb.Font = new System.Drawing.Font("Courier New", 10); + tb.ScrollBars = RichTextBoxScrollBars.Both; + tb.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; + + tb.WordWrap = false; + tb.ReadOnly = true; + + chk.Location = new Point(0, 0); + chk.Size = new Size(250, 16); + chk.Text = tree.ress.GetString("ObjectBrowser.ILDasm.Enable"); + chk.FlatStyle = FlatStyle.System; + + chk.CheckedChanged += new EventHandler(Check); + Check(null, null); + + Controls.Add(tb); + Controls.Add(chk); + + tree.AfterSelect += new TreeViewEventHandler(SelectNode); + } + + void Check(object sender, EventArgs e) + { + if(chk.Checked) { + tb.BackColor = SystemColors.Window; + } else { + tb.BackColor = SystemColors.Control; + tb.Text = ""; + } + } + + void SelectNode(object sender, TreeViewEventArgs e) + { + if (!chk.Checked) return; + + AssemblyTreeNode node = (AssemblyTreeNode)e.Node; + + SA.SharpAssembly assembly = null; + string item = " /item="; + + if (node.Attribute is SA.SharpAssembly) { + assembly = (SA.SharpAssembly)node.Attribute; + } else if (node.Attribute is IClass) { + IClass type = (IClass)node.Attribute; + item += type.FullyQualifiedName; + assembly = (SA.SharpAssembly)type.DeclaredIn; + } else if (node.Attribute is IMethod) { + IMethod method = (IMethod)node.Attribute; + item += method.DeclaringType.FullyQualifiedName + "::" + method.Name; + assembly = (SA.SharpAssembly)method.DeclaringType.DeclaredIn; + } else { + tb.Text = tree.ress.GetString("ObjectBrowser.ILDasm.NoView"); + return; + } + tb.Text = GetILDASMOutput(assembly, item).Replace("\n", "\r\n"); + } + + + + private string GetILDASMOutput(SA.SharpAssembly assembly, string item) + { + try { + string args = '"' + assembly.Location + '"' + item + " /NOBAR /TEXT"; + RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\.NETFramework"); + string cmd = (string)regKey.GetValue("sdkInstallRoot"); + if (cmd == null) cmd = (string)regKey.GetValue("sdkInstallRootv1.1"); + ProcessStartInfo psi = new ProcessStartInfo(FileUtility.GetDirectoryNameWithSeparator(cmd) + + "bin\\ildasm.exe", args); + + psi.RedirectStandardError = true; + psi.RedirectStandardOutput = true; + psi.RedirectStandardInput = true; + psi.UseShellExecute = false; + psi.CreateNoWindow = true; + + Process process = Process.Start(psi); + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + int cutpos = output.IndexOf(".namespace"); + + if (cutpos != -1) { + return output.Substring(cutpos); + } + + cutpos = output.IndexOf(".class"); + if (cutpos != -1) { + return output.Substring(cutpos); + } + + cutpos = output.IndexOf(".method"); + if (cutpos != -1) { + return output.Substring(cutpos); + } + + return output; + } catch (Exception) { + return tree.ress.GetString("ObjectBrowser.ILDasm.NotInstalled"); + } + } + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/InfoView.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/InfoView.cs new file mode 100644 index 0000000000..786b42903e --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/InfoView.cs @@ -0,0 +1,815 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Diagnostics; +using System.Drawing.Printing; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using System.Xml; +using System.Text; +using System.Text.RegularExpressions; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class InfoView : UserControl + { + GradientLabel cap = new GradientLabel(); + Label typ = new Label(); + LinkLabel back = new LinkLabel(); + + WebBrowser ht = new WebBrowser(); + Panel pan = new Panel(); + + AssemblyTree tree; + IParserService ParserService; + IAmbience ambience; + PropertyService PropertyService; + + ArrayList references = new ArrayList(); + string cssPath; + string imgPath; + string resPath; + + public InfoView(AssemblyTree tree) + { + + + PropertyService = (PropertyService)ServiceManager.Services.GetService(typeof(PropertyService)); + + ambience = AmbienceService.CurrentAmbience; + + this.tree = tree; + + imgPath = Path.Combine(PropertyService.ConfigDirectory, "tempPicture.png"); + cssPath = Path.Combine(PropertyService.ConfigDirectory, "tempStylesheet.css"); + resPath = Path.Combine(PropertyService.ConfigDirectory, "tempResource"); + + Color col = SystemColors.Control; + string color = "#" + col.R.ToString("X") + col.G.ToString("X") + col.B.ToString("X"); + + StreamWriter sw = new StreamWriter(cssPath, false); + sw.Write(@"body { margin: 0px; border: 0px; overflow: hidden; padding: 0px; + background-color: " + color + @"; + background-image: url(" + imgPath + @"); + background-position: bottom right; + background-repeat: no-repeat } + + p { font: 8pt Tahoma } + div { margin: 0px; width: 100% } + p.bottomline { font: 8pt Tahoma; border-bottom: 1px solid black; margin-bottom: 3px } + p.docmargin { font: 8pt Tahoma; margin-top: 0px; margin-bottom: 0px; padding-left: 8px; padding-right: 8px; padding-bottom: 3px; border-bottom: 1px solid black } + + a { font: 8pt Tahoma; text-decoration: none; color: blue} + a:visited { color: blue } + a:active { color: blue } + a:hover { color: red; text-decoration: underline }"); + sw.Close(); + + cap.Location = new Point(0, 0); + cap.Size = new Size(Width, 32); + cap.Text = tree.ress.GetString("ObjectBrowser.Welcome"); + cap.Font = new Font("Tahoma", 14); + cap.BackColor = SystemColors.ControlLight; + cap.TextAlign = ContentAlignment.MiddleLeft; + cap.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; + + string backt = tree.ress.GetString("ObjectBrowser.Back"); + back.Size = new Size(40, 16); + back.Location = new Point(Width - back.Width, 44); + back.Text = backt; + back.TextAlign = ContentAlignment.TopRight; + back.Anchor = AnchorStyles.Top | AnchorStyles.Right; + back.Links.Add(0, backt.Length); + back.LinkClicked += new LinkLabelLinkClickedEventHandler(back_click); + + typ.Location = new Point(0, 44); + typ.Size = new Size(Width - back.Width, 16); + typ.Font = new Font(Font, FontStyle.Bold); + typ.Text = tree.ress.GetString("ObjectBrowser.WelcomeText"); + typ.TextAlign = ContentAlignment.TopLeft; + typ.Anchor = cap.Anchor; + + ht = new WebBrowser(); + //ht.Size = new Size(20, 20); + //ht.Location = new Point(20, 20); + ht.Navigating += new WebBrowserNavigatingEventHandler (HtmlControlBeforeNavigate); + CreateImage(ResourceService.GetIcon("Icons.16x16.Class").ToBitmap()); +// TODO: StyleSheet +// ht.CascadingStyleSheet = cssPath; + string html = RenderHead() + tree.ress.GetString("ObjectBrowser.Info.SelectNode") + RenderFoot(); + ht.DocumentText = html; + + pan.Location = new Point(0, 72); + pan.DockPadding.Left = 10; + pan.DockPadding.Bottom = 75; + pan.Size = new Size(Width, Height - ht.Top); + pan.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; + pan.Controls.Add(ht); + + ht.Dock = DockStyle.Fill; + + Controls.AddRange(new Control[] { + cap, typ, back, pan + }); + + Dock = DockStyle.Fill; + tree.AfterSelect += new TreeViewEventHandler(SelectNode); + + ParserService = (IParserService)ServiceManager.Services.GetService(typeof(IParserService)); + } + + ~InfoView() { + System.IO.File.Delete(imgPath); + System.IO.File.Delete(cssPath); + } + + void HtmlControlBeforeNavigate(object sender, WebBrowserNavigatingEventArgs e) + { + e.Cancel = true; + + try { + string url = e.Url; + int refnr = Int32.Parse(url.Substring(5, url.Length - 6)); + object obj = references[refnr]; + + if (obj is IClass) { + // Go To Type + tree.GoToType((IClass)obj); + // try { + // tree.SelectedNode.Expand(); + // } catch {} + } else if (obj is AssemblyTree.RefNodeAttribute) { + // Open Assembly Reference + tree.OpenAssemblyByName((AssemblyTree.RefNodeAttribute)obj); + } else if (obj is SaveResLink) { + SaveResLink link = (SaveResLink)obj; + tree.SaveResource(link.Asm, link.Name); + } else if (obj is NamespaceLink) { + NamespaceLink ns = (NamespaceLink)obj; + tree.GoToNamespace(ns.Asm, ns.Name); + } + + } catch { + + MessageService.ShowError("Something failed following this link."); + } + } + + string RenderHead() + { + return "

"; + } + + string RenderFoot() + { + return "

"; + } + + void SelectNode(object sender, TreeViewEventArgs e) + { + AssemblyTreeNode node = (AssemblyTreeNode)e.Node; + cap.Text = node.Text; + typ.Text = node.Type.ToString(); + + references.Clear(); + + ambience.LinkArrayList = references; + ambience.ConversionFlags = ConversionFlags.AssemblyScoutDefaults; + + CreateImage(tree.ImageList.Images[node.ImageIndex]); + ht.Cursor = Cursors.Default; + StringBuilder htmlSB = new StringBuilder(RenderHead()); + + try { + + switch(node.Type) { + case NodeType.Assembly: + htmlSB.Append(GetAssemblyInfo((SA.SharpAssembly)node.Attribute)); + break; + case NodeType.Library: + htmlSB.Append(GetLibInfo((SA.SharpAssembly)node.Attribute)); + break; + case NodeType.Reference: + htmlSB.Append(GetRefInfo((AssemblyTree.RefNodeAttribute)node.Attribute)); + break; + case NodeType.Resource: + htmlSB.Append(GetResInfo((SA.SharpAssembly)node.Attribute, node.Text)); + break; + case NodeType.SingleResource: + htmlSB.Append(GetSingleResInfo(node.Attribute, node.Text)); + break; + case NodeType.Folder: + htmlSB.Append(GetFolderInfo(node.Text)); + break; + case NodeType.Namespace: + htmlSB.Append(GetNSInfo((SA.SharpAssembly)node.Attribute)); + break; + case NodeType.SubTypes: + htmlSB.Append(GetSubInfo()); + break; + case NodeType.SuperTypes: + htmlSB.Append(GetSuperInfo()); + break; + case NodeType.Link: + htmlSB.Append(GetLinkInfo((IClass)node.Attribute)); + break; + case NodeType.Type: + htmlSB.Append(GetTypeInfo((IClass)node.Attribute)); + break; + case NodeType.Event: + htmlSB.Append(GetEventInfo((IEvent)node.Attribute)); + break; + case NodeType.Field: + htmlSB.Append(GetFieldInfo((IField)node.Attribute)); + break; + case NodeType.Constructor: + case NodeType.Method: + htmlSB.Append(GetMethodInfo((IMethod)node.Attribute)); + break; + case NodeType.Property: + htmlSB.Append(GetPropInfo((IProperty)node.Attribute)); + break; + default: + break; + } + } catch(Exception ex) { + htmlSB.Append("

" + tree.ress.GetString("ObjectBrowser.Info.CollectError") + "

" + ex.ToString().Replace("\n", "
")); + } + + htmlSB.Append(RenderFoot()); + + ht.DocumentText = htmlSB.ToString(); + } + + string GetLinkInfo(IClass type) + { + StringBuilder text = new StringBuilder(ln(references.Add(type), RT("GotoType"))); + text.Append("

"); + text.Append(RT("LinkedType")); + text.Append(" "); + text.Append(GetInAsm((SA.SharpAssembly)type.DeclaredIn)); + return text.ToString(); + } + + string GetSubInfo() + { + return RT("SubInfo"); + } + + string GetSuperInfo() + { + return RT("SuperInfo"); + } + + string GetNSInfo(SA.SharpAssembly asm) + { + return GetInAsm(asm); + } + + string GetFolderInfo(string folder) + { + if (folder == tree.ress.GetString("ObjectBrowser.Nodes.Resources")) + return RT("ResFInfo"); + else if (folder == tree.ress.GetString("ObjectBrowser.Nodes.References")) + return RT("RefFInfo"); + else if (folder == tree.ress.GetString("ObjectBrowser.Nodes.Modules")) + return RT("ModFInfo"); + else + return RT("NoInfo"); + } + + string GetLibInfo(SA.SharpAssembly asm) + { + return String.Concat(RT("LibInfo"), "

", GetInAsm(asm)); + } + + string GetRefInfo(AssemblyTree.RefNodeAttribute asn) + { + string text = String.Format(RT("RefInfo"), asn.RefName.Name, asn.RefName.FullName, asn.RefName.Version.ToString(), ""); + return String.Concat(text, ln(references.Add(asn), RT("OpenRef"))); + } + + string GetResInfo(SA.SharpAssembly asm, string name) + { + long size = 0; + try { + size = asm.GetManifestResourceSize(name); + } catch {} + + StringBuilder text = new StringBuilder(String.Format(RT("ResInfo"), name, size)); + text.Append(GetInAsm(asm)); + + text.Append("

"); + text.Append(ln(references.Add(new SaveResLink(asm, name)), RT("SaveRes"))); + + if (PropertyService.Get("AddIns.AssemblyScout.ShowResPreview", true) == false) { + return text.ToString(); + } + + try { + if (name.ToLower().EndsWith(".bmp") || name.ToLower().EndsWith(".gif") + || name.ToLower().EndsWith(".png") || name.ToLower().EndsWith(".jpg")) { + byte[] res = asm.GetManifestResource(name); + FileStream fstr = new FileStream(resPath, FileMode.Create); + BinaryWriter wr = new BinaryWriter(fstr); + wr.Write(res); + fstr.Close(); + + text.Append("

Preview:

"); + text.Append(""); + } + if (name.ToLower().EndsWith(".tif")) { + byte[] res = asm.GetManifestResource(name); + Image tifImg = Image.FromStream(new MemoryStream(res)); + tifImg.Save(resPath, ImageFormat.Bmp); + + text.Append("

Preview:

"); + text.Append(""); + } + if (name.ToLower().EndsWith(".ico")) { + byte[] res = asm.GetManifestResource(name); + Icon icon = new Icon(new MemoryStream(res)); + using (Bitmap b = new Bitmap(icon.Width, icon.Height)) { + Graphics g = Graphics.FromImage(b); + g.FillRectangle(SystemBrushes.Control, 0, 0, b.Width, b.Height); + g.DrawIcon(icon, 0, 0); + + b.Save(resPath, System.Drawing.Imaging.ImageFormat.Png); + } + text.Append("

Preview:

"); + text.Append(""); + } + if (name.ToLower().EndsWith(".cur")) { + byte[] res = asm.GetManifestResource(name); + Cursor cursor = new Cursor(new MemoryStream(res)); + + using (Bitmap b = new Bitmap(cursor.Size.Width, cursor.Size.Height)) { + Graphics g = Graphics.FromImage(b); + g.FillRectangle(SystemBrushes.Control, 0, 0, b.Width, b.Height); + cursor.Draw(g, new Rectangle(0, 0, 32, 32)); + + b.Save(resPath, System.Drawing.Imaging.ImageFormat.Png); + } + + text.Append("

Preview:

"); + text.Append(""); + } + if (name.ToLower().EndsWith(".txt") || name.ToLower().EndsWith(".xml") || + name.ToLower().EndsWith(".xsd") || name.ToLower().EndsWith(".htm") || + name.ToLower().EndsWith(".html") || name.ToLower().EndsWith(".xshd") || + name.ToLower().EndsWith(".xsl") || name.ToLower().EndsWith(".txt")) { + byte[] res = asm.GetManifestResource(name); + string utf = System.Text.UTF8Encoding.UTF8.GetString(res); + + text.Append("

Preview:
"); + text.Append(""); + } + } catch {} + + return text.ToString(); + } + + string GetSingleResInfo(object singleRes, string name) + { + int len = name.Length; + if (name.LastIndexOf(":") != -1) len = name.LastIndexOf(":"); + StringBuilder ret = new StringBuilder("Name: "); + ret.Append(name.Substring(0, len)); + ret.Append("

"); + + if (singleRes != null) { + ret.Append("Type: "); + ret.Append(singleRes.GetType().Name); + ret.Append("

"); + ret.Append("Value:
"); + ret.Append(singleRes.ToString()); + } + + return ret.ToString(); + } + + string GetAssemblyInfo(SA.SharpAssembly asm) + { + string text = String.Format(RT("AsmInfo"), + asm.Name, asm.FullName, asm.GetAssemblyName().Version.ToString(), + asm.Location, asm.FromGAC); + return text + GetCustomAttribs(asm); + } + + string GetEventInfo(IEvent info) + { + StringBuilder ret = new StringBuilder(ambience.Convert(info)); + + ret.Append("

"); + ret.Append(RT("Attributes")); + ret.Append("
"); + ret.Append(GetCustomAttribs(info)); + + IClass c = ParserService.GetClass(info.DeclaringType.FullyQualifiedName.Replace("+", ".")); + if(c == null) goto noDoc; + foreach(IEvent e in c.Events) { + if(e.Name == info.Name) { + if (e.Documentation == null || e.Documentation == "") continue; + ret.Append("

"); + ret.Append(RT("Documentation")); + ret.Append("

"); + ret.Append(GetDocumentation(e.Documentation)); + ret.Append("

"); + break; + } + } + + noDoc: + + ret.Append("
"); + ret.Append(GetInType(info.DeclaringType)); + ret.Append("

"); + ret.Append(GetInAsm((SA.SharpAssembly)info.DeclaringType.DeclaredIn)); + + return ret.ToString(); + } + + string GetFieldInfo(IField info) + { + StringBuilder ret = new StringBuilder(ambience.Convert(info)); + + if (info is SharpAssemblyField) { + SharpAssemblyField saField = info as SharpAssemblyField; + if (saField.InitialValue != null) { + ret.Append(" = "); + ret.Append(saField.InitialValue.ToString()); + } + } + + ret.Append("

"); + ret.Append(RT("Attributes")); + ret.Append("
"); + ret.Append(GetCustomAttribs(info)); + + IClass c = ParserService.GetClass(info.DeclaringType.FullyQualifiedName.Replace("+", ".")); + if(c == null) goto noDoc; + foreach(IField f in c.Fields) { + if(f.Name == info.Name) { + if (f.Documentation == null || f.Documentation == "") continue; + ret.Append("

"); + ret.Append(RT("Documentation")); + ret.Append("

"); + ret.Append(GetDocumentation(f.Documentation)); + ret.Append("

"); + break; + } + } + + noDoc: + + ret.Append("
"); + ret.Append(GetInType(info.DeclaringType)); + ret.Append("

"); + ret.Append(GetInAsm((SA.SharpAssembly)info.DeclaringType.DeclaredIn)); + + return ret.ToString(); + } + + string GetMethodInfo(IMethod info) + { + StringBuilder ret = new StringBuilder(ambience.Convert(info)); + + ret.Append("

"); + ret.Append(RT("Attributes")); + ret.Append("
"); + ret.Append(GetCustomAttribs(info)); + + IClass c = ParserService.GetClass(info.DeclaringType.FullyQualifiedName.Replace("+", ".")); + if(c == null) goto noDoc; + foreach(IMethod cc in c.Methods) { + if (cc.Name == info.Name) { + if (cc.Documentation == null || cc.Documentation == "") continue; + ret.Append("

"); + ret.Append(RT("Documentation")); + ret.Append("

"); + ret.Append(GetDocumentation(cc.Documentation)); + ret.Append("

"); + break; + } + } + + noDoc: + + ret.Append("
"); + ret.Append(GetInType(info.DeclaringType)); + ret.Append("

"); + ret.Append(GetInAsm((SA.SharpAssembly)info.DeclaringType.DeclaredIn)); + + return ret.ToString(); + } + + string GetPropInfo(IProperty info) + { + StringBuilder ret = new StringBuilder(ambience.Convert(info)); + + ret.Append("

"); + ret.Append(RT("Attributes")); + ret.Append("
"); + ret.Append(GetCustomAttribs(info)); + + IClass c = ParserService.GetClass(info.DeclaringType.FullyQualifiedName.Replace("+", ".")); + if(c == null) goto noDoc; + foreach(IProperty p in c.Properties) { + if(p.Name == info.Name) { + if (p.Documentation == null || p.Documentation == "") continue; + ret.Append("

"); + ret.Append(RT("Documentation")); + ret.Append("

"); + ret.Append(GetDocumentation(p.Documentation)); + ret.Append("

"); + break; + } + } + + noDoc: + + ret.Append("
"); + ret.Append(GetInType(info.DeclaringType)); + ret.Append("

"); + ret.Append(GetInAsm((SA.SharpAssembly)info.DeclaringType.DeclaredIn)); + + return ret.ToString(); + } + + string GetTypeInfo(IClass type) + { + StringBuilder t = new StringBuilder(ambience.Convert(type)); + + t.Append("

"); + t.Append(RT("BaseTypes")); + t.Append("
"); + t.Append(GetBaseTypes(type as SharpAssemblyClass)); + + t.Append("
"); + t.Append(RT("Attributes")); + t.Append("
"); + t.Append(GetCustomAttribs(type)); + + IClass c = ParserService.GetClass(type.FullyQualifiedName.Replace("+", ".")); + if (c == null) goto noDoc; + if (c.Documentation == null || c.Documentation == "") goto noDoc; + t.Append("

"); + t.Append(RT("Documentation")); + t.Append("

"); + t.Append(GetDocumentation(c.Documentation)); + t.Append("

"); + + noDoc: + + if (type.Namespace == null || type.Namespace == "") goto inAsm; + t.Append("
"); + t.Append(GetInNS((SA.SharpAssembly)type.DeclaredIn, type.Namespace)); + + inAsm: + t.Append("

"); + t.Append(GetInAsm((SA.SharpAssembly)type.DeclaredIn)); + + return t.ToString(); + } + + string GetCustomAttribs(SA.SharpAssembly assembly) + { + return GetCustomAttribs(SharpAssemblyAttribute.GetAssemblyAttributes(assembly)); + } + + string GetCustomAttribs(IClass type) + { + if (type.Attributes.Count == 0) return ""; + return GetCustomAttribs(type.Attributes[0].Attributes); + } + + string GetCustomAttribs(IMember member) + { + if (member.Attributes.Count == 0) return ""; + return GetCustomAttribs(member.Attributes[0].Attributes); + } + + string GetCustomAttribs(AttributeCollection ca) + { + StringBuilder text = new StringBuilder(); + try { + foreach(SharpAssemblyAttribute obj in ca) { + text.Append(ln(references.Add(obj.AttributeType), obj.Name)); + text.Append(obj.ToString().Substring(obj.Name.Length)); + text.Append("
"); + + } + } catch { + return "An error occured while looking for attributes.
"; + } + return text.ToString(); + } + + string GetBaseTypes(SharpAssemblyClass type) + { + if (type == null || type.BaseTypeCollection.Count == 0) { + return String.Empty; + } + + StringBuilder text = new StringBuilder(); + + foreach (SharpAssemblyClass basetype in type.BaseTypeCollection) { + text.Append(ln(references.Add(basetype), basetype.FullyQualifiedName)); + text.Append("
"); + } + + return text.ToString(); + } + + string GetInAsm(SA.SharpAssembly asm) + { + StringBuilder text = new StringBuilder(RT("ContainedIn")); + text.Append(" "); + text.Append(ln(references.Add(new AssemblyTree.RefNodeAttribute(asm, asm.GetAssemblyName())), asm.Name)); + return text.ToString(); + } + + string GetInNS(SA.SharpAssembly asm, string ns) + { + return String.Concat(RT("Namespace"), + " ", + ln(references.Add(new NamespaceLink(asm, ns)), ns)); + } + + string GetInType(IClass type) + { + return String.Concat(RT("Type"), + " ", + ln(references.Add(type), type.FullyQualifiedName)); + } + + void back_click(object sender, LinkLabelLinkClickedEventArgs ev) + { + try { + tree.GoBack(); + } catch {} + } + + class SaveResLink + { + public SA.SharpAssembly Asm; + public string Name; + public SaveResLink(SA.SharpAssembly asm, string name) + { + Asm = asm; + Name = name; + } + } + + class NamespaceLink + { + public SA.SharpAssembly Asm; + public string Name; + public NamespaceLink(SA.SharpAssembly asm, string name) + { + Asm = asm; + Name = name; + } + } + + readonly static Regex whitespace = new Regex(@"\s+"); + public string GetDocumentation(string doc) + { + StringReader reader = new StringReader(String.Concat("", doc, "")); + XmlTextReader xml = new XmlTextReader(reader); + StringBuilder ret = new StringBuilder(); + + try { + xml.Read(); + do { + if (xml.NodeType == XmlNodeType.Element) { + string elname = xml.Name.ToLower(); + if (elname == "remarks") { + ret.Append(String.Concat("", RTD("Remarks"), "
")); + } else if (elname == "example") { + ret.Append(String.Concat("", RTD("Example"), "
")); + } else if (elname == "exception") { + ret.Append(String.Concat("", RTD("Exception"), " ", GetCref(xml["cref"]), ":
")); + } else if (elname == "returns") { + ret.Append(String.Concat("", RTD("Returns"), " ")); + } else if (elname == "see") { + ret.Append(String.Concat(GetCref(xml["cref"]), xml["langword"])); + } else if (elname == "seealso") { + ret.Append(String.Concat("", RTD("SeeAlso"), " ", GetCref(xml["cref"]), xml["langword"])); + } else if (elname == "paramref") { + ret.Append(String.Concat("", xml["name"], "")); + } else if (elname == "param") { + ret.Append(String.Concat("", xml["name"].Trim(), ": ")); + } else if (elname == "value") { + ret.Append(String.Concat("", RTD("Value"), " ")); + } else if (elname == "summary") { + ret.Append(String.Concat("", RTD("Summary"), " ")); + } + } else if (xml.NodeType == XmlNodeType.EndElement) { + string elname = xml.Name.ToLower(); + if (elname == "para" || elname == "param") { + ret.Append("
"); + } + if (elname == "exception") { + ret.Append("
"); + } + } else if (xml.NodeType == XmlNodeType.Text) { + ret.Append(whitespace.Replace(xml.Value, " ")); + } + } while(xml.Read()); + } catch { + return doc; + } + return ret.ToString(); + } + + string GetCref(string cref) + { + if (cref == null) { + return String.Empty; + } + if (cref.Length < 2) { + return cref; + } + if (cref.Substring(1, 1) == ":") { + return String.Concat("", cref.Substring(2, cref.Length - 2), ""); + } + return String.Concat("", cref, ""); + } + + string RT(string ResName) + { + return tree.ress.GetString(String.Concat("ObjectBrowser.Info.", ResName)); + } + + string RTD(string ResName) + { + return tree.ress.GetString(String.Concat("ObjectBrowser.Info.Doc.", ResName)); + } + + string ln(int rnr, string text) + { + return String.Concat("", text, ""); + } + + bool CreateImage(Image pv) + { + try { + using (Bitmap b = new Bitmap(170, 170, PixelFormat.Format24bppRgb)) { + Graphics g = Graphics.FromImage(b); + g.FillRectangle(SystemBrushes.Control, 0, 0, 170, 170); + g.InterpolationMode = InterpolationMode.NearestNeighbor; + + g.DrawImage(pv, 5, 5, 160, 160); + using (Brush brush = new SolidBrush(Color.FromArgb(220, SystemColors.Control))) { + g.FillRectangle(brush, 0, 0, 170, 170); + } + g.Dispose(); + + b.Save(imgPath, System.Drawing.Imaging.ImageFormat.Png); + } + return true; + } catch { return false; } + } + + } + + public class GradientLabel : Label + { + protected override void OnPaintBackground(PaintEventArgs pe) + { + base.OnPaintBackground(pe); + Graphics g = pe.Graphics; + g.FillRectangle(SystemBrushes.Control, pe.ClipRectangle); + using (Brush brush = new LinearGradientBrush(new Point(0, 0), new Point(Width, Height), + SystemColors.ControlLightLight, + SystemColors.Control)) { + g.FillRectangle(brush, new Rectangle(0, 0, Width, Height)); + } + } + } + +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/AssemblyTreeNode.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/AssemblyTreeNode.cs new file mode 100644 index 0000000000..09fc61e208 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/AssemblyTreeNode.cs @@ -0,0 +1,261 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.Core; +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Dom; +using SA = ICSharpCode.SharpAssembly.Assembly; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public enum NodeType { + Folder, + Resource, + Assembly, + Library, + Namespace, + Type, + Constructor, + Method, + Field, + Property, + SubTypes, + SuperTypes, + Reference, + Event, + Link, + Module, + SingleResource, + } + + public class AssemblyTreeNode : TreeNode + { + protected const int CLASSINDEX = 14; + protected const int STRUCTINDEX = CLASSINDEX + 1 * 4; + protected const int INTERFACEINDEX = CLASSINDEX + 2 * 4; + protected const int ENUMINDEX = CLASSINDEX + 3 * 4; + protected const int METHODINDEX = CLASSINDEX + 4 * 4; + protected const int PROPERTYINDEX = CLASSINDEX + 5 * 4; + protected const int FIELDINDEX = CLASSINDEX + 6 * 4; + protected const int DELEGATEINDEX = CLASSINDEX + 7 * 4; + + protected NodeType type; + protected string name; + protected object attribute; + + protected bool populated = false; + + public static ResourceService ress = (ResourceService)ServiceManager.Services.GetService(typeof(ResourceService)); + + public NodeType Type { + get { + return type; + } + set { + type = value; + } + } + + public object Attribute { + get { + return attribute; + } + } + + public bool Populated { + get { + return populated; + } + } + + public string Name { + get { + return name; + } + set { + name = value; + } + } + + public AssemblyTreeNode(string name, object attribute, NodeType type) : base(name) + { + this.attribute = attribute; + this.type = type; + this.name = name; + + SetIcon(); + } + + + protected virtual void SetIcon() + { + + + switch (type) { + case NodeType.Link: + break; + + case NodeType.Resource: + case NodeType.SingleResource: // TODO : single res icon + ImageIndex = SelectedImageIndex = 11; + break; + + case NodeType.Reference: + ImageIndex = SelectedImageIndex = 8; + break; + + case NodeType.Module: + ImageIndex = SelectedImageIndex = 46; + break; + + case NodeType.SubTypes: + ImageIndex = SelectedImageIndex = 4; + break; + + case NodeType.SuperTypes: + ImageIndex = SelectedImageIndex = 5; + break; + + default: + throw new Exception("ReflectionFolderNode.SetIcon : unknown ReflectionNodeType " + type.ToString()); + } + } + + public virtual void Populate(ShowOptions Private, ShowOptions Internal) + { + switch (type) { + case NodeType.Assembly: + PopulateAssembly((SA.SharpAssembly)attribute, this); + break; + + case NodeType.Library: + PopulateLibrary((SA.SharpAssembly)attribute, this, Private, Internal); + break; + } + populated = true; + } + + public AssemblyTreeNode GetNodeFromChildren(string title) + { + foreach (AssemblyTreeNode node in this.Nodes) { + if (node.Text == title) { + return node; + } + } + return null; + } + + public AssemblyTreeNode GetNodeFromCollection(TreeNodeCollection collection, string title) + { + foreach (AssemblyTreeNode node in collection) + if (node.Text == title) { + return node; + } + return null; + } + + void PopulateLibrary(SA.SharpAssembly assembly, TreeNode parentnode, ShowOptions Private, ShowOptions Internal) + { + parentnode.Nodes.Clear(); + IClass[] types = new IClass[0]; + + try { + types = SharpAssemblyClass.GetAssemblyTypes(assembly); + } catch { + MessageBox.Show(ress.GetString("ObjectBrowser.ErrorLoadingTypes"), ress.GetString("Global.WarningText"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + + ArrayList nodes = new ArrayList(); + ArrayList namespaces = new ArrayList(); + ArrayList namespacenames = new ArrayList(); + TreeNodeComparer comp = new TreeNodeComparer(); + + foreach (IClass type in types) { + if(type.FullyQualifiedName.IndexOf("PrivateImplementationDetails") != -1) continue; + if(type.IsInternal && Internal == ShowOptions.Hide) continue; + if(type.IsPrivate && Private == ShowOptions.Hide) continue; + + TypeNode typenode = new TypeNode(GetShortTypeName(type.FullyQualifiedName), type); + if ((type.IsInternal && Internal == ShowOptions.GreyOut) || + (type.IsPrivate && Private == ShowOptions.GreyOut)) { + typenode.ForeColor = SystemColors.GrayText; + } + nodes.Add(typenode); + if (type.Namespace != null && type.Namespace != "") { + if (!namespacenames.Contains(type.Namespace)) { + namespaces.Add(new FolderNode(type.Namespace, assembly, NodeType.Namespace, 3, 3)); + namespacenames.Add(type.Namespace); + } + } + } + nodes.Sort(comp); + namespaces.Sort(comp); + foreach (TreeNode tn in namespaces) { + parentnode.Nodes.Add(tn); + } + foreach (TreeNode tn in nodes) { + IClass type = (IClass)((AssemblyTreeNode)tn).Attribute; + if (type.Namespace != null && type.Namespace != "") { + GetNodeFromCollection(parentnode.Nodes, type.Namespace).Nodes.Add(tn); + } else { + parentnode.Nodes.Add(tn); + } + } + } + + string GetShortTypeName(string typename) + { + if (typename == null) return ""; + int lastIndex; + + lastIndex = typename.LastIndexOf('.'); + + if (lastIndex < 0) { + return typename; + } else { + return typename.Substring(lastIndex + 1); + } + + } + + void PopulateAssembly(SA.SharpAssembly assembly, TreeNode parentnode) + { + parentnode.Nodes.Clear(); + + TreeNode node = new FolderNode(System.IO.Path.GetFileName(assembly.Location), assembly, NodeType.Library, 2, 2); + parentnode.Nodes.Add(node); + + FolderNode resourcefolder = new FolderNode(ress.GetString("ObjectBrowser.Nodes.Resources"), assembly, NodeType.Folder, 6, 7); + string[] resources = assembly.GetManifestResourceNames(); + foreach (string resource in resources) { + resourcefolder.Nodes.Add(new ResourceNode(resource, assembly, true)); + } + parentnode.Nodes.Add(resourcefolder); + + FolderNode referencefolder = new FolderNode(ress.GetString("ObjectBrowser.Nodes.References"), assembly, NodeType.Folder, 9, 10); + SA.SharpAssemblyName[] references = assembly.GetReferencedAssemblies(); + foreach (SA.SharpAssemblyName name in references) { + referencefolder.Nodes.Add(new AssemblyTreeNode(name.Name, new AssemblyTree.RefNodeAttribute(assembly, name), NodeType.Reference)); + } + parentnode.Nodes.Add(referencefolder); + } + + public virtual void OnExpand() + { + } + + public virtual void OnCollapse() + { + } + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/FolderNode.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/FolderNode.cs new file mode 100644 index 0000000000..bade71df14 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/FolderNode.cs @@ -0,0 +1,42 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class FolderNode : AssemblyTreeNode + { + int openindex; + int closeindex; + + public FolderNode(string name, object attribute, NodeType type,int openindex, int closeindex) : + base(name, attribute, type) + { + this.openindex = openindex; + this.closeindex = closeindex; + OnCollapse(); + } + + protected override void SetIcon() + { + OnCollapse(); + } + + public override void OnExpand() + { + ImageIndex = SelectedImageIndex = closeindex; + } + + public override void OnCollapse() + { + ImageIndex = SelectedImageIndex = openindex; + } + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/MemberNode.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/MemberNode.cs new file mode 100644 index 0000000000..3c5a0dd70d --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/MemberNode.cs @@ -0,0 +1,178 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.Core; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class MemberNode : AssemblyTreeNode + { + bool special = false; + bool isEnum = false; + + public MemberNode(IMethod methodinfo2) : base ("", methodinfo2, NodeType.Method) + { + SetNodeName(); + } + + public MemberNode(IProperty prop, bool Special) : base ("", prop, NodeType.Property) + { + SetNodeName(); + if(special = Special) CreateSpecialNodes(prop); + } + + public MemberNode(IEvent evt, bool Special) : base ("", evt, NodeType.Event) + { + SetNodeName(); + if(special = Special) CreateSpecialNodes(evt); + } + + public MemberNode(IField fld, bool IsEnum) : base ("", fld, NodeType.Field) + { + isEnum = IsEnum; + SetNodeName(); + } + + void SetNodeName() + { + if (attribute == null) { + Text = "no name"; + return; + } + + Text = GetShortMemberName((IMember)attribute, isEnum); + if (Text.EndsWith("[static]")) { + this.NodeFont = new Font("Tahoma", 8, FontStyle.Italic); + } + } + + void CreateSpecialNodes(IProperty prop) + { + IMethod getm = prop.GetterMethod; + IMethod setm = prop.SetterMethod; + + if (getm != null) + Nodes.Add(new MethodNode(getm)); + if (setm != null) + Nodes.Add(new MethodNode(setm)); + } + + void CreateSpecialNodes(IEvent evt) + { + IMethod addm = evt.AddMethod; + IMethod raisem = evt.RaiseMethod; + IMethod removem = evt.RemoveMethod; + + if (addm != null) + Nodes.Add(new MethodNode(addm)); + if (raisem != null) + Nodes.Add(new MethodNode(raisem)); + if (removem != null) + Nodes.Add(new MethodNode(removem)); + } + + protected override void SetIcon() + { + + + if (attribute == null) + return; + switch (type) { + case NodeType.Method: + IMethod methodinfo = (IMethod)attribute; + ImageIndex = SelectedImageIndex = ClassBrowserIconService.GetIcon(methodinfo); + break; + + case NodeType.Event: + IEvent eventinfo = (IEvent)attribute; + ImageIndex = SelectedImageIndex = ClassBrowserIconService.GetIcon(eventinfo); + break; + + case NodeType.Property: + IProperty propertyinfo = (IProperty)attribute; + ImageIndex = SelectedImageIndex = ClassBrowserIconService.GetIcon(propertyinfo); + break; + + case NodeType.Field: + IField fieldinfo = (IField)attribute; + ImageIndex = SelectedImageIndex = ClassBrowserIconService.GetIcon(fieldinfo); + break; + + } + } + + static + + public static string GetShortMemberName(IMember mi, bool IsEnum) { + string ret = ""; + + ret = mi.Name; + + try { + + bool dispReturn = PropertyService.Get("AddIns.AssemblyScout.ShowReturnTypes", true); + + if (mi is IMethod) { + IMethod mii = mi as IMethod; + + if (mii.IsConstructor) { + dispReturn = false; + ret = mi.DeclaringType.Name; + } + + ret += GetParams(mii.Parameters, true); + + } else if (mi is IProperty) { + IProperty ppi = mi as IProperty; + + ret += GetParams(ppi.Parameters, false); + } + + if (dispReturn && !IsEnum) ret += " : " + GetNestedName(AssemblyTree.CurrentAmbience.GetIntrinsicTypeName(mi.ReturnType.FullyQualifiedName)); + + if (mi.IsStatic && !IsEnum) ret += " [static]"; + + if (IsEnum && mi is SharpAssemblyField) { + SharpAssemblyField saField = mi as SharpAssemblyField; + if (saField.InitialValue != null) { + ret += " = " + saField.InitialValue.ToString(); + } + } + + } catch { + Console.WriteLine("GetShortMemberName: Error"); + } + + return ret; + } + + public static string GetParams(ParameterCollection piarr, bool IncludeBrackets) { + string param = ""; + foreach(IParameter pi in piarr) { + param += GetNestedName(AssemblyTree.CurrentAmbience.GetIntrinsicTypeName(pi.ReturnType.FullyQualifiedName)) + ", "; + } + if (param.Length > 0) param = param.Substring(0, param.Length - 2); + if (param != "" || IncludeBrackets) param = "(" + param + ")"; + return param; + } + + public static string GetNestedName(string name) { + int i = name.LastIndexOf("."); + if (i == -1) return name; + return name.Substring(i + 1); + } + + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/MethodNode.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/MethodNode.cs new file mode 100644 index 0000000000..b63e9a04b3 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/MethodNode.cs @@ -0,0 +1,43 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class MethodNode : AssemblyTreeNode + { + public MethodNode(IMethod methodinfo2) : base ("", methodinfo2, NodeType.Method) + { + if (attribute == null) { + Text = "no name"; + return; + } + Text = MemberNode.GetShortMemberName((IMethod)attribute, false); + } + + protected override void SetIcon() + { + if (attribute == null) + return; + IMethod methodinfo = (IMethod)attribute; + + if (methodinfo.IsPrivate) { // private + ImageIndex = SelectedImageIndex = METHODINDEX + 3; + } else + if (methodinfo.IsProtected) { // protected + ImageIndex = SelectedImageIndex = METHODINDEX + 2; + } + ImageIndex = SelectedImageIndex = METHODINDEX; + } + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/ResourceNode.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/ResourceNode.cs new file mode 100644 index 0000000000..0c82fa7652 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/ResourceNode.cs @@ -0,0 +1,59 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Resources; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class ResourceNode : AssemblyTreeNode + { + bool isTopLevel; + + public ResourceNode(string name, object attribute, bool isTopLevel) + : base(name, attribute, isTopLevel ? NodeType.Resource : NodeType.SingleResource) + { + this.isTopLevel = isTopLevel; + } + + public override void Populate(ShowOptions Private, ShowOptions Internal) + { + if (name.ToLower().EndsWith(".resources")) { + SA.SharpAssembly assembly = (SA.SharpAssembly)attribute; + byte[] res = assembly.GetManifestResource(name); + ResourceReader resreader = new ResourceReader(new MemoryStream(res)); + + IDictionaryEnumerator en = resreader.GetEnumerator(); + + ArrayList newNodes = new ArrayList(); + + while (en.MoveNext()) { + string nodename = (string)en.Key; + if (en.Value != null) nodename += " : " + en.Value.GetType().Name; + newNodes.Add(new ResourceNode(nodename, en.Value, false)); + } + resreader.Close(); + + newNodes.Sort(new TreeNodeComparer()); + foreach (ResourceNode resnode in newNodes) { + Nodes.Add(resnode); + } + } + populated = true; + } + + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/TypeNode.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/TypeNode.cs new file mode 100644 index 0000000000..84172c2edf --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/Nodes/TypeNode.cs @@ -0,0 +1,149 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.Core; +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class TypeNode : AssemblyTreeNode + { + public bool MembersPopulated; + + public TypeNode(string name, IClass type) : base (name, type, NodeType.Type) + { + } + + protected override void SetIcon() + { + + ImageIndex = SelectedImageIndex = ClassBrowserIconService.GetIcon((IClass)attribute); + } + + public override void Populate(ShowOptions Private, ShowOptions Internal) + { + IClass type = attribute as IClass; + + Nodes.Clear(); + + + + AssemblyTreeNode supertype = new AssemblyTreeNode(ress.GetString("ObjectBrowser.Nodes.SuperTypes"), type, NodeType.SuperTypes); + Nodes.Add(supertype); + + SharpAssemblyClass sharptype = type as SharpAssemblyClass; + if (sharptype == null) goto nobase; + + AddBaseTypes(sharptype, supertype, ClassBrowserIconService); + + // TODO: SubTypes is not implemented + // Nodes.Add(new ReflectionNode("SubTypes", type, ReflectionNodeType.SubTypes)); + + nobase: + + populated = true; + } + + private void AddBaseTypes(SharpAssemblyClass type, AssemblyTreeNode node, ClassBrowserIconsService ClassBrowserIconService) + { + foreach (SharpAssemblyClass rettype in type.BaseTypeCollection) { + AssemblyTreeNode basetype = new AssemblyTreeNode(rettype.Name, rettype, NodeType.Link); + basetype.ImageIndex = basetype.SelectedImageIndex = ClassBrowserIconService.GetIcon(rettype); + node.Nodes.Add(basetype); + AddBaseTypes(rettype, basetype, ClassBrowserIconService); + } + } + + public void PopulateMembers(ShowOptions Private, ShowOptions Internal, bool Special) + { + IClass type = (IClass)attribute; + ArrayList nodes = new ArrayList(); + TreeNodeComparer comp = new TreeNodeComparer(); + + nodes.Clear(); + foreach (IMethod info in type.Methods) { + if (Private == ShowOptions.Hide && info.IsPrivate) continue; + if (Internal == ShowOptions.Hide && info.IsInternal) continue; + if (!info.IsConstructor && info.IsSpecialName) continue; + + MemberNode node = new MemberNode(info); + if ((info.IsInternal && Internal == ShowOptions.GreyOut) || + (info.IsPrivate && Private == ShowOptions.GreyOut)) { + node.ForeColor = SystemColors.GrayText; + } + + nodes.Add(node); + } + nodes.Sort(comp); + foreach (AssemblyTreeNode tn in nodes) { + Nodes.Add(tn); + } + + nodes.Clear(); + foreach (IProperty info in type.Properties) { + if (Private == ShowOptions.Hide && info.IsPrivate) continue; + if (Internal == ShowOptions.Hide && info.IsInternal) continue; + + MemberNode node = new MemberNode(info, Special); + if ((info.IsInternal && Internal == ShowOptions.GreyOut) || + (info.IsPrivate && Private == ShowOptions.GreyOut)) { + node.ForeColor = SystemColors.GrayText; + } + nodes.Add(node); + } + nodes.Sort(comp); + foreach (AssemblyTreeNode tn in nodes) { + Nodes.Add(tn); + } + + nodes.Clear(); + foreach (IField info in type.Fields) { + if (Private == ShowOptions.Hide && info.IsPrivate) continue; + if (Internal == ShowOptions.Hide && info.IsInternal) continue; + if (info.IsSpecialName) continue; + + MemberNode node = new MemberNode(info, type.ClassType == ClassType.Enum); + if ((info.IsInternal && Internal == ShowOptions.GreyOut) || + (info.IsPrivate && Private == ShowOptions.GreyOut)) { + node.ForeColor = SystemColors.GrayText; + } + nodes.Add(node); + } + nodes.Sort(comp); + foreach (AssemblyTreeNode tn in nodes) { + Nodes.Add(tn); + } + + nodes.Clear(); + foreach (IEvent info in type.Events) { + if (Private == ShowOptions.Hide && info.IsPrivate) continue; + if (Internal == ShowOptions.Hide && info.IsInternal) continue; + + MemberNode node = new MemberNode(info, Special); + if ((info.IsInternal && Internal == ShowOptions.GreyOut) || + (info.IsPrivate && Private == ShowOptions.GreyOut)) { + node.ForeColor = SystemColors.GrayText; + } + nodes.Add(node); + } + nodes.Sort(comp); + foreach (AssemblyTreeNode tn in nodes) { + Nodes.Add(tn); + } + + MembersPopulated = true; + } + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/SearchPanel.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/SearchPanel.cs new file mode 100644 index 0000000000..c0089a914a --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/SearchPanel.cs @@ -0,0 +1,263 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Drawing; +using System.Drawing.Printing; +using System.Windows.Forms; +using System.Threading; +using System.Resources; + +using ICSharpCode.Core; +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Dom; +using SA = ICSharpCode.SharpAssembly.Assembly; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class SearchPanel : UserControl + { + System.Windows.Forms.Label searchfor = new System.Windows.Forms.Label(); + System.Windows.Forms.Label foundcount = new System.Windows.Forms.Label(); + TextBox searchstringbox = new TextBox(); + ListView itemsfound = new ListView(); + Button button = new Button(); + ComboBox searchtypes = new ComboBox(); + + AssemblyTree tree; + AssemblyScoutViewContent _parent; + + public SearchPanel(AssemblyTree tree) + { + Dock = DockStyle.Fill; + + this.tree = tree; + + searchfor.Text = tree.ress.GetString("ObjectBrowser.Search.SearchFor"); + searchfor.Location = new Point(0, 0); + searchfor.Size = new Size(70, 12); + searchfor.Anchor = AnchorStyles.Top | AnchorStyles.Left; + searchfor.FlatStyle = FlatStyle.System; + + foundcount.Text = "0 " + tree.ress.GetString("ObjectBrowser.Search.ItemsFound"); + foundcount.Location = new Point(searchfor.Width + 5, 0); + foundcount.Size = new Size(Width - searchfor.Width - 5, searchfor.Height); + foundcount.TextAlign = ContentAlignment.TopRight; + foundcount.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left; + foundcount.FlatStyle = FlatStyle.System; + + searchstringbox.Location = new Point(0, 17); + searchstringbox.Width = Width; + searchstringbox.Height = 30; + searchstringbox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + searchstringbox.KeyUp += new KeyEventHandler(searchbox_keyup); + + button.Location = new Point(Width - 52, 44); + button.Size = new Size(52, 21); + button.Text = tree.ress.GetString("ObjectBrowser.Search.Search"); + button.Anchor = AnchorStyles.Top | AnchorStyles.Right; + button.Click += new EventHandler(DoSearch); + button.FlatStyle = FlatStyle.System; + + searchtypes.Location = new Point(0, 44); + searchtypes.Width = Width - 60; + searchtypes.Height = 30; + searchtypes.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + searchtypes.DropDownStyle = ComboBoxStyle.DropDownList; + searchtypes.Items.Add(tree.ress.GetString("ObjectBrowser.Search.TypesAndMembers")); + searchtypes.Items.Add(tree.ress.GetString("ObjectBrowser.Search.TypesOnly")); + searchtypes.SelectedIndex = 0; + + itemsfound.Location = new Point(0, 71); + itemsfound.Width = Width; + itemsfound.FullRowSelect = true; + itemsfound.MultiSelect = false; + itemsfound.Height = Height - 71; + itemsfound.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; + itemsfound.View = View.Details; + itemsfound.SmallImageList = tree.ImageList; + + itemsfound.Columns.Add(tree.ress.GetString("ObjectBrowser.Search.Name"), 160, HorizontalAlignment.Left); + itemsfound.Columns.Add(tree.ress.GetString("ObjectBrowser.Search.Type"), 70, HorizontalAlignment.Left); + itemsfound.Columns.Add("Namespace", 125, HorizontalAlignment.Left); + itemsfound.Columns.Add("Assembly", 75, HorizontalAlignment.Left); + itemsfound.DoubleClick += new EventHandler(SelectItem); + + Controls.Add(button); + Controls.Add(searchfor); + Controls.Add(foundcount); + Controls.Add(searchstringbox); + Controls.Add(itemsfound); + Controls.Add(searchtypes); + } + + public AssemblyScoutViewContent ParentDisplayInfo { + get { + return _parent; + } + set { + _parent = value; + } + } + + void SelectItem(object sender, EventArgs e) + { + if (itemsfound.SelectedItems.Count != 1) + return; + + if(itemsfound.SelectedItems[0] is TypeItem) { + TypeItem item = (TypeItem)itemsfound.SelectedItems[0]; + tree.GoToType(item.type); + + } else if (itemsfound.SelectedItems[0] is MemberItem) { + MemberItem member = (MemberItem)itemsfound.SelectedItems[0]; + tree.GoToMember(member.member); + } + + //ParentDisplayInfo.leftTabs.ActiveDocument = + ParentDisplayInfo.leftTabs.Documents[0].Activate(); + } + + class TypeItem : ListViewItem { + public IClass type; + public TypeItem(string Namespace, IClass type, Color forecolor) : + base (new string[] {type.Name, GetType(type), Namespace, ((SA.SharpAssembly)type.DeclaredIn).Name}) + { + this.type = type; + this.ImageIndex = ((ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService))).GetIcon(type); + this.ForeColor = forecolor; + } + + private static string GetType(IClass type) { + if(type.ClassType == ClassType.Enum) { + return "Enum"; + } else if(type.ClassType == ClassType.Interface) { + return "Interface"; + } else if(type.ClassType == ClassType.Struct) { + return "Structure"; + } else { + return "Class"; + } + } + } + + + class MemberItem : ListViewItem { + public IMember member; + + public MemberItem(string Namespace, IMember member, Color forecolor) : + base (new string[] {member.DeclaringType.Name + "." + member.Name, GetType(member), Namespace, ((SA.SharpAssembly)member.DeclaringType.DeclaredIn).Name}) + { + this.ForeColor = forecolor; + this.member = member; + if(member is IMethod) { + this.ImageIndex = ((ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService))).GetIcon(member as IMethod); + } else if(member is IField) { + this.ImageIndex = ((ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService))).GetIcon(member as IField); + } else if(member is IProperty) { + this.ImageIndex = ((ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService))).GetIcon(member as IProperty); + } else if(member is IEvent) { + this.ImageIndex = ((ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService))).GetIcon(member as IEvent); + } + } + + private static string GetType(IMember member) { + if(member is IMethod) { + if ((member as IMethod).IsConstructor) return "Constructor"; + return "Method"; + } else if(member is IField) { + return "Field"; + } else if(member is IProperty) { + return "Property"; + } else if(member is IEvent) { + return "Event"; + } else { + return "unknown"; + } + } + } + + void searchbox_keyup(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Return) + DoSearch(sender, new EventArgs()); + } + + void DoSearch(object sender, EventArgs e) + { + bool searchMembers = (searchtypes.SelectedIndex == 0); + + if(searchstringbox.Text == "") return; + string searchfor = searchstringbox.Text.ToLower(); + + itemsfound.Items.Clear(); + itemsfound.BeginUpdate(); + + foreach (AssemblyTreeNode tn in tree.Nodes) { // assembly nodes + SA.SharpAssembly assembly = (SA.SharpAssembly)tn.Attribute; + foreach (AssemblyTreeNode libnode in tn.Nodes) { + if (libnode.Type != NodeType.Library) continue; + foreach (AssemblyTreeNode nsnode in libnode.Nodes) { + if (nsnode.Type == NodeType.Type) { + ProcessType("", searchfor, searchMembers, (IClass)nsnode.Attribute, nsnode.ForeColor); + continue; + } + foreach (AssemblyTreeNode typenode in nsnode.Nodes) { + ProcessType(nsnode.Text, searchfor, searchMembers, (IClass)typenode.Attribute, nsnode.ForeColor); + } + } + } + } + + itemsfound.EndUpdate(); + foundcount.Text = itemsfound.Items.Count.ToString() + " " + tree.ress.GetString("ObjectBrowser.Search.ItemsFound"); + } + + void ProcessType(string Namespace, string searchfor, bool searchMembers, IClass type, Color nodecolor) + { + if (type.Name.ToLower().IndexOf(searchfor) >= 0) { + itemsfound.Items.Add(new TypeItem(Namespace, type, nodecolor)); + } + + if (!searchMembers) return; + + //if (!type.MembersLoaded) type.LoadMembers(); + + foreach (IMethod method in type.Methods) + ProcessMember(Namespace, method, searchfor); + foreach (IProperty prop in type.Properties) + ProcessMember(Namespace, prop, searchfor); + foreach (IField field in type.Fields) + ProcessMember(Namespace, field, searchfor); + foreach (IEvent evt in type.Events) + ProcessMember(Namespace, evt, searchfor); + } + + private void ProcessMember(string Namespace, IMember member, string searchfor) + { + if(member is IMethod) { + if (member.IsSpecialName) return; + } + + if(member.IsPrivate && (tree.showPrivateMembers == ShowOptions.Hide)) return; + if(member.IsInternal && (tree.showInternalMembers == ShowOptions.Hide)) return; + + if(member.Name.ToLower().IndexOf(searchfor) >= 0) { + Color color = SystemColors.WindowText; + if ((member.IsInternal && tree.showInternalMembers == ShowOptions.GreyOut) || + (member.IsPrivate && tree.showPrivateMembers == ShowOptions.GreyOut)) { + color = SystemColors.GrayText; + } + itemsfound.Items.Add(new MemberItem(Namespace, member, color)); + } + } + + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/SourceView.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/SourceView.cs new file mode 100644 index 0000000000..cd1947a541 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/SourceView.cs @@ -0,0 +1,229 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Collections; +using System.IO; +using System.Drawing; +using System.Drawing.Printing; +using System.Windows.Forms; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class SourceView : UserControl + { + RichTextBox rtb; + CheckBox chk; + + AssemblyTree tree; + IAmbience ambience; + + void CopyEvent(object sender, EventArgs e) + { + Clipboard.SetDataObject(new DataObject(DataFormats.Text, rtb.Text)); + } + + public SourceView(AssemblyTree tree) + { + rtb = new RichTextBox(); + rtb.ReadOnly = true; + + + + + ambience = AmbienceService.CurrentAmbience; + + rtb.Font = ResourceService.LoadFont("Courier New", 10); + + this.tree = tree; + + Dock = DockStyle.Fill; + + tree.AfterSelect += new TreeViewEventHandler(SelectNode); + + rtb.Location = new Point(0, 24); + rtb.Size = new Size(Width, Height - 24); + rtb.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; + + rtb.ContextMenu = new ContextMenu(new MenuItem[] { + new MenuItem("Copy", new EventHandler(CopyEvent)) + }); + + chk = new CheckBox(); + chk.Location = new Point(0, 0); + chk.Size = new Size(250, 16); + chk.Text = tree.ress.GetString("ObjectBrowser.SourceView.Enable"); + chk.FlatStyle = FlatStyle.System; + chk.CheckedChanged += new EventHandler(Check); + Check(null, null); + + Controls.Add(rtb); + Controls.Add(chk); + } + + + void Check(object sender, EventArgs e) + { + if(chk.Checked) { + rtb.BackColor = SystemColors.Window; + } else { + rtb.BackColor = SystemColors.Control; + rtb.Text = ""; + } + } + + string GetAttributes(int indent, IMember member) + { + if (member.Attributes.Count == 0) { + return String.Empty; + } + return GetAttributes(indent, member.Attributes[0].Attributes); + } + + string GetAttributes(int indent, IClass type) + { + if (type.Attributes.Count == 0) { + return String.Empty; + } + return GetAttributes(indent, type.Attributes[0].Attributes); + } + + string GetAttributes(int indent, SA.SharpAssembly assembly) + { + return GetAttributes(indent, SharpAssemblyAttribute.GetAssemblyAttributes(assembly)); + } + + string GetAttributes(int indent, AttributeCollection ca) + { + StringBuilder text = new StringBuilder(); + try { + foreach(SharpAssemblyAttribute obj in ca) { + string attrString = obj.ToString(); + text.Append(ambience.WrapAttribute(attrString)); + text.Append('\n'); + } + } catch { + } + return text.ToString(); + } + + string GetTypeInfo(IClass type) + { + StringBuilder rt = new StringBuilder(); + { + string attr2 = GetAttributes(0, (SA.SharpAssembly)type.DeclaredIn); + rt.Append(ambience.WrapComment("assembly attributes\n") + attr2 + "\n" + ambience.WrapComment("declaration\n")); + } + string attr = GetAttributes(0, type); + rt.Append(attr); + rt.Append(ambience.Convert(type)); + rt.Append("\n"); + + if (type.ClassType != ClassType.Enum) { + + rt.Append("\t" + ambience.WrapComment("events\n")); + + foreach (IField fieldinfo in type.Fields) { + rt.Append(GetAttributes(1, fieldinfo)); + rt.Append("\t" + ambience.Convert(fieldinfo) + "\n"); + } + + rt.Append("\t" + ambience.WrapComment("methods\n")); + + foreach (IMethod methodinfo in type.Methods) { + if (methodinfo.IsSpecialName) { + continue; + } + ambience.ConversionFlags |= ConversionFlags.ShowReturnType; + rt.Append(GetAttributes(1, methodinfo)); + rt.Append("\t" + ambience.Convert(methodinfo)); + if (type.ClassType == ClassType.Interface) + rt.Append("\n\n"); + else { + rt.Append("\n\t\t" + ambience.WrapComment("TODO") + "\n\t" + ambience.ConvertEnd(methodinfo) + "\n\n"); + } + } + + rt.Append("\t" + ambience.WrapComment("properties\n")); + + foreach (IProperty propertyinfo in type.Properties) { + rt.Append(GetAttributes(1, propertyinfo)); + rt.Append("\t" + ambience.Convert(propertyinfo) + "\n"); + } + + rt.Append("\t" + ambience.WrapComment("events\n")); + + foreach (IEvent eventinfo in type.Events) { + rt.Append(GetAttributes(1, eventinfo)); + rt.Append("\t" + ambience.Convert(eventinfo) + "\n"); + } + } else { // Enum + foreach (IField fieldinfo in type.Fields) { + if (fieldinfo.IsLiteral) { + attr = GetAttributes(1, fieldinfo); + rt.Append(attr); + rt.Append("\t" + fieldinfo.Name); + + if (fieldinfo is SharpAssemblyField) { + SharpAssemblyField saField = fieldinfo as SharpAssemblyField; + if (saField.InitialValue != null) { + rt.Append(" = " + saField.InitialValue.ToString()); + } + } + + rt.Append(",\n"); + } + } + } + + rt.Append(ambience.ConvertEnd(type)); + + return rt.ToString(); + } + + string GenNodeSource(AssemblyTreeNode node) + { + if (node.Attribute is IClass) { + ambience.ConversionFlags = ConversionFlags.All | ConversionFlags.QualifiedNamesOnlyForReturnTypes | ConversionFlags.IncludeBodies; + /* + if (node.Attribute is SharpAssemblyClass) { + if (!(node.Attribute as SharpAssemblyClass).MembersLoaded) (node.Attribute as SharpAssemblyClass).LoadMembers(); + } + */ + return GetTypeInfo((IClass)node.Attribute); + } else { + switch (node.Type) { + case NodeType.Namespace: + StringBuilder nsContents = new StringBuilder("namespace " + node.Text + "\n{\n"); + foreach (AssemblyTreeNode childNode in node.Nodes) { + nsContents.Append(GenNodeSource(childNode)); + nsContents.Append("\n"); + } + + nsContents.Append("\n}"); + return nsContents.ToString(); + default: + return tree.ress.GetString("ObjectBrowser.SourceView.NoView"); + } + } +// return String.Empty; + } + + void SelectNode(object sender, TreeViewEventArgs e) + { + if(!chk.Checked) return; + + AssemblyTreeNode node = (AssemblyTreeNode)e.Node; + + rtb.Text = GenNodeSource(node);; + } + + } + +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/TempProject.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/TempProject.cs new file mode 100644 index 0000000000..63981616e8 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/TempProject.cs @@ -0,0 +1,135 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; +using System.Reflection; +using System.Diagnostics; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.Core; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Internal.Project.Collections; +using UI = WeifenLuo.WinFormsUI; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + internal class TempProject : IProject + { + public string ProjectType { + get { return ""; } + } + + public string BaseDirectory { + get { return System.IO.Path.GetTempPath(); } + } + + public bool IsDirty { + get { return false; } + set {} + } + + public string Name { + get { return "Temp"; } + set {} + } + + public string StandardNamespace { + get { return "Temp"; } + set {} + } + + public string Description { + get { return ""; } + set {} + } + + public IConfiguration ActiveConfiguration { + get { return null; } + set {} + } + + public IConfiguration GetConfiguration(int index) { + return null; + } + + public void AddConfiguration(IConfiguration c) + { + } + + public void RemoveConfiguration(IConfiguration c) + { + } + + public ConfigurationCollection Configurations + { + get { return null; } + } + + public ProjectFileCollection ProjectFiles { + get { return null; } + } + + public ProjectReferenceCollection ProjectReferences { + get { return new ProjectReferenceCollection(); } + } + + public NewFileSearch NewFileSearch { + get { return 0; } + set {} + } + + public bool EnableViewState { + get { return false; } + set {} + } + + public string GetParseableFileContent(string fileContent) + { + return String.Empty; + } + public DeployInformation DeployInformation { + get { return null; } + } + + public bool IsCompileable(string fileName) { return false; } + + public void LoadProject(string fileName) { } + + public void SaveProject(string fileName) { } + public void CopyReferencesToOutputPath(bool b) {} + public void CopyReferencesToPath(string destination, bool force){} + public void CopyReferencesToPath(string destination, bool force, ArrayList alreadyCopiedReferences) {} + public bool IsFileInProject(string fileName) { return false; } + + public IConfiguration CreateConfiguration(string name) { return null; } + + public IConfiguration CreateConfiguration() { return null; } + public IConfiguration CloneConfiguration(IConfiguration configuration) { return null; } + + protected virtual void OnNameChanged(EventArgs e) + { + if (NameChanged != null) { + NameChanged(this, e); + } + } + + public event EventHandler NameChanged; + + public void Dispose() + { + // nothing to do here + } + } +} diff --git a/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/XmlView.cs b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/XmlView.cs new file mode 100644 index 0000000000..af116b9774 --- /dev/null +++ b/src/AddIns/DisplayBindings/AssemblyScout/Project/Src/XmlView.cs @@ -0,0 +1,239 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Xml; +using System.Drawing; +using System.Windows.Forms; + +using SA = ICSharpCode.SharpAssembly.Assembly; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.AddIns.AssemblyScout +{ + public class XmlView : UserControl + { + private Button saveButton = new Button(); + private CheckBox exportEvents = new CheckBox(); + private CheckBox exportFields = new CheckBox(); + private CheckBox exportMethods = new CheckBox(); + private CheckBox exportProperties = new CheckBox(); + private Label captionLabel = new Label(); + + private AssemblyTreeNode SelectedNode; + private XmlTextWriter writer; + + AssemblyTree tree; + + public XmlView(AssemblyTree _tree) + { + tree = _tree; + + captionLabel.Location = new Point(5, 0); + captionLabel.Text = tree.ress.GetString("ObjectBrowser.XML.Desc"); + captionLabel.Size = new Size(300, 25); + captionLabel.FlatStyle = FlatStyle.System; + + exportEvents.Location = new Point(15, 40); + exportEvents.Text = tree.ress.GetString("ObjectBrowser.XML.ExpEvt"); + exportEvents.Checked = true; + exportEvents.Width = 300; + exportEvents.FlatStyle = FlatStyle.System; + + exportFields.Location = new Point(15, 65); + exportFields.Text = tree.ress.GetString("ObjectBrowser.XML.ExpFld"); + exportFields.Checked = true; + exportFields.Width = 300; + exportFields.FlatStyle = FlatStyle.System; + + exportMethods.Location = new Point(15, 90); + exportMethods.Text = tree.ress.GetString("ObjectBrowser.XML.ExpMeth"); + exportMethods.Checked = true; + exportMethods.Width = 300; + exportMethods.FlatStyle = FlatStyle.System; + + exportProperties.Location = new Point(15, 115); + exportProperties.Width = 300; + exportProperties.Text = tree.ress.GetString("ObjectBrowser.XML.ExpProp"); + exportProperties.Checked = true; + exportProperties.FlatStyle = FlatStyle.System; + + saveButton.Text = tree.ress.GetString("ObjectBrowser.XML.Save"); + saveButton.Location = new Point(5, 160); + saveButton.Enabled = false; + saveButton.Click += new EventHandler(saveButton_Clicked); + saveButton.FlatStyle = FlatStyle.System; + + Dock = DockStyle.Fill; + Controls.AddRange(new Control[] { + captionLabel, + saveButton, + exportEvents, + exportFields, + exportMethods, + exportProperties}); + + tree.AfterSelect += new TreeViewEventHandler(SelectNode); + } + + void saveButton_Clicked(object sender, System.EventArgs e) { + + SaveFileDialog fdialog = new SaveFileDialog(); + fdialog.Filter = tree.ress.GetString("ObjectBrowser.Filters.XML") + "|*.xml"; + DialogResult result = fdialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + + if(result != DialogResult.Cancel) { + + if (SelectedNode.Attribute is IClass) { + writeStart(fdialog.FileName, ((SelectedNode.Attribute as IClass).DeclaredIn as SA.SharpAssembly).FullName); + exportClass((IClass)SelectedNode.Attribute); + } else if (SelectedNode.Attribute is SA.SharpAssembly) { + writeStart(fdialog.FileName, ((SA.SharpAssembly)SelectedNode.Attribute).FullName); + foreach (SharpAssemblyClass type in SharpAssemblyClass.GetAssemblyTypes((SA.SharpAssembly)SelectedNode.Attribute)) { + if(type.ToString().IndexOf("PrivateImplementationDetails") == -1) { + exportClass(type); + } + } + } + writeEnd(); + } + } + + string GetScope(IDecoration type) + { + string retval; + + if (type.IsPublic) + retval = "Public"; + else if (type.IsPrivate) + retval = "Private"; + else if (type.IsProtectedOrInternal) + retval = "ProtectedOrInternal"; + else if (type.IsProtectedAndInternal) + retval = "Protected Internal"; + else if (type.IsProtected) + retval = "Protected"; + else + retval = "Internal"; + return retval; + } + + void writeStart(string filename, string assemblyname) { + try { + writer = new XmlTextWriter(filename ,new System.Text.ASCIIEncoding()); + } catch (Exception e) { + System.Windows.Forms.MessageBox.Show(e.Message); + return; + } + + writer.Formatting = Formatting.Indented; + writer.Indentation = 3; + + writer.WriteRaw(""); + writer.WriteRaw(""); + + writer.WriteStartElement("assembly"); + writer.WriteAttributeString("name", assemblyname); + } + + void writeEnd() { + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + writer = null; + } + + void exportClass(IClass type) { + writer.WriteStartElement("class"); + writer.WriteAttributeString("name", type.Name); + writer.WriteAttributeString("scope", GetScope(type)); + writer.WriteAttributeString("namespace", type.Namespace); + + // events + if(exportEvents.Checked) { + writer.WriteStartElement("events"); + foreach(IEvent event_ in type.Events) { + if(event_.DeclaringType == type) { + writer.WriteStartElement("event"); + writer.WriteAttributeString("name", event_.Name); + writer.WriteEndElement(); + } + } + writer.WriteEndElement(); + } + + // fields + if(exportFields.Checked) { + writer.WriteStartElement("fields"); + foreach(IField field in type.Fields) { + if(field.DeclaringType == type) { + writer.WriteStartElement("field"); + writer.WriteAttributeString("name", field.Name); + writer.WriteAttributeString("type", field.ReturnType.ToString()); + writer.WriteAttributeString("scope", GetScope(field)); + writer.WriteEndElement(); + } + } + writer.WriteEndElement(); + } + + // methods + if(exportMethods.Checked) { + writer.WriteStartElement("methods"); + foreach(IMethod method in type.Methods) { + if(! method.IsSpecialName) { + if(method.DeclaringType == type) { + + writer.WriteStartElement("method"); + writer.WriteAttributeString("name", method.Name); + writer.WriteAttributeString("scope", GetScope(method)); + writer.WriteAttributeString("type", method.ReturnType.ToString()); + + WriteParameters(writer, method); + writer.WriteEndElement(); + } + } + } + writer.WriteEndElement(); + } + + // properties + if(exportProperties.Checked) { + writer.WriteStartElement("properties"); + foreach(IProperty property in type.Properties) { + if(property.DeclaringType == type) { + writer.WriteStartElement("property"); + writer.WriteAttributeString("name", property.Name); + writer.WriteAttributeString("type", property.ReturnType.ToString()); + writer.WriteEndElement(); + } + } + writer.WriteEndElement(); + } + writer.WriteEndElement(); + } + + void WriteParameters(XmlTextWriter writer, IMethod member) { + foreach(IParameter param in member.Parameters) { + writer.WriteStartElement("param"); + writer.WriteAttributeString("name", param.Name); + writer.WriteAttributeString("type", param.ReturnType.ToString()); + writer.WriteEndElement(); + } + } + + void SelectNode(object sender, TreeViewEventArgs e) + { + SelectedNode = (AssemblyTreeNode)e.Node; + saveButton.Enabled = (SelectedNode.Attribute is IClass || SelectedNode.Attribute is SA.SharpAssembly); + } + + } + +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Configuration/AssemblyInfo.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..74af048452 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,38 @@ +// +// +// +// +// +// +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("SharpDevelopFormDesigner")] +[assembly: AssemblyDescription("A Windows.Forms designer implementation")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("IC#Code")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2002-2003 by Mike Krueger")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.addin b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.addin new file mode 100644 index 0000000000..ad8e51f1c2 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.addin @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj new file mode 100644 index 0000000000..f8ee5d5662 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj @@ -0,0 +1,139 @@ + + + Debug + AnyCPU + 8.0.41115 + 2.0 + {7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} + FormDesigner + Library + 4 + False + False + OnSuccessfulBuild + Library + + + True + True + False + True + ..\..\..\..\..\AddIns\AddIns\DisplayBindings\FormDesigner\ + True + + + True + True + False + True + ..\..\..\..\..\AddIns\AddIns\DisplayBindings\FormDesigner\ + False + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Form + + + + Form + + + + UserControl + + + Form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} + ICSharpCode.TextEditor + False + + + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} + NRefactory + False + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + False + + + + + + + + + True + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj.user b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj.user new file mode 100644 index 0000000000..96135953c3 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/FormDesigner.csproj.user @@ -0,0 +1,13 @@ + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + 8.0.41115 + ShowAllFiles + 0 + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/AddSidebarComponentsDialog.xfrm b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/AddSidebarComponentsDialog.xfrm new file mode 100644 index 0000000000..91f574c41b --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/AddSidebarComponentsDialog.xfrm @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/ConfigureSidebarDialog.xfrm b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/ConfigureSidebarDialog.xfrm new file mode 100644 index 0000000000..f63b040a6e --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/ConfigureSidebarDialog.xfrm @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/RenameSidebarCategoryDialog.xfrm b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/RenameSidebarCategoryDialog.xfrm new file mode 100644 index 0000000000..aab4076de9 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/RenameSidebarCategoryDialog.xfrm @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/WindowsFormsGridOptions.xfrm b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/WindowsFormsGridOptions.xfrm new file mode 100644 index 0000000000..86ce5a1b19 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Resources/WindowsFormsGridOptions.xfrm @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/Commands/FormCommands.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/Commands/FormCommands.cs new file mode 100644 index 0000000000..1a1a7f12c3 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/Commands/FormCommands.cs @@ -0,0 +1,500 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Threading; +using System.Drawing; +using System.Drawing.Printing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Diagnostics; +using System.Text; +using System.ComponentModel.Design; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +using ICSharpCode.TextEditor; + +using ICSharpCode.FormDesigner; + +namespace ICSharpCode.SharpDevelop.FormEditor.Commands +{ + ///

+ /// This is the base class for all designer menu commands + /// + public abstract class AbstractFormDesignerCommand : AbstractMenuCommand + { + public abstract CommandID CommandID { + get; + } + + protected virtual bool CanExecuteCommand(IDesignerHost host) + { + return true; + } + + FormDesignerViewContent FormDesigner { + get { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return null; + } + return window.ActiveViewContent as FormDesignerViewContent; + } + } + public override void Run() + { + + try { + FormDesignerViewContent formDesigner = FormDesigner; + if (formDesigner != null && CanExecuteCommand(formDesigner.Host)) { + IMenuCommandService menuCommandService = (IMenuCommandService)formDesigner.Host.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(CommandID); + } + } catch (Exception e) { + Console.WriteLine("Got Exception {0}", e); + } + } + } + + public class ViewCode : AbstractMenuCommand + { + FormDesignerViewContent FormDesigner { + get { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return null; + } + return window.ActiveViewContent as FormDesignerViewContent; + } + } + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return; + } + + FormDesignerViewContent formDesigner = FormDesigner; + if (formDesigner != null) { + formDesigner.ShowSourceCode(); + + } + } + } + + public class ShowProperties : AbstractMenuCommand + { + public override void Run() + { + PadDescriptor padContent = WorkbenchSingleton.Workbench.GetPad(typeof(ICSharpCode.SharpDevelop.Gui.PropertyPad)); + if (padContent != null) { + padContent.BringPadToFront(); + } + } + } + + public class DesignerVerbSubmenuBuilder : ISubmenuBuilder + { + public ToolStripItem[] BuildSubmenu(Codon codon, object owner) + { + IMenuCommandService menuCommandService = (IMenuCommandService)owner; + + ArrayList items = new ArrayList(); + + foreach (DesignerVerb verb in menuCommandService.Verbs) { + items.Add(new ContextMenuCommand(verb)); + } + + // add separator at the end of custom designer verbs + if (items.Count > 0) { + items.Add(new MenuSeparator()); + } + + return (ToolStripItem[])items.ToArray(typeof(ToolStripItem)); + } + + class ContextMenuCommand : ICSharpCode.Core.MenuCommand + { + DesignerVerb verb; + + public ContextMenuCommand(DesignerVerb verb) : base(verb.Text) + { + this.Enabled = verb.Enabled; +// this.Checked = verb.Checked; + + this.verb = verb; + Click += new EventHandler(InvokeCommand); + } + + void InvokeCommand(object sender, EventArgs e) + { + try { + verb.Invoke(); + } catch (Exception ex) { + Console.WriteLine("Got Exception {0}", ex); + } + } + } + } + +#region Align Commands + public class AlignToGrid : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignToGrid; + } + } + } + + public class AlignLeft : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignLeft; + } + } + } + + public class AlignRight : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignRight; + } + } + } + + public class AlignTop : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignTop; + } + } + } + + public class AlignBottom : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignBottom; + } + } + } + + public class AlignHorizontalCenters : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignHorizontalCenters; + } + } + } + + public class AlignVerticalCenters : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.AlignVerticalCenters; + } + } + } +#endregion + +#region Make Same Size Commands + public class SizeToGrid : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.SizeToGrid; + } + } + } + + public class SizeToControl : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.SizeToControl; + } + } + } + + public class SizeToControlHeight : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.SizeToControlHeight; + } + } + } + + public class SizeToControlWidth : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.SizeToControlWidth; + } + } + } +#endregion + +#region Horizontal Spacing Commands + public class HorizSpaceMakeEqual : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.HorizSpaceMakeEqual; + } + } + + protected override bool CanExecuteCommand(IDesignerHost host) + { + ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); + return selectionService.SelectionCount > 1; + } + } + + public class HorizSpaceIncrease : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.HorizSpaceIncrease; + } + } + } + + public class HorizSpaceDecrease : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.HorizSpaceDecrease; + } + } + } + + public class HorizSpaceConcatenate : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.HorizSpaceConcatenate; + } + } + } +#endregion + +#region Vertical Spacing Commands + public class VertSpaceMakeEqual : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.VertSpaceMakeEqual; + } + } + + protected override bool CanExecuteCommand(IDesignerHost host) + { + ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); + return selectionService.SelectionCount > 1; + } + + } + + public class VertSpaceIncrease : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.VertSpaceIncrease; + } + } + } + + public class VertSpaceDecrease : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.VertSpaceDecrease; + } + } + } + + public class VertSpaceConcatenate : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.VertSpaceConcatenate; + } + } + } +#endregion + +#region Center Commands + public class CenterHorizontally : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.CenterHorizontally; + } + } + } + public class CenterVertically : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.CenterVertically; + } + } + } +#endregion + +#region Order Commands + public class SendToBack : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.SendToBack; + } + } + } + + public class BringToFront : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.BringToFront; + } + } + } +#endregion + +#region Tray Commands + + public class LineUpIcons : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.LineupIcons; + } + } + } + + public class ShowLargeIcons : AbstractCheckableMenuCommand + { + FormDesignerViewContent FormDesigner { + get { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return null; + } + return window.ActiveViewContent as FormDesignerViewContent; + } + } + public override bool IsChecked { + get { + ComponentTray tray = Tray; + if (tray != null) { + return tray.ShowLargeIcons; + } + return false; + } + set { + ComponentTray tray = Tray; + if (tray != null) { + tray.ShowLargeIcons = value; + } + } + } + ComponentTray Tray { + get { + FormDesignerViewContent formDesigner = FormDesigner; + if (formDesigner != null) { + return formDesigner.Host.GetService(typeof(ComponentTray)) as ComponentTray; + } + return null; + + } + } + public override void Run() + { + } + } +#endregion + +#region Global Commands + public class LockControls : AbstractFormDesignerCommand + { + public override CommandID CommandID { + get { + return StandardCommands.LockControls; + } + } + } + + /// + /// Displays the tab order mode. + /// + public class ViewTabOrder : AbstractCheckableMenuCommand + { + public override bool IsChecked { + get { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return false; + } + + FormDesignerViewContent formDesigner = FormDesigner; + if (formDesigner != null) { + return formDesigner.IsTabOrderMode; + } + return false; + } + set { + SetTabOrder(value); + } + } + FormDesignerViewContent FormDesigner { + get { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return null; + } + return window.ActiveViewContent as FormDesignerViewContent; + } + } + + void SetTabOrder(bool show) + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return; + } + + FormDesignerViewContent formDesigner = FormDesigner; + if (formDesigner != null) { + if (show) { + formDesigner.ShowTabOrder(); + } else { + formDesigner.HideTabOrder(); + } + } + } + + public override void Run() + { + SetTabOrder(!IsChecked); + } + } +#endregion + +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/Commands/SideBarCommands.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/Commands/SideBarCommands.cs new file mode 100644 index 0000000000..8a1b4ab6f1 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/Commands/SideBarCommands.cs @@ -0,0 +1,48 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.FormDesigner.Gui; +using ICSharpCode.Core; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public class CustomizeSideBar : AbstractMenuCommand + { + public override void Run() + { + ConfigureSideBarDialog configureSideBarDialog = new ConfigureSideBarDialog(); + configureSideBarDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + ToolboxProvider.ReloadSideTabs(true); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs new file mode 100644 index 0000000000..7d23206f85 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CSharpDesignerGenerator.cs @@ -0,0 +1,268 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public class CSharpDesignerGenerator : IDesignerGenerator + { + IClass c; + IMethod initializeComponents; + + FormDesignerViewContent viewContent; + bool failedDesignerInitialize = false; + + public void Attach(FormDesignerViewContent viewContent) + { + this.viewContent = viewContent; + IComponentChangeService componentChangeService = (IComponentChangeService)viewContent.DesignSurface.GetService(typeof(IComponentChangeService)); + componentChangeService.ComponentAdded += new ComponentEventHandler(ComponentAdded); + componentChangeService.ComponentRename += new ComponentRenameEventHandler(ComponentRenamed); + componentChangeService.ComponentRemoving += new ComponentEventHandler(ComponentRemoved); + } + + void ComponentRemoved(object sender, ComponentEventArgs e) + { + try { + Reparse(viewContent.Document.TextContent); + foreach (IField field in c.Fields) { + if (field.Name == e.Component.Site.Name) { + int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); + viewContent.Document.Remove(startOffset, endOffset - startOffset); + } + } + } catch (Exception ex) { + Console.WriteLine(ex); + } + } + + void ComponentAdded(object sender, ComponentEventArgs e) + { + try { + if (initializeComponents == null) { + Reparse(viewContent.Document.TextContent); + } + int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine)); + viewContent.Document.Insert(endOffset, "\t\tprivate " + e.Component.GetType() + " " + e.Component.Site.Name + ";" + Environment.NewLine); + } catch (Exception ex) { + Console.WriteLine(ex); + } + } + + void ComponentRenamed(object sender, ComponentRenameEventArgs e) + { + Reparse(viewContent.Document.TextContent); + foreach (IField field in c.Fields) { + if (field.Name == e.OldName) { + int startOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.BeginLine - 1)); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, field.Region.EndLine)); + viewContent.Document.Replace(startOffset, endOffset - startOffset, "\t\tprivate " + e.Component.GetType() + " " + e.NewName + ";" + Environment.NewLine); + } + } + } + + public void MergeFormChanges() + { + + // generate file and get initialize components string + StringWriter writer = new StringWriter(); + new CodeDOMGenerator(viewContent.Host, new Microsoft.CSharp.CSharpCodeProvider()).ConvertContentDefinition(writer); + string statements = writer.ToString(); + + Reparse(viewContent.Document.TextContent); + + int startOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.BeginLine + 1)); + int endOffset = viewContent.Document.PositionToOffset(new Point(0, initializeComponents.BodyRegion.EndLine - 1)); + + viewContent.Document.Replace(startOffset, endOffset - startOffset, statements); + } + + protected void Reparse(string content) + { + // get new initialize components + ParseInformation info = ParserService.ParseFile(viewContent.FileName, content, false, true); + ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; + foreach (IClass c in cu.Classes) { + if (FormDesignerSecondaryDisplayBinding.BaseClassIsFormOrControl(c)) { + initializeComponents = GetInitializeComponents(c); + if (initializeComponents != null) { + this.c = c; + break; + } + } + } + } + + IMethod GetInitializeComponents(IClass c) + { + foreach (IMethod method in c.Methods) { + if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { + return method; + } + } + return null; + } + #region BLA + + protected static string GenerateParams(EventDescriptor edesc, bool paramNames) + { + System.Type type = edesc.EventType; + MethodInfo mInfo = type.GetMethod("Invoke"); + string param = ""; + IAmbience csa = null; + try { + csa = (IAmbience)AddInTree.GetTreeNode("/SharpDevelop/Workbench/Ambiences").BuildChildItem("CSharp", typeof(IAmbience)); + } catch {} + + for (int i = 0; i < mInfo.GetParameters().Length; ++i) { + ParameterInfo pInfo = mInfo.GetParameters()[i]; + + string typeStr = pInfo.ParameterType.ToString(); + if (csa != null) { + typeStr = csa.GetIntrinsicTypeName(typeStr); + } + param += typeStr; + if (paramNames == true) { + param += " "; + param += pInfo.Name; + } + if (i + 1 < mInfo.GetParameters().Length) { + param += ", "; + } + } + return param; + } + + /// + /// If found return true and int as position + /// + /// + /// + /// + public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) + { + if (this.failedDesignerInitialize) { + position = 0; + return false; + } + + Reparse(viewContent.Document.TextContent); + + foreach (IMethod method in c.Methods) { + if (method.Name == eventMethodName) { + position = method.Region.BeginLine + 1; + return true; + } + } + MergeFormChanges(); + Reparse(viewContent.Document.TextContent); + + position = c.Region.EndLine + 1; + + int offset = viewContent.Document.GetLineSegment(c.Region.EndLine - 1).Offset; + + string param = GenerateParams(edesc, true); + + string text = "void " + eventMethodName + "(" + param + ")\n" + + "{\n" + body + + "\n}\n\n"; + viewContent.Document.Insert(offset, text); + viewContent.Document.FormattingStrategy.IndentLines(viewContent.TextEditorControl.ActiveTextAreaControl.TextArea, c.Region.EndLine - 1, c.Region.EndLine + 3); + + return false; + } + #endregion + + public ICollection GetCompatibleMethods(EventDescriptor edesc) + { + Reparse(viewContent.Document.TextContent); + ArrayList compatibleMethods = new ArrayList(); + MethodInfo methodInfo = edesc.EventType.GetMethod("Invoke"); + foreach (IMethod method in c.Methods) { + if (method.Parameters.Count == methodInfo.GetParameters().Length) { + bool found = true; + for (int i = 0; i < methodInfo.GetParameters().Length; ++i) { + ParameterInfo pInfo = methodInfo.GetParameters()[i]; + IParameter p = method.Parameters[i]; + if (p.ReturnType.FullyQualifiedName != pInfo.ParameterType.ToString()) { + found = false; + break; + } + } + if (found) { + compatibleMethods.Add(method.Name); + } + } + } + + return compatibleMethods; + } + + public ICollection GetCompatibleMethods(EventInfo edesc) + { + Reparse(viewContent.Document.TextContent); + ArrayList compatibleMethods = new ArrayList(); + MethodInfo methodInfo = edesc.GetAddMethod(); + ParameterInfo pInfo = methodInfo.GetParameters()[0]; + string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs"); + + foreach (IMethod method in c.Methods) { + if (method.Parameters.Count == 2) { + bool found = true; + + IParameter p = method.Parameters[1]; + if (p.ReturnType.FullyQualifiedName != eventName) { + found = false; + } + if (found) { + compatibleMethods.Add(method.Name); + } + } + } + + return compatibleMethods; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs new file mode 100644 index 0000000000..a801a562de --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/CodeDOMGenerator.cs @@ -0,0 +1,81 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Xml; +using System.Collections; +using System.Drawing; +using System.Reflection; +using System.Windows.Forms; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Text; +using System.Text.RegularExpressions; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; + + +namespace ICSharpCode.FormDesigner +{ + /// + /// This class is able to generate a CodeDOM definition out of a XML file. + /// + public class CodeDOMGenerator + { + IDesignerHost host; + CodeDomProvider codeProvider; + + CodeDOMGeneratorUtility codeDOMGeneratorUtility = new CodeDOMGeneratorUtility(); + + public CodeDOMGenerator(IDesignerHost host, CodeDomProvider codeProvider) + { + this.host = host; + this.codeProvider = codeProvider; + } + + public void ConvertContentDefinition(TextWriter writer) + { + DesignerSerializationManager serializationManager = (DesignerSerializationManager )host.GetService(typeof(IDesignerSerializationManager)); + IDisposable session = serializationManager.CreateSession(); + DesignerResourceService designerResourceService = (DesignerResourceService)host.GetService(typeof(System.ComponentModel.Design.IResourceService)); + designerResourceService.SerializationStarted(true); + + CodeDomSerializer rootSerializer = (CodeDomSerializer)serializationManager.GetSerializer(host.RootComponent.GetType(), typeof(CodeDomSerializer)); + + if (rootSerializer == null) { + throw new Exception("No root serializer found"); + } + + ICollection statements = rootSerializer.Serialize(serializationManager, host.RootComponent) as ICollection; + codeDOMGeneratorUtility.CreateCodeGeneratorOptions.IndentString = "\t\t"; + + foreach (CodeStatement statement in statements) { + if (!(statement is CodeVariableDeclarationStatement)) { + try { + codeProvider.GenerateCodeFromStatement(statement, + writer, + codeDOMGeneratorUtility.CreateCodeGeneratorOptions); + } catch (Exception e) { + codeProvider.GenerateCodeFromStatement(new CodeCommentStatement("TODO: Error while generating statement : " + e.Message), + writer, + codeDOMGeneratorUtility.CreateCodeGeneratorOptions); + } + } + } + designerResourceService.SerializationEnded(true); + session.Dispose(); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs new file mode 100644 index 0000000000..1222577151 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/IDesignerGenerator.cs @@ -0,0 +1,56 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public interface IDesignerGenerator + { + void Attach(FormDesignerViewContent viewContent); + void MergeFormChanges(); + bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position); + ICollection GetCompatibleMethods(EventDescriptor edesc); + ICollection GetCompatibleMethods(EventInfo edesc); + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs new file mode 100644 index 0000000000..d300bca6fe --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerGenerator/XmlDesignerGenerator.cs @@ -0,0 +1,195 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Xml; +using System.Collections; +using System.Drawing; +using System.Reflection; +using System.Windows.Forms; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Text; +using System.Text.RegularExpressions; + +namespace ICSharpCode.FormDesigner +{ + public class XmlDesignerGenerator : IDesignerGenerator + { + FormDesignerViewContent viewContent; + + public void Attach(FormDesignerViewContent viewContent) + { + this.viewContent = viewContent; + IComponentChangeService componentChangeService = (IComponentChangeService)viewContent.DesignSurface.GetService(typeof(IComponentChangeService)); + componentChangeService.ComponentChanged += new ComponentChangedEventHandler(ComponentChanged); + + } + void ComponentChanged(object sender, ComponentChangedEventArgs e) + { + viewContent.IsDirty = true; + } + public void MergeFormChanges() + { + StringWriter writer = new StringWriter(); + XmlElement el = GetElementFor(new XmlDocument(), viewContent.Host); + + XmlDocument doc = new XmlDocument(); + doc.LoadXml("<" + el.Name + " version=\"1.0\"/>"); + + foreach (XmlNode node in el.ChildNodes) { + doc.DocumentElement.AppendChild(doc.ImportNode(node, true)); + } + doc.Save(writer); + viewContent.Document.TextContent = writer.ToString(); + } + public bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out int position) + { + position = 0; + return false; + } + + public ICollection GetCompatibleMethods(EventDescriptor edesc) + { + return new object[] {}; + } + public ICollection GetCompatibleMethods(EventInfo edesc) + { + return new object[] {}; + } + + public XmlElement GetElementFor(XmlDocument doc, object o) + { + if (doc == null) { + throw new ArgumentNullException("doc"); + } + + if (o == null) { + throw new ArgumentNullException("o"); + } + + try { + XmlElement el = doc.CreateElement(o.GetType().FullName); + PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(o); + + Control ctrl = o as Control; + bool nameInserted = false; + if (ctrl != null) { + XmlElement childEl = doc.CreateElement("Name"); + XmlAttribute valueAttribute = doc.CreateAttribute("value"); + valueAttribute.InnerText = ctrl.Name; + childEl.Attributes.Append(valueAttribute); + el.AppendChild(childEl); + nameInserted = true; + } + + // add collections as last child elements in the xml (because it is better + // to set the properties first and then add items to controls (looks nicer + // in XML and CODE)) + ArrayList childNodes = new ArrayList(); + + // the Controls collection should be generated as the last + // element because properties like 'anchor' in the child elements + // must be applied after the size has set. + foreach (PropertyDescriptor pd in properties) { +// if (!pd.ShouldSerializeValue(o)) { +// continue; +// } + if (pd.Name == "Name" && nameInserted) { + continue; + } + if (pd.Name == "DataBindings" || + // TabControl duplicate TabPages Workaround (TabPages got inserted twice : In Controls and in TabPages) + (o.GetType().FullName == "System.Windows.Forms.TabControl" && pd.Name == "Controls")) { + continue; + } + + XmlElement childEl = null; + if (pd.Name == "Size" && ctrl != null && (ctrl is UserControl || ctrl is Form)) { + childEl = doc.CreateElement("ClientSize"); + childEl.SetAttribute("value", ctrl.ClientSize.ToString()); + childNodes.Insert(0, childEl); + continue; + } + childEl = doc.CreateElement(pd.Name); + + object propertyValue = null; + try { + propertyValue = pd.GetValue(o); + } catch (Exception e) { + Console.WriteLine(e); + continue; + } + + // lists are other than normal properties + if (propertyValue is IList && !(ctrl is PropertyGrid)) { + foreach (object listObject in (IList)propertyValue) { + XmlElement newEl = GetElementFor(doc, listObject); + if (newEl != null) { + childEl.AppendChild(newEl); + } + } + + // only insert lists that contain elements (no empty lists!) + if (childEl.ChildNodes.Count > 0) { + childNodes.Add(childEl); + } + } else if (pd.ShouldSerializeValue(o) && pd.IsBrowsable) { + XmlAttribute valueAttribute = doc.CreateAttribute("value"); + if (propertyValue is Font) { + Font f = (Font)propertyValue; + propertyValue = new Font(f.FontFamily, (float)Math.Round(f.Size)); + } + + valueAttribute.InnerText = propertyValue == null ? null : propertyValue.ToString(); + childEl.Attributes.Append(valueAttribute); + childNodes.Insert(0, childEl); + } + } + + foreach (XmlElement childEl in childNodes) { + el.AppendChild(childEl); + } + + // fallback to ToString, if no members can be generated (for example + // handling System.String) + if (el.ChildNodes.Count == 0) { + XmlAttribute valueAttribute = doc.CreateAttribute("value"); + valueAttribute.InnerText = o.ToString(); + el.Attributes.Append(valueAttribute); + } + + return el; + } catch (Exception e) { + Console.WriteLine(e.ToString()); + } + return null; + } + + public XmlElement GetElementFor(XmlDocument doc, IDesignerHost host) + { + XmlElement componentsElement = doc.CreateElement("Components"); + + XmlAttribute versionAttribute = doc.CreateAttribute("version"); + versionAttribute.InnerText = "1.0"; + componentsElement.Attributes.Append(versionAttribute); + + // insert root element + componentsElement.AppendChild(GetElementFor(doc, host.RootComponent)); + + // insert any non gui (=tray components) + foreach (IComponent component in host.Container.Components) { + if (!(component is Control)) { + componentsElement.AppendChild(GetElementFor(doc, component)); + } + } + + return componentsElement; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs new file mode 100644 index 0000000000..1ccbafd85e --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/NRefactoryDesignerLoader.cs @@ -0,0 +1,142 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.ComponentModel.Design; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.ComponentModel.Design.Serialization; +using System.Windows.Forms; +using System.Windows.Forms.Design; + + +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; + +namespace ICSharpCode.FormDesigner +{ + public class DefaultMemberRelationshipService : MemberRelationshipService + { + public override bool SupportsRelationship(MemberRelationship source, MemberRelationship relationship) + { + return true; + } + protected override MemberRelationship GetRelationship(MemberRelationship source) + { + return base.GetRelationship(source); + } + } + + public class NRefactoryDesignerLoader : CodeDomDesignerLoader + { + bool loading = false; + IDesignerLoaderHost designerLoaderHost = null; + TypeResolutionService typeResolutionService = new TypeResolutionService(); + SupportedLanguages language; + Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); + + protected Hashtable resources = null; + bool isReloadNeeded = false; + + TextEditorControl textEditorControl; + + public string TextContent { + get { + return textEditorControl.Document.TextContent; + } + } + + public override bool Loading { + get { + return loading; + } + } + + public IDesignerLoaderHost DesignerLoaderHost { + get { + return designerLoaderHost; + } + } + + protected override CodeDomProvider CodeDomProvider { + get { + return provider; + } + } + + protected override ITypeResolutionService TypeResolutionService { + get { + return typeResolutionService; + } + } + + protected override bool IsReloadNeeded() + { + return isReloadNeeded | base.IsReloadNeeded(); + } + + public NRefactoryDesignerLoader(SupportedLanguages language, TextEditorControl textEditorControl) + { + this.language = language; + this.textEditorControl = textEditorControl; + } + + protected override CodeCompileUnit Parse() + { + isReloadNeeded = false; + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(language, new StringReader(TextContent)); + p.Parse(); + + CodeDOMVisitor visitor = new CodeDOMVisitor(); + visitor.Visit(p.CompilationUnit, null); + +// // output generated CodeDOM to the console : +// provider.GenerateCodeFromCompileUnit(visitor.codeCompileUnit, Console.Out, null); + + return visitor.codeCompileUnit; + } + + protected override void Write(CodeCompileUnit unit) + { + provider.GenerateCodeFromCompileUnit(unit, Console.Out, null); + } + +// public void Reload() +// { +// base.Reload(BasicDesignerLoader.ReloadFlags.Default); +// } +// public override void Flush() +// { +// base.Flush(); +// } + +// void InitializeExtendersForProject(IDesignerHost host) +// { +// IExtenderProviderService elsi = (IExtenderProviderService)host.GetService(typeof(IExtenderProviderService)); +// elsi.AddExtenderProvider(new ICSharpCode.FormDesigner.Util.NameExtender()); +// } + + public override void Dispose() + { + base.Dispose(); + if (this.resources != null) { + foreach (DesignerResourceService.ResourceStorage storage in this.resources.Values) { + storage.Dispose(); + } + resources.Clear(); + } + resources = null; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/XmlDesignerLoader.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/XmlDesignerLoader.cs new file mode 100644 index 0000000000..a982176338 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/DesignerLoader/XmlDesignerLoader.cs @@ -0,0 +1,147 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + + + +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +namespace ICSharpCode.FormDesigner +{ + + public class XmlDesignerLoader : BasicDesignerLoader, IObjectCreator + { + TextEditorControl textEditorControl; + + public string TextContent { + get { + return textEditorControl.Document.TextContent; + } + } + public XmlDesignerLoader(TextEditorControl textEditorControl) + { + this.textEditorControl = textEditorControl; + } + + IDesignerLoaderHost host; + public override void BeginLoad(IDesignerLoaderHost host) + { + this.host = host; + host.AddService(typeof(INameCreationService), new NameCreationService(host)); + + base.BeginLoad(host); + } + + protected override void PerformLoad(IDesignerSerializationManager serializationManager) + { + XmlLoader loader = new XmlLoader(); + loader.ObjectCreator = this; + loader.CreateObjectFromXmlDefinition(TextContent); + } + + protected override void PerformFlush(IDesignerSerializationManager serializationManager) + { + } + + Type IObjectCreator.GetType(string name) + { + return host.GetType(name); + } + + object IObjectCreator.CreateObject(string name, XmlElement el) + { + string componentName = null; + + if (el != null) { + foreach (XmlNode childNode in el) { + if (childNode.Name == "Name") { + componentName = ((XmlElement)childNode).GetAttribute("value"); + break; + } + } + } + Console.WriteLine(componentName); + object newObject = host.CreateComponent(host.GetType(name), componentName); + + if (newObject is Control) { + ((Control)newObject).SuspendLayout(); + } + + return newObject; + } + + public class NameCreationService : INameCreationService + { + IDesignerHost host; + + public NameCreationService(IDesignerHost host) + { + this.host = host; + } + + public string CreateName(Type dataType) + { + return CreateName(host.Container, dataType); + } + + public string CreateName(IContainer container, Type dataType) + { + string name = Char.ToLower(dataType.Name[0]) + dataType.Name.Substring(1); + int number = 1; + while (container.Components[name + number.ToString()] != null) { + ++number; + } + return name + number.ToString(); + } + + public bool IsValidName(string name) + { + if (name == null || name.Length == 0 || !(Char.IsLetter(name[0]) || name[0] == '_')) { + return false; + } + + foreach (char ch in name) { + if (!Char.IsLetterOrDigit(ch) && ch != '_') { + return false; + } + } + + return true; + } + + public void ValidateName(string name) + { + if (!IsValidName(name)) { + throw new System.Exception("Invalid name " + name); + } + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs new file mode 100644 index 0000000000..485d534bc4 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerSecondaryDisplayBinding.cs @@ -0,0 +1,149 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public class FormDesignerSecondaryDisplayBinding : ISecondaryDisplayBinding + { + IMethod GetInitializeComponents(IClass c) + { + foreach (IMethod method in c.Methods) { + if ((method.Name == "InitializeComponents" || method.Name == "InitializeComponent") && method.Parameters.Count == 0) { + return method; + } + } + return null; + } + + static Hashtable oldTypes = new Hashtable(); + + public static bool BaseClassIsFormOrControl(IClass c) + { + if (c == null || oldTypes.Contains(c.FullyQualifiedName)) { + oldTypes.Clear(); + return false; + } + oldTypes.Add(c.FullyQualifiedName, null); + + foreach (string baseType in c.BaseTypes) { + IClass type = ParserService.CurrentProjectContent.SearchType(baseType, c, c.Region != null ? c.Region.BeginLine : 0, c.Region != null ? c.Region.BeginColumn : 0); + string typeName = type != null ? type.FullyQualifiedName : baseType; + if (typeName == "System.Windows.Forms.Form" || + typeName == "System.Windows.Forms.UserControl" || + BaseClassIsFormOrControl(type)) { + oldTypes.Clear(); + return true; + } + } + oldTypes.Clear(); + return false; + } + + public bool CanAttachTo(IViewContent viewContent) + { + if (viewContent is ITextEditorControlProvider) { + ITextEditorControlProvider textAreaControlProvider = (ITextEditorControlProvider)viewContent; + string fileExtension = String.Empty; + string fileName = viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName; + + try { + fileExtension = Path.GetExtension(fileName).ToLower(); + } catch (Exception e) { + Console.WriteLine(e); + } + + switch (fileExtension) { + case ".cs": + ParseInformation info = ParserService.ParseFile(fileName, textAreaControlProvider.TextEditorControl.Document.TextContent, false, true); + if (info != null) { + ICompilationUnit cu = (ICompilationUnit)info.BestCompilationUnit; + foreach (IClass c in cu.Classes) { + if (BaseClassIsFormOrControl(c)) { + IMethod method = GetInitializeComponents(c); + if (method == null) { + continue; + } + return true; + } + } + } + break; + case ".xfrm": + return true; + } + } + return false; + } + + public ISecondaryViewContent[] CreateSecondaryViewContent(IViewContent viewContent) + { + string fileExtension = String.Empty; + string fileName = viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName; + + try { + fileExtension = Path.GetExtension(fileName).ToLower(); + } catch (Exception e) { + Console.WriteLine(e); + } + + if (!FormKeyHandler.inserted) { + FormKeyHandler.Insert(); + } + DesignerLoader loader = new NRefactoryDesignerLoader(SupportedLanguages.CSharp, ((ITextEditorControlProvider)viewContent).TextEditorControl); + IDesignerGenerator generator = new CSharpDesignerGenerator(); + + switch (fileExtension) { + case ".cs": + loader = new NRefactoryDesignerLoader(SupportedLanguages.CSharp, ((ITextEditorControlProvider)viewContent).TextEditorControl); + generator = new CSharpDesignerGenerator(); + break; + case ".xfrm": + loader = new XmlDesignerLoader(((ITextEditorControlProvider)viewContent).TextEditorControl); + generator = new XmlDesignerGenerator(); + break; + } + return new ISecondaryViewContent[] { new FormDesignerViewContent(viewContent, loader, generator) }; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs new file mode 100644 index 0000000000..b768075142 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormDesignerViewContent.cs @@ -0,0 +1,443 @@ +// +// +// +// +// +// + +using System; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; + +using ICSharpCode.NRefactory.Parser; +using ICSharpCode.NRefactory.Parser.AST; +using ICSharpCode.NRefactory.PrettyPrinter; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public class FormDesignerViewContent : AbstractViewContent, ISecondaryViewContent, IClipboardHandler, IUndoHandler + { + protected bool failedDesignerInitialize; + + protected IViewContent viewContent; + protected Hashtable resources = null; + + protected ITextEditorControlProvider textAreaControlProvider; + + protected string compilationErrors; + + Panel p = new Panel(); + DesignSurface designSurface; + + DesignerLoader loader; + IDesignerGenerator generator; + + public override string FileName { + get { + string fileName = textAreaControlProvider.TextEditorControl.FileName; + return fileName == null ? viewContent.UntitledName : fileName; + } + } + + public override Control Control { + get { + return p; + } + } + + public override bool IsDirty { + get { + if (viewContent == null) { + return false; + } + return viewContent.IsDirty; + } + set { + if (viewContent != null) { + viewContent.IsDirty = value; + } + } + } + + public DesignSurface DesignSurface { + get { + return designSurface; + } + } + + public TextEditorControl TextEditorControl { + get { + return textAreaControlProvider.TextEditorControl; + } + } + public IDocument Document { + get { + return TextEditorControl.Document; + } + } + + public IDesignerHost Host { + get { + return (IDesignerHost)designSurface.GetService(typeof(IDesignerHost)); + } + } + public FormDesignerViewContent(IViewContent viewContent, DesignerLoader loader, IDesignerGenerator generator) + { + this.loader = loader; + this.generator = generator; + p.BackColor = Color.White; + + this.viewContent = viewContent; + this.textAreaControlProvider = viewContent as ITextEditorControlProvider; + Reload(); + + DefaultServiceContainer serviceContainer = new DefaultServiceContainer(); + serviceContainer.AddService(typeof(System.Windows.Forms.Design.IUIService), new UIService()); + serviceContainer.AddService(typeof(System.Drawing.Design.IToolboxService), ToolboxProvider.ToolboxService); + + serviceContainer.AddService(typeof(System.ComponentModel.Design.IMenuCommandService), new ICSharpCode.FormDesigner.Services.MenuCommandService(p, serviceContainer)); + serviceContainer.AddService(typeof(IHelpService), new HelpService()); + serviceContainer.AddService(typeof(System.Drawing.Design.IPropertyValueUIService), new PropertyValueUIService()); + DesignerResourceService designerResourceService = new DesignerResourceService(this.resources); + serviceContainer.AddService(typeof(System.ComponentModel.Design.IResourceService), designerResourceService); + AmbientProperties ambientProperties = new AmbientProperties(); + serviceContainer.AddService(typeof(AmbientProperties), ambientProperties); + serviceContainer.AddService(typeof(ITypeResolutionService), ToolboxProvider.TypeResolutionService); + serviceContainer.AddService(typeof(System.ComponentModel.Design.IDesignerEventService), new DesignerEventService()); + serviceContainer.AddService(typeof(System.ComponentModel.Design.IDesignerOptionService), new ICSharpCode.FormDesigner.Services.DesignerOptionService()); + serviceContainer.AddService(typeof(MemberRelationshipService), new DefaultMemberRelationshipService()); + + + ICSharpCode.FormDesigner.Services.EventBindingService eventBindingService = new ICSharpCode.FormDesigner.Services.EventBindingService(); + serviceContainer.AddService(typeof(System.ComponentModel.Design.IEventBindingService), eventBindingService); + + designSurface = new DesignSurface(serviceContainer); + eventBindingService.ServiceProvider = designSurface; + designerResourceService.Host = Host; + + designSurface.BeginLoad(loader); + + designSurface.Flush(); + + ICSharpCode.SharpDevelop.Gui.PropertyPad.SetDesignerHost(Host); + + + generator.Attach(this); + } + + public override void Load(string fileName) + { + } + + public void Reload() + { + bool dirty = viewContent.IsDirty; +// TODO: +// loader.TextContent = Document.TextContent; + + try { + if (designSurface != null && p.Controls.Count == 0) { + Control designer = designSurface.View as Control; + designer.Dock = DockStyle.Fill; + p.Controls.Add(designer); + } + } catch (Exception e) { + Console.WriteLine(e); + } + } + + protected virtual void MergeFormChanges() + { + if (this.failedDesignerInitialize) { + return; + } + bool isDirty = IsDirty; + generator.MergeFormChanges(); + IsDirty = isDirty; + } + + + public void ShowSourceCode() + { + WorkbenchWindow.SwitchView(0); + } + + public void ShowSourceCode(int lineNumber) + { + ShowSourceCode(); + textAreaControlProvider.TextEditorControl.ActiveTextAreaControl.JumpTo(lineNumber, 255); + } + + public void ShowSourceCode(IComponent component, EventDescriptor edesc, string eventMethodName) + { + int position; + generator.InsertComponentEvent(component, edesc, eventMethodName, "", out position); + ShowSourceCode(position); + } + + public ICollection GetCompatibleMethods(EventDescriptor edesc) + { + return generator.GetCompatibleMethods(edesc); + } + + public ICollection GetCompatibleMethods(EventInfo edesc) + { + return generator.GetCompatibleMethods(edesc); + } + + public override void Selected() + { + Reload(); + } + + public override void Deselected() + { + if (!failedDesignerInitialize) { + MergeFormChanges(); + textAreaControlProvider.TextEditorControl.Refresh(); +// base.DeSelectMe(this, EventArgs.Empty); + } + +// DeselectAllComponents(); + } + + public void NotifyAfterSave(bool successful) + { +// //ifko: save the resources if there are any +// if (successful) { +// DesignerResourceService designerResourceService = (DesignerResourceService)designSurface.GetService(typeof(System.ComponentModel.Design.IResourceService)); +// if (designerResourceService != null) { +// designerResourceService.Save(); +// } +// } + } + + public void NotifyBeforeSave() + { + MergeFormChanges(); + } + + // AbstractViewContent members + protected override void OnWorkbenchWindowChanged(EventArgs e) + { + base.OnWorkbenchWindowChanged(e); + if (WorkbenchWindow != null) { + WorkbenchWindow.WindowSelected += new EventHandler(SelectMe); + WorkbenchWindow.WindowDeselected += new EventHandler(DeSelectMe); + } + } + protected void UpdateSelectableObjects() + { + PropertyPad.SetSelectableObjects(Host.Container.Components); + ISelectionService selectionService = (ISelectionService)Host.GetService(typeof(ISelectionService)); + if (selectionService != null) { + ICSharpCode.SharpDevelop.Gui.PropertyPad.SetDesignableObject(selectionService.PrimarySelection); + } + } + + public bool IsFormDesignerVisible = false; + protected virtual void SelectMe(object sender, EventArgs e) + { +// TODO: +// loader.TextContent = Document.TextContent; + IsFormDesignerVisible = true; + foreach(AxSideTab tab in ToolboxProvider.SideTabs) { + if (!SharpDevelopSideBar.SideBar.Tabs.Contains(tab)) { + SharpDevelopSideBar.SideBar.Tabs.Add(tab); + } + } + SharpDevelopSideBar.SideBar.Refresh(); + ICSharpCode.SharpDevelop.Gui.PropertyPad.SetDesignerHost(Host); + UpdateSelectableObjects(); + } + + protected virtual void DeSelectMe(object sender, EventArgs e) + { + IsFormDesignerVisible = false; + ICSharpCode.SharpDevelop.Gui.PropertyPad.SetDesignableObject(null); + ICSharpCode.SharpDevelop.Gui.PropertyPad.SetSelectableObjects(null); + foreach(AxSideTab tab in ToolboxProvider.SideTabs) { + if (!SharpDevelopSideBar.SideBar.Tabs.Contains(tab)) { + return; + } + SharpDevelopSideBar.SideBar.Tabs.Remove(tab); + } + SharpDevelopSideBar.SideBar.Refresh(); + ICSharpCode.SharpDevelop.Gui.PropertyPad.RemoveHost(Host); + } + + #region IUndoHandler impelementation + public bool EnableUndo { + get { + return true; + } + } + public bool EnableRedo { + get { + return true; + } + } + public virtual void Undo() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.Undo); + } + + public virtual void Redo() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.Redo); + } + #endregion + + #region IClipboardHandler implementation + public bool EnableCut { + get { + //ISelectionService selectionService = (ISelectionService)designSurface.GetService(typeof(ISelectionService)); + //return selectionService.SelectionCount >= 0 && selectionService.PrimarySelection != host.RootComponent; + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + System.ComponentModel.Design.MenuCommand menuCommand = menuCommandService.FindCommand(StandardCommands.Cut); + if (menuCommand == null) { + return false; + } + int status = menuCommand.OleStatus; + return menuCommand.Enabled; + } + } + + public bool EnableCopy { + get { + //ISelectionService selectionService = (ISelectionService)designSurface.GetService(typeof(ISelectionService)); + //return selectionService.SelectionCount >= 0 && selectionService.PrimarySelection != host.RootComponent; + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + System.ComponentModel.Design.MenuCommand menuCommand = menuCommandService.FindCommand(StandardCommands.Copy); + if (menuCommand == null) { + return false; + } + int status = menuCommand.OleStatus; + return menuCommand.Enabled; + } + } + + const string ComponentClipboardFormat = "CF_DESIGNERCOMPONENTS"; + public bool EnablePaste { + get { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + System.ComponentModel.Design.MenuCommand menuCommand = menuCommandService.FindCommand(StandardCommands.Paste); + if (menuCommand == null) { + return false; + } + int status = menuCommand.OleStatus; + return menuCommand.Enabled; + } + } + + public bool EnableDelete { + get { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + System.ComponentModel.Design.MenuCommand menuCommand = menuCommandService.FindCommand(StandardCommands.Delete); + if (menuCommand == null) { + return false; + } + int status = menuCommand.OleStatus; + return menuCommand.Enabled; + } + } + + public bool EnableSelectAll { + get { + return true; + } + } + + public void Cut() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.Cut); + } + + public void Copy() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.Copy); + } + + public void Paste() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.Paste); + } + + public void Delete() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.Delete); + } + + public void SelectAll() + { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.SelectAll); + } + #endregion + + #region Tab Order Handling + bool tabOrderMode = false; + public virtual bool IsTabOrderMode { + get { + return tabOrderMode; + } + } + + public virtual void ShowTabOrder() + { + if (!IsTabOrderMode) { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.TabOrder); + tabOrderMode = true; + } + } + + public virtual void HideTabOrder() + { + if (IsTabOrderMode) { + IMenuCommandService menuCommandService = (IMenuCommandService)designSurface.GetService(typeof(IMenuCommandService)); + menuCommandService.GlobalInvoke(StandardCommands.TabOrder); + tabOrderMode = false; + } + } + #endregion + } + + + +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs new file mode 100644 index 0000000000..387069f8f9 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/FormKeyHandler.cs @@ -0,0 +1,182 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + + +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public class FormKeyHandler : IMessageFilter + { + const int keyPressedMessage = 0x100; + const int leftMouseButtonDownMessage = 0x0202; + + Hashtable keyTable = new Hashtable(); + public static bool inserted = false; + public static void Insert() + { + inserted = true; + Application.AddMessageFilter(new FormKeyHandler()); + } + + public FormKeyHandler() + { + // normal keys + keyTable[Keys.Left] = new CommandWrapper(MenuCommands.KeyMoveLeft); + keyTable[Keys.Right] = new CommandWrapper(MenuCommands.KeyMoveRight); + keyTable[Keys.Up] = new CommandWrapper(MenuCommands.KeyMoveUp); + keyTable[Keys.Down] = new CommandWrapper(MenuCommands.KeyMoveDown); + keyTable[Keys.Tab] = new CommandWrapper(MenuCommands.KeySelectNext, false); + keyTable[Keys.Delete] = new CommandWrapper(MenuCommands.Delete, false); + keyTable[Keys.Back] = new CommandWrapper(MenuCommands.Delete, false); + + // shift modified keys + keyTable[Keys.Left | Keys.Shift] = new CommandWrapper(MenuCommands.KeySizeWidthDecrease); + keyTable[Keys.Right | Keys.Shift] = new CommandWrapper(MenuCommands.KeySizeWidthIncrease); + keyTable[Keys.Up | Keys.Shift] = new CommandWrapper(MenuCommands.KeySizeHeightDecrease); + keyTable[Keys.Down | Keys.Shift] = new CommandWrapper(MenuCommands.KeySizeHeightIncrease); + keyTable[Keys.Tab | Keys.Shift] = new CommandWrapper(MenuCommands.KeySelectPrevious, false); + keyTable[Keys.Delete| Keys.Shift] = new CommandWrapper(MenuCommands.Delete, false); + keyTable[Keys.Back| Keys.Shift] = new CommandWrapper(MenuCommands.Delete, false); + + // ctrl modified keys + keyTable[Keys.Left | Keys.Control] = new CommandWrapper(MenuCommands.KeyNudgeLeft); + keyTable[Keys.Right | Keys.Control] = new CommandWrapper(MenuCommands.KeyNudgeRight); + keyTable[Keys.Up | Keys.Control] = new CommandWrapper(MenuCommands.KeyNudgeUp); + keyTable[Keys.Down | Keys.Control] = new CommandWrapper(MenuCommands.KeyNudgeDown); + + // ctrl + shift modified keys + keyTable[Keys.Left | Keys.Control | Keys.Shift] = new CommandWrapper(MenuCommands.KeyNudgeWidthDecrease); + keyTable[Keys.Right | Keys.Control | Keys.Shift] = new CommandWrapper(MenuCommands.KeyNudgeWidthIncrease); + keyTable[Keys.Up | Keys.Control | Keys.Shift] = new CommandWrapper(MenuCommands.KeyNudgeHeightDecrease); + keyTable[Keys.Down | Keys.Control | Keys.Shift] = new CommandWrapper(MenuCommands.KeyNudgeHeightIncrease); + } + + public bool PreFilterMessage(ref Message m) + { + if (m.Msg != keyPressedMessage /*&& m.Msg != leftMouseButtonDownMessage*/) { + return false; + } + + if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow == null || + !WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent.Control.ContainsFocus) { + return false; + } + + FormDesignerViewContent formDesigner = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as FormDesignerViewContent; + + if (formDesigner == null) { + return false; + } + + if (!formDesigner.IsFormDesignerVisible) { + return false; + } + +// if (AbstractMenuEditorControl.MenuEditorFocused) { +// return false; +// } + +// if (m.Msg == leftMouseButtonDownMessage) { +// if (formDesigner.IsTabOrderMode) { +// Point p = new Point(m.LParam.ToInt32()); +// Control c = Control.FromHandle(m.HWnd); +// try { +// if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) { +// formDesigner.SetPrevTabIndex(c.PointToScreen(p)); +// } else { +// formDesigner.SetNextTabIndex(c.PointToScreen(p)); +// } +// } catch (Exception e) { +// Console.WriteLine(e); +// } +// } +// return false; +// } + + Keys keyPressed = (Keys)m.WParam.ToInt32() | Control.ModifierKeys; + if (keyPressed == Keys.F1) { + return false; + } + + if (keyPressed == Keys.Escape) { + formDesigner.HideTabOrder(); + return true; + } + + CommandWrapper commandWrapper = (CommandWrapper)keyTable[keyPressed]; + if (commandWrapper != null) { + IMenuCommandService menuCommandService = (IMenuCommandService)formDesigner.Host.GetService(typeof(IMenuCommandService)); + ISelectionService selectionService = (ISelectionService)formDesigner.Host.GetService(typeof(ISelectionService)); + ICollection components = selectionService.GetSelectedComponents(); + + menuCommandService.GlobalInvoke(commandWrapper.CommandID); + + if (commandWrapper.RestoreSelection) { + selectionService.SetSelectedComponents(components); + } + return true; + } + + return (System.Windows.Forms.Control.ModifierKeys & Keys.Alt) != Keys.Alt && + (System.Windows.Forms.Control.ModifierKeys & Keys.Control) != Keys.Control; + } + + class CommandWrapper + { + CommandID commandID; + bool restoreSelection; + + public CommandID CommandID { + get { + return commandID; + } + } + + public bool RestoreSelection { + get { + return restoreSelection; + } + } + + public CommandWrapper(CommandID commandID) : this(commandID, true) + { + } + public CommandWrapper(CommandID commandID, bool restoreSelection) + { + this.commandID = commandID; + this.restoreSelection = restoreSelection; + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/AddComponentsDialog.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/AddComponentsDialog.cs new file mode 100644 index 0000000000..8665c0bc38 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/AddComponentsDialog.cs @@ -0,0 +1,211 @@ +// created on 07.08.2003 at 13:46 +using System; +using System.IO; +using System.Drawing; +using System.Drawing.Design; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Collections; +using System.Text; +using System.Reflection; +using System.Windows.Forms; +using MSjogren.GacTool.FusionNative; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class AddComponentsDialog : BaseSharpDevelopForm + { + ArrayList selectedComponents; + + public ArrayList SelectedComponents { + get { + return selectedComponents; + } + } + + public AddComponentsDialog() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.AddSidebarComponentsDialog.xfrm")); + + Icon = null; + PrintGACCache(); + + ControlDictionary["browseButton"].Click += new System.EventHandler(this.browseButtonClick); + ((ListView)ControlDictionary["gacListView"]).SelectedIndexChanged += new System.EventHandler(this.gacListViewSelectedIndexChanged); +// ((TextBox)ControlDictionary["fileNameTextBox"]).TextChanged += new System.EventHandler(this.fileNameTextBoxTextChanged); + ControlDictionary["okButton"].Click += new System.EventHandler(this.buttonClick); + ControlDictionary["loadButton"].Click += new System.EventHandler(this.loadButtonClick); + } + + void PrintGACCache() + { + IApplicationContext applicationContext = null; + IAssemblyEnum assemblyEnum = null; + IAssemblyName assemblyName = null; + + Fusion.CreateAssemblyEnum(out assemblyEnum, null, null, 2, 0); + + while (assemblyEnum.GetNextAssembly(out applicationContext, out assemblyName, 0) == 0) { + uint nChars = 0; + assemblyName.GetDisplayName(null, ref nChars, 0); + + StringBuilder sb = new StringBuilder((int)nChars); + assemblyName.GetDisplayName(sb, ref nChars, 0); + + string[] info = sb.ToString().Split(','); + + string name = info[0]; + string version = info[1].Substring(info[1].LastIndexOf('=') + 1); + + ListViewItem item = new ListViewItem(new string[] {name, version}); + item.Tag = sb.ToString(); + ((ListView)ControlDictionary["gacListView"]).Items.Add(item); + } + } + + void FillComponents(Assembly assembly, string loadPath) + { + ((ListView)ControlDictionary["componentListView"]).BeginUpdate(); + ((ListView)ControlDictionary["componentListView"]).Items.Clear(); + + if (assembly != null) { + Hashtable images = new Hashtable(); + ImageList il = new ImageList(); + // try to load res icon + string[] imgNames = assembly.GetManifestResourceNames(); + + foreach (string im in imgNames) { + try { + Bitmap b = new Bitmap(Image.FromStream(assembly.GetManifestResourceStream(im))); + b.MakeTransparent(); + images[im] = il.Images.Count; + il.Images.Add(b); + } catch {} + } + try { + Module[] ms = assembly.GetModules(false); + ((ListView)ControlDictionary["componentListView"]).SmallImageList = il; + foreach (Module m in ms) { + Type[] ts = m.GetTypes(); + foreach (Type t in ts) { + if (t.IsPublic && !t.IsAbstract) { + if (t.IsDefined(typeof(ToolboxItemFilterAttribute), true) || t.IsDefined(typeof(ToolboxItemAttribute), true) || typeof(System.ComponentModel.IComponent).IsAssignableFrom(t)) { + object[] attributes = t.GetCustomAttributes(false); + object[] filterAttrs = t.GetCustomAttributes(typeof(DesignTimeVisibleAttribute), true); + foreach (DesignTimeVisibleAttribute visibleAttr in filterAttrs) { + if (!visibleAttr.Visible) { + goto skip; + } + } + + if (images[t.FullName + ".bmp"] == null) { + if (t.IsDefined(typeof(ToolboxBitmapAttribute), false)) { + foreach (object attr in attributes) { + if (attr is ToolboxBitmapAttribute) { + ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr; + images[t.FullName + ".bmp"] = il.Images.Count; + Bitmap b = new Bitmap(toolboxBitmapAttribute.GetImage(t)); + b.MakeTransparent(); + il.Images.Add(b); + break; + } + } + } + } + + ListViewItem newItem = new ListViewItem(t.Name); + newItem.SubItems.Add(t.Namespace); + newItem.SubItems.Add(assembly.ToString()); + newItem.SubItems.Add(assembly.Location); + newItem.SubItems.Add(t.Namespace); + if (images[t.FullName + ".bmp"] != null) { + newItem.ImageIndex = (int)images[t.FullName + ".bmp"]; + } + newItem.Checked = true; + ToolComponent toolComponent = new ToolComponent(t.FullName, new ComponentAssembly(assembly.FullName, loadPath)); + toolComponent.IsEnabled = true; + newItem.Tag = toolComponent; + ((ListView)ControlDictionary["componentListView"]).Items.Add(newItem); + ToolboxItem item = new ToolboxItem(t); + skip:; + } + } + } + } + } catch (Exception e) { + Console.WriteLine("got exception : " + e.ToString()); + } + } + ((ListView)ControlDictionary["componentListView"]).EndUpdate(); + } + + /* changed this unexpected behaviour -- added a load button, G.B. + void fileNameTextBoxTextChanged(object sender, System.EventArgs e) + { + if (File.Exists(this.fileNameTextBox.Text)) { + try { + FillComponents(Assembly.LoadFrom(this.fileNameTextBox.Text)); + } catch (Exception ex) { + + MessageService.ShowError(ex); + } + } + } + */ + + void gacListViewSelectedIndexChanged(object sender, System.EventArgs e) + { + if (((ListView)ControlDictionary["gacListView"]).SelectedItems != null && ((ListView)ControlDictionary["gacListView"]).SelectedItems.Count == 1) { + string assemblyName = ((ListView)ControlDictionary["gacListView"]).SelectedItems[0].Tag.ToString(); + Assembly asm = Assembly.Load(assemblyName); + FillComponents(asm, null); + } else { + FillComponents(null, null); + } + } + + void loadButtonClick(object sender, System.EventArgs e) + { + if (!System.IO.File.Exists(ControlDictionary["fileNameTextBox"].Text)) { + MessageBox.Show("Please enter a valid file name.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + try { + string assemblyFileName = ControlDictionary["fileNameTextBox"].Text; + Assembly asm = Assembly.LoadFrom(assemblyFileName); + FillComponents(asm, Path.GetDirectoryName(assemblyFileName)); + } catch { + MessageBox.Show("Please enter the file name of a valid .NET assembly.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + FillComponents(null, null); + } + } + + void buttonClick(object sender, System.EventArgs e) + { + selectedComponents = new ArrayList(); + foreach (ListViewItem item in ((ListView)ControlDictionary["componentListView"]).Items) { + if (item.Checked) { + selectedComponents.Add((ToolComponent)item.Tag); + } + } + } + + void browseButtonClick(object sender, System.EventArgs e) + { + using (OpenFileDialog fdiag = new OpenFileDialog()) { + fdiag.AddExtension = true; + + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.AssemblyFiles}|*.dll;*.exe|${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + fdiag.CheckFileExists = true; + + if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["fileNameTextBox"].Text = fdiag.FileName; + } + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/AssemblyList.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/AssemblyList.cs new file mode 100644 index 0000000000..a812e2bcdc --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/AssemblyList.cs @@ -0,0 +1,144 @@ +// created on 26/01/2003 at 21:23 +using System; +using System.Windows.Forms; +using System.Text; +using ICSharpCode.Core; + +using MSjogren.GacTool.FusionNative; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class AssemblyList : System.Windows.Forms.Form + { + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ColumnHeader createdObject1; + private System.Windows.Forms.ColumnHeader createdObject0; + private System.Windows.Forms.ListView listView; + + public AssemblyList() + { + InitializeComponents2(); + + + okButton.Text = ResourceService.GetString("Global.OKButtonText"); + cancelButton.Text = ResourceService.GetString("Global.CancelButtonText"); + + ColumnHeader referenceHeader; + + referenceHeader = listView.Columns[0]; + referenceHeader.Text = ResourceService.GetString("Dialog.SelectReferenceDialog.GacReferencePanel.ReferenceHeader"); + referenceHeader.Width = 160; + + referenceHeader = listView.Columns[1]; + referenceHeader.Text = ResourceService.GetString("Dialog.SelectReferenceDialog.GacReferencePanel.VersionHeader"); + referenceHeader.Width = 70; + + //ItemActivate += new EventHandler(AddReference); + PrintCache(); + } + + void InitializeComponents2() + { + // + // Set up generated class form + // + + + this.SuspendLayout(); + this.Name = "form"; + this.ShowInTaskbar = false; + this.Size = new System.Drawing.Size(352, 288); + this.MinimizeBox = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = FormStartPosition.CenterParent; + this.TopMost = false; + this.MaximizeBox = false; + this.Icon = null; + this.Text = "Add Assembly";//ResourceService.GetString("Dialog.Options.FormDesigner.AddAssembly"); + + // + // Set up member listView + // + listView = new System.Windows.Forms.ListView(); + listView.Name = "listView"; + listView.Dock = System.Windows.Forms.DockStyle.Top; + listView.TabIndex = 3; + listView.View = System.Windows.Forms.View.Details; + listView.Size = new System.Drawing.Size(344, 216); + listView.CheckBoxes = true; + listView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + + // + // Set up member createdObject0 + // + createdObject0 = new System.Windows.Forms.ColumnHeader(); + createdObject0.Text = "reference"; + listView.Columns.Add(createdObject0); + + // + // Set up member createdObject1 + // + createdObject1 = new System.Windows.Forms.ColumnHeader(); + createdObject1.Text = "version"; + listView.Columns.Add(createdObject1); + this.Controls.Add(listView); + + // + // Set up member CancelButton + // + cancelButton = new System.Windows.Forms.Button(); + cancelButton.Name = "CancelButton"; + cancelButton.Location = new System.Drawing.Point(264, 224); + cancelButton.Text = "button2"; + cancelButton.TabIndex = 2; + cancelButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Controls.Add(cancelButton); + + // + // Set up member okButton + // + okButton = new System.Windows.Forms.Button(); + okButton.Name = "okButton"; + okButton.Location = new System.Drawing.Point(184, 224); + okButton.Text = "button"; + okButton.TabIndex = 1; + okButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Controls.Add(okButton); + this.ResumeLayout(false); + } + + void PrintCache() + { + IApplicationContext applicationContext = null; + IAssemblyEnum assemblyEnum = null; + IAssemblyName assemblyName = null; + + Fusion.CreateAssemblyEnum(out assemblyEnum, null, null, 2, 0); + + while (assemblyEnum.GetNextAssembly(out applicationContext, out assemblyName, 0) == 0) { + uint nChars = 0; + assemblyName.GetDisplayName(null, ref nChars, 0); + + StringBuilder sb = new StringBuilder((int)nChars); + assemblyName.GetDisplayName(sb, ref nChars, 0); + + string[] info = sb.ToString().Split(','); + + string aName = info[0]; + string aVersion = info[1].Substring(info[1].LastIndexOf('=') + 1); + ListViewItem item = new ListViewItem(new string[] {aName, aVersion}); + item.Tag = sb.ToString(); + listView.Items.Add(item); + } + } + + public ListView.CheckedListViewItemCollection GetCheckedItems() + { + return listView.CheckedItems; + } + + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ComponentLibraryLoader.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ComponentLibraryLoader.cs new file mode 100644 index 0000000000..499ecbeb46 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ComponentLibraryLoader.cs @@ -0,0 +1,379 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Drawing; +using System.Reflection; +using System.Collections; +using System.Xml; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class ToolComponent + { + string fullName; + string assemblyName; + string hintPath; + bool isEnabled = true; + + public string HintPath { + get { + return hintPath; + } + set { + hintPath = value; + } + } + + public string FullName { + get { + return fullName; + } + set { + fullName = value; + } + } + + public string Name { + get { + int idx = fullName.LastIndexOf('.'); + if (idx > 0) { + return fullName.Substring(idx + 1); + } + return fullName; + } + } + + public string Namespace { + get { + int idx = fullName.LastIndexOf('.'); + if (idx > 0) { + return fullName.Substring(0, idx); + } + return String.Empty; + } + } + + public bool IsEnabled { + get { + return isEnabled; + } + set { + isEnabled = value; + } + } + + string AssemblyFileNameWithoutPath { + get { + int idx = assemblyName.IndexOf(','); + + return assemblyName.Substring(0, idx) + ".dll"; + } + } + + public string AssemblyName { + get { + return assemblyName; + } + set { + assemblyName = value; + } + } + protected ToolComponent() + { + } + public ToolComponent(string fullName, ComponentAssembly assembly) + { + this.fullName = fullName; + this.assemblyName = assembly.Name; + this.hintPath = assembly.HintPath; + } + public string FileName { + get { + if (HintPath == null) { + return null; + } + return Path.Combine(HintPath, AssemblyFileNameWithoutPath); + } + } + + public Assembly LoadAssembly() + { + if (HintPath != null) { + return Assembly.LoadFrom(FileName); + } + return Assembly.Load(AssemblyName); + } + + public object Clone() + { + ToolComponent toolComponent = new ToolComponent(); + toolComponent.FullName = fullName; + toolComponent.AssemblyName = assemblyName; + toolComponent.IsEnabled = isEnabled; + return toolComponent; + } + } + + public class Category + { + string name; + bool isEnabled = true; + ArrayList components = new ArrayList(); + + public string Name { + get { + return name; + } + set { + name = value; + } + } + + public bool IsEnabled { + get { + return isEnabled; + } + set { + isEnabled = value; + } + } + + public ArrayList ToolComponents { + get { + return components; + } + } + + protected Category() + { + } + + public Category(string name) + { + this.name = name; + } + + public object Clone() + { + Category newCategory = new Category(); + newCategory.Name = name; + newCategory.IsEnabled = isEnabled; + foreach (ToolComponent toolComponent in components) { + newCategory.ToolComponents.Add(toolComponent.Clone()); + } + return newCategory; + } + } + + public class ComponentAssembly + { + string name; + string hintPath; + + public string Name { + get { + return name; + } + set { + name = value; + } + } + public string HintPath { + get { + return hintPath; + } + set { + hintPath = value; + } + } + public ComponentAssembly(string name) + { + this.name = name; + this.hintPath = null; + } + public ComponentAssembly(string name, string hintPath) + { + this.name = name; + this.hintPath = hintPath; + } + public override string ToString() + { + return name; + } + } + + public class ComponentLibraryLoader + { + static readonly string VERSION = "1.1.0"; + + ArrayList assemblies = new ArrayList(); + ArrayList categories = new ArrayList(); + + public ArrayList Categories { + get { + return categories; + } + set { + categories = value; + } + } + + public ArrayList CopyCategories() + { + ArrayList newCategories = new ArrayList(); + foreach (Category category in categories) { + newCategories.Add(category.Clone()); + } + return newCategories; + } + + + public bool LoadToolComponentLibrary(string fileName) + { + if (!File.Exists(fileName)) { + return false; + } + + try { + XmlDocument doc = new XmlDocument(); + doc.Load(fileName); + + if (doc.DocumentElement.Name != "SharpDevelopControlLibrary" || + doc.DocumentElement.Attributes["version"] == null || + doc.DocumentElement.Attributes["version"].InnerText != VERSION) { + return false; + } + + foreach (XmlNode node in doc.DocumentElement["Assemblies"].ChildNodes) { + if (node.Name == "Assembly") { + string assemblyName = node.Attributes["assembly"].InnerText; + if (node.Attributes["path"] != null) { + assemblies.Add(new ComponentAssembly(assemblyName, node.Attributes["path"].InnerText)); + } else { + assemblies.Add(new ComponentAssembly(assemblyName)); + } + } + } + + foreach (XmlNode node in doc.DocumentElement["Categories"].ChildNodes) { + if (node.Name == "Category") { + string name = node.Attributes["name"].InnerText; + Category newCategory = new Category(name); + foreach (XmlNode componentNode in node.ChildNodes) { + ToolComponent newToolComponent = new ToolComponent(componentNode.Attributes["class"].InnerText, + (ComponentAssembly)assemblies[Int32.Parse(componentNode.Attributes["assembly"].InnerText)]); + newCategory.ToolComponents.Add(newToolComponent); + } + categories.Add(newCategory); + } + } + } catch (Exception e) { + Console.WriteLine(e); + return false; + } + return true; + } + + public Bitmap GetIcon(ToolComponent component) + { + Assembly asm = component.LoadAssembly(); + Type type = asm.GetType(component.FullName); + Bitmap b = null; + if (type != null) { + object[] attributes = type.GetCustomAttributes(false); + foreach (object attr in attributes) { + if (attr is ToolboxBitmapAttribute) { + ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr; + b = new Bitmap(toolboxBitmapAttribute.GetImage(type)); + b.MakeTransparent(); + break; + } + } + } + if (b == null) { + try { + Stream imageStream = asm.GetManifestResourceStream(component.FullName + ".bmp"); + if (imageStream != null) { + b = new Bitmap(Image.FromStream(imageStream)); + b.MakeTransparent(); + } + } catch (Exception e) { + Console.WriteLine(e); + } + } + + // TODO: Maybe default icon needed ??!?! + return b; + } + + public ToolComponent GetToolComponent(string assemblyName) + { + foreach (Category category in categories) { + foreach (ToolComponent component in category.ToolComponents) { + if (component.AssemblyName == assemblyName) { + return component; + } + } + } + return null; + } + + public void SaveToolComponentLibrary(string fileName) + { + XmlDocument doc = new XmlDocument(); + doc.LoadXml(""); + Hashtable assemblyHashTable = new Hashtable(); + + XmlElement assemblyNode = doc.CreateElement("Assemblies"); + doc.DocumentElement.AppendChild(assemblyNode); + for (int i = 0; i < assemblies.Count; ++i) { + ComponentAssembly componentAssembly = (ComponentAssembly)assemblies[i]; + assemblyHashTable[componentAssembly.Name] = i; + + XmlElement newAssembly = doc.CreateElement("Assembly"); + + newAssembly.SetAttribute("assembly", componentAssembly.Name); + if (componentAssembly.HintPath != null) { + newAssembly.SetAttribute("path", componentAssembly.HintPath); + } + assemblyNode.AppendChild(newAssembly); + } + + XmlElement categoryNode = doc.CreateElement("Categories"); + doc.DocumentElement.AppendChild(categoryNode); + foreach (Category category in categories) { + XmlElement newCategory = doc.CreateElement("Category"); + newCategory.SetAttribute("name", category.Name); + newCategory.SetAttribute("enabled", category.IsEnabled.ToString()); + categoryNode.AppendChild(newCategory); + + foreach (ToolComponent component in category.ToolComponents) { + XmlElement newToolComponent = doc.CreateElement("ToolComponent"); + newToolComponent.SetAttribute("class", component.FullName); + + if (assemblyHashTable[component.AssemblyName] == null) { + XmlElement newAssembly = doc.CreateElement("Assembly"); + newAssembly.SetAttribute("assembly", component.AssemblyName); + if (component.HintPath != null) { + newAssembly.SetAttribute("path", component.HintPath); + } + + assemblyNode.AppendChild(newAssembly); + assemblyHashTable[component.AssemblyName] = assemblyHashTable.Values.Count; + } + + newToolComponent.SetAttribute("assembly", assemblyHashTable[component.AssemblyName].ToString()); + newToolComponent.SetAttribute("enabled", component.IsEnabled.ToString()); + newCategory.AppendChild(newToolComponent); + } + } + doc.Save(fileName); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ConfigureSideBarDialog.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ConfigureSideBarDialog.cs new file mode 100644 index 0000000000..d131b56baa --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ConfigureSideBarDialog.cs @@ -0,0 +1,189 @@ +// created on 07.08.2003 at 13:36 +using System; +using System.Drawing; +using System.Collections; +using System.Windows.Forms; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class ConfigureSideBarDialog : BaseSharpDevelopForm + { + ArrayList oldComponents; + + public ConfigureSideBarDialog() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.ConfigureSidebarDialog.xfrm")); + + oldComponents = ToolboxProvider.ComponentLibraryLoader.CopyCategories(); + + FillCategories(); + categoryListViewSelectedIndexChanged(this, EventArgs.Empty); + componentListViewSelectedIndexChanged(this, EventArgs.Empty); + ControlDictionary["okButton"].Click += new System.EventHandler(this.okButtonClick); + ControlDictionary["newCategoryButton"].Click += new System.EventHandler(this.newCategoryButtonClick); + ControlDictionary["renameCategoryButton"].Click += new System.EventHandler(this.renameCategoryButtonClick); + ControlDictionary["removeCategoryButton"].Click += new System.EventHandler(this.removeCategoryButtonClick); + ControlDictionary["addComponentsButton"].Click += new System.EventHandler(this.button3Click); + ControlDictionary["removeComponentsButton"].Click += new System.EventHandler(this.removeComponentsButtonClick); + + ((ListView)ControlDictionary["categoryListView"]).SelectedIndexChanged += new System.EventHandler(this.categoryListViewSelectedIndexChanged); + ((ListView)ControlDictionary["componentListView"]).SelectedIndexChanged += new System.EventHandler(this.componentListViewSelectedIndexChanged); + } + + void FillCategories() + { + ((ListView)ControlDictionary["categoryListView"]).BeginUpdate(); + ((ListView)ControlDictionary["categoryListView"]).Items.Clear(); + foreach (Category category in ToolboxProvider.ComponentLibraryLoader.Categories) { + ListViewItem newItem = new ListViewItem(category.Name); + newItem.Checked = category.IsEnabled; + newItem.Tag = category; + ((ListView)ControlDictionary["categoryListView"]).Items.Add(newItem); + } + ((ListView)ControlDictionary["categoryListView"]).EndUpdate(); + } + + void FillComponents() + { + ((ListView)ControlDictionary["componentListView"]).ItemCheck -= new System.Windows.Forms.ItemCheckEventHandler(this.componentListViewItemCheck); + ((ListView)ControlDictionary["componentListView"]).BeginUpdate(); + ((ListView)ControlDictionary["componentListView"]).Items.Clear(); + ((ListView)ControlDictionary["componentListView"]).SmallImageList = new ImageList(); + + if (((ListView)ControlDictionary["categoryListView"]).SelectedItems != null && ((ListView)ControlDictionary["categoryListView"]).SelectedItems.Count == 1) { + Category category = (Category)((ListView)ControlDictionary["categoryListView"]).SelectedItems[0].Tag; + foreach (ToolComponent component in category.ToolComponents) { + Bitmap icon = null; + string loadError = null; + try { + icon = ToolboxProvider.ComponentLibraryLoader.GetIcon(component); + } catch (Exception e) { + + icon = IconService.GetBitmap("Icons.16x16.Warning"); + loadError = e.Message; + } + if (icon != null) { + ((ListView)ControlDictionary["componentListView"]).SmallImageList.Images.Add(icon); + } + + ListViewItem newItem = new ListViewItem(component.Name); + newItem.SubItems.Add(component.Namespace); + newItem.SubItems.Add(loadError != null ? loadError :component.AssemblyName); + + newItem.Checked = component.IsEnabled; + newItem.Tag = component; + newItem.ImageIndex = ((ListView)ControlDictionary["componentListView"]).SmallImageList.Images.Count - 1; + ((ListView)ControlDictionary["componentListView"]).Items.Add(newItem); + } + } + ((ListView)ControlDictionary["componentListView"]).EndUpdate(); + ((ListView)ControlDictionary["componentListView"]).ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.componentListViewItemCheck); + } + + // THIS METHOD IS MAINTAINED BY THE FORM DESIGNER + // DO NOT EDIT IT MANUALLY! YOUR CHANGES ARE LIKELY TO BE LOST + void categoryListViewSelectedIndexChanged(object sender, System.EventArgs e) + { + ControlDictionary["renameCategoryButton"].Enabled = ControlDictionary["addComponentsButton"].Enabled = CurrentCategory != null; + FillComponents(); + } + + Category CurrentCategory { + get { + if (((ListView)ControlDictionary["categoryListView"]).SelectedItems != null && ((ListView)ControlDictionary["categoryListView"]).SelectedItems.Count == 1) { + return (Category)((ListView)ControlDictionary["categoryListView"]).SelectedItems[0].Tag; + } + return null; + } + } + + void button3Click(object sender, System.EventArgs e) + { + AddComponentsDialog addComponentsDialog = new AddComponentsDialog(); + if (addComponentsDialog.ShowDialog(this) == DialogResult.OK) { + foreach (ToolComponent component in addComponentsDialog.SelectedComponents) { + CurrentCategory.ToolComponents.Add(component); + } + FillComponents(); + categoryListViewSelectedIndexChanged(this, EventArgs.Empty); + componentListViewSelectedIndexChanged(this, EventArgs.Empty); + } + } + + void newCategoryButtonClick(object sender, System.EventArgs e) + { + RenameCategoryDialog renameCategoryDialog = new RenameCategoryDialog(null, this); + if (renameCategoryDialog.ShowDialog(this) == DialogResult.OK) { + ToolboxProvider.ComponentLibraryLoader.Categories.Add(new Category(renameCategoryDialog.CategoryName)); + FillCategories(); + } + } + + void removeCategoryButtonClick(object sender, System.EventArgs e) + { + + if (MessageService.AskQuestion("${res:ICSharpCode.FormDesigner.Gui.ConfigureSideBarDialog.RemoveCategoryQuestion}")) { + categoryListViewSelectedIndexChanged(this, EventArgs.Empty); + ToolboxProvider.ComponentLibraryLoader.Categories.Remove(CurrentCategory); + FillCategories(); + FillComponents(); + categoryListViewSelectedIndexChanged(this, EventArgs.Empty); + componentListViewSelectedIndexChanged(this, EventArgs.Empty); + } + } + + void componentListViewSelectedIndexChanged(object sender, System.EventArgs e) + { + ControlDictionary["removeComponentsButton"].Enabled = ((ListView)ControlDictionary["componentListView"]).SelectedItems != null && ((ListView)ControlDictionary["componentListView"]).SelectedItems.Count > 0; + } + + void removeComponentsButtonClick(object sender, System.EventArgs e) + { + + if (MessageService.AskQuestion("${res:ICSharpCode.FormDesigner.Gui.ConfigureSideBarDialog.RemoveComponentsQuestion}")) { + foreach (ListViewItem item in ((ListView)ControlDictionary["componentListView"]).SelectedItems) { + CurrentCategory.ToolComponents.Remove((ToolComponent)item.Tag); + } + FillComponents(); + componentListViewSelectedIndexChanged(this, EventArgs.Empty); + } + } + + protected override void OnClosed(System.EventArgs e) + { + base.OnClosed(e); + if (oldComponents != null) { + ToolboxProvider.ComponentLibraryLoader.Categories = oldComponents; + } + } + + void renameCategoryButtonClick(object sender, System.EventArgs e) + { + RenameCategoryDialog renameCategoryDialog = new RenameCategoryDialog(this.CurrentCategory.Name, this); + if (renameCategoryDialog.ShowDialog(this) == DialogResult.OK) { + this.CurrentCategory.Name = renameCategoryDialog.CategoryName; + FillCategories(); + } + } + + void okButtonClick(object sender, System.EventArgs e) + { + oldComponents = null; + + foreach (ListViewItem item in ((ListView)ControlDictionary["categoryListView"]).Items) { + Category category = (Category)item.Tag; + category.IsEnabled = item.Checked; + } + + ToolboxProvider.SaveToolbox(); + } + + void componentListViewItemCheck(object sender, System.Windows.Forms.ItemCheckEventArgs e) + { + ToolComponent tc = (ToolComponent)((ListView)ControlDictionary["componentListView"]).Items[e.Index].Tag; + tc.IsEnabled = !tc.IsEnabled; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs new file mode 100644 index 0000000000..e1bb140238 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/CustomComponentsSideTab.cs @@ -0,0 +1,197 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Windows.Forms; +using System.Reflection; +using System.Collections; +using System.Drawing; +using System.Drawing.Design; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; + +using System.Security.Policy; +using System.Runtime.Remoting; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.Threading; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.FormDesigner.Services; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class CustomComponentsSideTab : SideTabDesigner + { + ArrayList projectAssemblies = new ArrayList(); + ArrayList referencedAssemblies = new ArrayList(); + + static bool loadReferencedAssemblies = true; + + ///Load an assembly's controls + public CustomComponentsSideTab(AxSideBar sideTab, string name, IToolboxService toolboxService) : base(sideTab,name, toolboxService) + { + ScanProjectAssemblies(); + ProjectService.EndBuild += new EventHandler(RescanProjectAssemblies2); + ProjectService.SolutionLoaded += new SolutionEventHandler(RescanProjectAssemblies); + } + + public static bool LoadReferencedAssemblies { + get { + return loadReferencedAssemblies; + } + set { + loadReferencedAssemblies = value; + } + } + + string loadingPath = String.Empty; + + byte[] GetBytes(string fileName) + { + FileStream fs = File.OpenRead(fileName); + long size = fs.Length; + byte[] outArray = new byte[size]; + fs.Read(outArray, 0, (int)size); + fs.Close(); + return outArray; + } + + Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) + { + string file = args.Name; + int idx = file.IndexOf(','); + if (idx >= 0) { + file = file.Substring(0, idx); + } + try { + if (File.Exists(loadingPath + file + ".exe")) { + return Assembly.Load(GetBytes(loadingPath + file + ".exe")); + } + if (File.Exists(loadingPath + file + ".dll")) { + return Assembly.Load(GetBytes(loadingPath + file + ".dll")); + } + } catch (Exception ex) { + Console.WriteLine("Can't load assembly : " + ex.ToString()); + } + return null; + } + +// public void ReloadProjectAssemblies(object sender, EventArgs e) +// { +// ScanProjectAssemblies(); +// AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); +// try { +// Items.Clear(); +// AddDefaultItem(); +// foreach (string assemblyName in projectAssemblies) { +// if ((assemblyName.EndsWith("exe") || assemblyName.EndsWith("dll")) && File.Exists(assemblyName)) { +// loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; +// try { +// if (loadReferencedAssemblies == true) { +// Assembly asm = Assembly.Load(Path.GetFileNameWithoutExtension(assemblyName)); +// BuildToolboxFromAssembly(asm); +// } +// } catch (Exception ex) { +// Console.WriteLine("Error loading Assembly " + assemblyName + " : " + ex.ToString()); +// } +// } +// } +// foreach (Assembly refAsm in referencedAssemblies) { +// try { +// BuildToolboxFromAssembly(refAsm); +// } catch (Exception ex) { +// Console.WriteLine("Error loading referenced Assembly " + refAsm + " : " + ex.ToString()); +// } +// } +// } catch (Exception ex) { +// Console.WriteLine("GOT EXCEPTION : " + ex.ToString()); +// } finally { +// AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(MyResolveEventHandler); +// } +// +// foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { +// FormDesignerDisplayBindingBase formDesigner = content.WorkbenchWindow.ActiveViewContent as FormDesignerDisplayBindingBase; +// if (formDesigner != null) { +// formDesigner.Control.Invoke(new ThreadStart(formDesigner.ReloadAndSelect), null); +// } +// } +// } + + Assembly LoadAssemblyFile(string assemblyName, bool nonLocking) + { + assemblyName = assemblyName.ToLower(); + if ((assemblyName.EndsWith("exe") || assemblyName.EndsWith("dll")) && File.Exists(assemblyName)) { + Assembly asm = nonLocking ? Assembly.Load(GetBytes(assemblyName)) : Assembly.LoadFrom(assemblyName); //Assembly.LoadFrom(assemblyName); + if (asm != null) { + BuildToolboxFromAssembly(asm); + } + return asm; + } + return null; + } + + void ScanProjectAssemblies() + { + projectAssemblies.Clear(); + referencedAssemblies.Clear(); + + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); + try { + + // custom user controls don't need custom images + loadImages = false; + ITypeResolutionService typeResolutionService = ToolboxProvider.TypeResolutionService; + if (ProjectService.OpenSolution != null) { + foreach (IProject project in ProjectService.OpenSolution.Projects) { + string assemblyName = project.OutputAssemblyFullPath; + projectAssemblies.Add(assemblyName); + loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; + + LoadAssemblyFile(assemblyName, true); + if (loadReferencedAssemblies == true) { +// TODO: project system... +// foreach (ProjectReference reference in projectEntry.Project.ProjectReferences) { +// if (reference.ReferenceType != ReferenceType.Gac && reference.ReferenceType != ReferenceType.Project) { +// assemblyName = reference.GetReferencedFileName(projectEntry.Project); +// loadingPath = Path.GetDirectoryName(assemblyName) + Path.DirectorySeparatorChar; +// Assembly asm = LoadAssemblyFile(assemblyName, true); +// if (asm != null) { +// referencedAssemblies.Add(asm); +// } +// } +// } + } + } + } + } catch (Exception e) { + Console.WriteLine("Exception : " + e); + } finally { + AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(MyResolveEventHandler); + } + } + + void RescanProjectAssemblies2(object sender, EventArgs e) + { + RescanProjectAssemblies(sender, null); + } + + void RescanProjectAssemblies(object sender, SolutionEventArgs e) + { + projectAssemblies.Clear(); + referencedAssemblies.Clear(); + Items.Clear(); + AddDefaultItem(); + ScanProjectAssemblies(); + SharpDevelopSideBar.SideBar.Refresh(); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ICSharpCode.SharpDevelop.FormDesigner.Gui.AssemblyList.resources b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ICSharpCode.SharpDevelop.FormDesigner.Gui.AssemblyList.resources new file mode 100644 index 0000000000..4e892e645f Binary files /dev/null and b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ICSharpCode.SharpDevelop.FormDesigner.Gui.AssemblyList.resources differ diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.ControlLibrariesPanel.resources b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.ControlLibrariesPanel.resources new file mode 100644 index 0000000000..4e892e645f Binary files /dev/null and b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.ControlLibrariesPanel.resources differ diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/OptionPanels/GridOptions.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/OptionPanels/GridOptions.cs new file mode 100644 index 0000000000..d794058539 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/OptionPanels/GridOptions.cs @@ -0,0 +1,63 @@ +// +// +// +// +// +// +using System; +using System.IO; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Gui; + + +namespace ICSharpCode.FormDesigner.Gui.OptionPanels +{ + public class GridOptionsPanel : AbstractOptionPanel + { + public override void LoadPanelContents() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.WindowsFormsGridOptions.xfrm")); + + ControlDictionary["widthTextBox"].Text = PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeWidth", 8).ToString(); + ControlDictionary["heightTextBox"].Text = PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeHeight", 8).ToString(); + ((CheckBox)ControlDictionary["showGridCheckBox"]).Checked = PropertyService.Get("FormsDesigner.DesignerOptions.ShowGrid", true); + ((CheckBox)ControlDictionary["snapToGridCheckBox"]).Checked = PropertyService.Get("FormsDesigner.DesignerOptions.SnapToGrid", true); + ((CheckBox)ControlDictionary["sortAlphabeticalCheckBox"]).Checked = PropertyService.Get("FormsDesigner.DesignerOptions.PropertyGridSortAlphabetical", false); + } + + public override bool StorePanelContents() + { + int width = 0; + try { + width = Int32.Parse(ControlDictionary["widthTextBox"].Text); + } catch (Exception e) { + Console.WriteLine(e); + MessageService.ShowError("Forms Designer grid with is invalid"); + return false; + } + + int height = 0; + try { + height = Int32.Parse(ControlDictionary["heightTextBox"].Text); + } catch (Exception e) { + Console.WriteLine(e); + MessageService.ShowError("Forms Designer height with is invalid"); + return false; + } + + PropertyService.Set("FormsDesigner.DesignerOptions.GridSizeWidth", width); + PropertyService.Set("FormsDesigner.DesignerOptions.GridSizeHeight", height); + PropertyService.Set("FormsDesigner.DesignerOptions.ShowGrid", ((CheckBox)ControlDictionary["showGridCheckBox"]).Checked); + PropertyService.Set("FormsDesigner.DesignerOptions.SnapToGrid", ((CheckBox)ControlDictionary["snapToGridCheckBox"]).Checked); + PropertyService.Set("FormsDesigner.DesignerOptions.PropertyGridSortAlphabetical", ((CheckBox)ControlDictionary["sortAlphabeticalCheckBox"]).Checked); + + return true; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/RenameCategoryDialog.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/RenameCategoryDialog.cs new file mode 100644 index 0000000000..c70feaca03 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/RenameCategoryDialog.cs @@ -0,0 +1,77 @@ +// created on 08.08.2003 at 13:02 +using System; +using System.Windows.Forms; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class RenameCategoryDialog : BaseSharpDevelopForm + { + string categoryName = String.Empty; + + public string CategoryName { + get { + return categoryName; + } + } + + public RenameCategoryDialog(string categoryName, Form owner) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.RenameSidebarCategoryDialog.xfrm")); + + this.Owner = owner; + + + if (categoryName == null) { + ControlDictionary["categoryNameTextBox"].Text = "New Category"; + Text = StringParser.Parse("${res:ICSharpCode.FormDesigner.Gui.RenameCategoryDialog.NewCategoryDialogName}"); + } else { + this.categoryName = categoryName; + ControlDictionary["categoryNameTextBox"].Text = categoryName; + Text = StringParser.Parse("${res:ICSharpCode.FormDesigner.Gui.RenameCategoryDialog.RenameCategoryDialogName}"); + } + ControlDictionary["okButton"].Click += new EventHandler(okButtonClick); + } + + protected override void SetupXmlLoader() + { + xmlLoader.StringValueFilter = new SharpDevelopStringValueFilter(); + xmlLoader.PropertyValueCreator = new SharpDevelopPropertyValueCreator(); + xmlLoader.ObjectCreator = new SharpDevelopObjectCreator(); + } + + void ShowDuplicateErrorMessage() + { + + MessageService.ShowError("${res:ICSharpCode.FormDesigner.Gui.RenameCategoryDialog.DuplicateNameError}"); + } + + // THIS METHOD IS MAINTAINED BY THE FORM DESIGNER + // DO NOT EDIT IT MANUALLY! YOUR CHANGES ARE LIKELY TO BE LOST + void okButtonClick(object sender, System.EventArgs e) + { + if (categoryName != ControlDictionary["categoryNameTextBox"].Text) { + foreach (Category cat in ToolboxProvider.ComponentLibraryLoader.Categories) { + if (cat.Name == ControlDictionary["categoryNameTextBox"].Text) { + ShowDuplicateErrorMessage(); + return; + } + } + + foreach (AxSideTab tab in SharpDevelopSideBar.SideBar.Tabs) { + if (!(tab is SideTabDesigner) && !(tab is CustomComponentsSideTab)) { + if (tab.Name == ControlDictionary["categoryNameTextBox"].Text) { + ShowDuplicateErrorMessage(); + return; + } + } + } + + categoryName = ControlDictionary["categoryNameTextBox"].Text; + } + DialogResult = System.Windows.Forms.DialogResult.OK; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ShowTabOrder/ITabOrder.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ShowTabOrder/ITabOrder.cs new file mode 100644 index 0000000000..134e0e2dfb --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ShowTabOrder/ITabOrder.cs @@ -0,0 +1,44 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; + +namespace ICSharpCode.FormDesigner +{ + /// + /// Interface defining the tab order mode.ning the tab order mode. + /// + public interface ITabOrder + { + /// + /// Checks if tab order mode is active + /// + bool IsTabOrderMode { get; } + + /// + /// Sets the next tab index if over a control. + /// + void SetNextTabIndex(Point p); + + /// + /// Sets the previous tab index if over a control. + /// + void SetPrevTabIndex(Point p); + + /// + /// Show tab order. + /// + void ShowTabOrder(); + + /// + /// Show tab order. + /// + void HideTabOrder(); + + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ShowTabOrder/TabIndexControl.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ShowTabOrder/TabIndexControl.cs new file mode 100644 index 0000000000..589f033be9 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/ShowTabOrder/TabIndexControl.cs @@ -0,0 +1,102 @@ +// +// +// +// +// +// + +using System; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using ICSharpCode.FormDesigner.Services; + +namespace ICSharpCode.FormDesigner +{ + /// + /// This class represents a visual feedback for the current tab index of a + /// form control. + /// + public class TabIndexControl : Control + { + static Color BACKCOLOR2 = Color.DarkViolet; // background color when changed + static Color BACKCOLOR = Color.DarkBlue; // normal background color + static Color TEXTCOLOR = Color.White; // text color + static Font TEXTFONT = new Font("Tahoma",8); // font for the tab index number text + static Size DEFSIZE = new Size(20, 20); // default (also minimum) size of the control + + protected Control associatedControl; // Associated form control + protected bool hasChanged = false; // indicates if tab index has changed. + + /// + /// Gets or sets that the tab index contro has changed the index + /// + public bool HasChanged { + get { + return hasChanged; + } + set { + hasChanged = value; + } + } + + public Control AssociatedControl { + get { + return associatedControl; + } + } + + /// + /// Creates a tab index control. + /// + public TabIndexControl(Control c) + { + associatedControl = c; + this.Size = DEFSIZE; + this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); + c.LocationChanged += new EventHandler(SetLocation); + c.TabIndexChanged += new EventHandler(RepaintOnTabIndexChange); + SetLocation(this, EventArgs.Empty); + } + + void RepaintOnTabIndexChange(object sender, EventArgs e) + { + HasChanged = true; + Refresh(); + } + + void SetLocation(object sender, EventArgs e) + { + this.Left = associatedControl.Left; + this.Top = associatedControl.Top; + } + + /// + /// Drawing code to draw the tab index number above the associated control. + /// + protected override void OnPaint(PaintEventArgs pe) + { + Graphics g = pe.Graphics; + + string tabIndexAsString = associatedControl.TabIndex.ToString(); + Size sz = Size.Round(g.MeasureString( tabIndexAsString,TEXTFONT)); + + this.Width = (sz.Width < DEFSIZE.Width )? DEFSIZE.Width : sz.Width; + this.Height = DEFSIZE.Height; + Rectangle r = new Rectangle(0,0,this.Width,this.Height); + + Color bkColor = ( hasChanged )? BACKCOLOR2 : BACKCOLOR; + g.FillRectangle(new SolidBrush(bkColor),r); + + StringFormat sf = new StringFormat(); + sf.Alignment = StringAlignment.Center; + sf.LineAlignment = StringAlignment.Center; + g.DrawString(tabIndexAsString, TEXTFONT, new SolidBrush(TEXTCOLOR), r, sf); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs new file mode 100644 index 0000000000..67a8a5b847 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabDesigner.cs @@ -0,0 +1,195 @@ +/* + * Module : FormDesigner + * + * Project : FormDesigner Loading Library Control. + * + * Source code altering : A1 + * + * Description : Creation of the SideTabDesigner which load controls from an assembly + * Use for FromDesigner. + * + * Denis ERCHOFF 22/01/2003 + */ + + +// Denis ERCHOFF 22/01/2003 BEGIN A1 + +using System; +using System.IO; +using System.Windows.Forms; +using System.Reflection; +using System.Collections; +using System.Drawing; +using System.Drawing.Design; +using System.ComponentModel; +using System.ComponentModel.Design; + +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class SideTabDesigner : AxSideTab + { + protected bool loadImages = true; + IToolboxService toolboxService; + + public void CreatedUserControl() + { + InitializeComponents(); + } + + void InitializeComponents() + { + } + + protected SideTabDesigner(AxSideBar sideBar, string name, IToolboxService toolboxService) : base(sideBar, name) + { + this.toolboxService = toolboxService; + this.CanSaved = false; + + AddDefaultItem(); + } + + protected void AddDefaultItem() + { + this.Items.Add(new SideTabItemDesigner()); + //Event the user click on an another "control" itemin the current tab + this.ChoosedItemChanged += new EventHandler(SelectedTabItemChanged); + } + + ///Load an assembly's controls + public SideTabDesigner(AxSideBar sideBar, Category category, IToolboxService toolboxService) : this(sideBar, category.Name, toolboxService) + { + foreach (ToolComponent component in category.ToolComponents) { + if (component.IsEnabled) { + ToolboxItem toolboxItem = new ToolboxItem(); + toolboxItem.TypeName = component.FullName; + toolboxItem.Bitmap = ToolboxProvider.ComponentLibraryLoader.GetIcon(component); + toolboxItem.DisplayName = component.Name; + Assembly asm = component.LoadAssembly(); + toolboxItem.AssemblyName = asm.GetName(); + + this.Items.Add(new SideTabItemDesigner(toolboxItem)); + } + } + } + + protected void LoadAssembly(string assemblyName) + { + Assembly assembly = FindAssembly(assemblyName); + if (assembly == null) { + assembly = Assembly.Load(assemblyName); + } + + if (assembly != null) { + BuildToolboxFromAssembly(assembly); + } + } + + protected void BuildToolboxFromAssembly(Assembly assembly) + { + ArrayList toolboxItems = GetToolboxItemsFromAssembly(assembly); + foreach (ToolboxItem toolboxItem in toolboxItems) { + //adding the toolboxitem into the tab with his bitmap and caption + //loaded from the assembly + this.Items.Add(new SideTabItemDesigner(toolboxItem)); + } + } + + + protected Assembly FindAssembly(string assemblyName) + { + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { + if (assembly.GetName().Name == assemblyName) { + return assembly; + } + } + return null; + } + + protected ArrayList GetToolboxItemsFromAssembly(Assembly assembly) + { + ArrayList toolBoxItems = new ArrayList(); + + Hashtable images = new Hashtable(); + ImageList il = new ImageList(); + // try to load res icon + string[] imgNames = assembly.GetManifestResourceNames(); + + foreach (string im in imgNames) { + try { + Stream stream = assembly.GetManifestResourceStream(im); + if (stream != null) { + Bitmap b = new Bitmap(Image.FromStream(stream)); + b.MakeTransparent(); + images[im] = il.Images.Count; + il.Images.Add(b); + stream.Close(); + } + } catch (Exception e) { + Console.WriteLine(e); + } + } + Module[] ms = assembly.GetModules(false); + foreach (Module m in ms) { + + Type[] ts = m.GetTypes(); + foreach (Type t in ts) { + if (t.IsPublic && !t.IsAbstract) { + if (t.IsDefined(typeof(ToolboxItemFilterAttribute), true) || t.IsDefined(typeof(ToolboxItemAttribute), true) || t.IsDefined(typeof(DesignTimeVisibleAttribute), true) || typeof(System.ComponentModel.IComponent).IsAssignableFrom(t)) { + + object[] filterAttrs = t.GetCustomAttributes(typeof(DesignTimeVisibleAttribute), true); + foreach (DesignTimeVisibleAttribute visibleAttr in filterAttrs) { + if (!visibleAttr.Visible) { + goto skip; + } + } + string imageName = String.Concat(t.FullName, ".bmp"); + if (images[imageName] == null) { + object[] attributes = t.GetCustomAttributes(false); + if (t.IsDefined(typeof(ToolboxBitmapAttribute), false)) { + foreach (object attr in attributes) { + if (attr is ToolboxBitmapAttribute) { + ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr; + Bitmap b = new Bitmap(toolboxBitmapAttribute.GetImage(t)); + b.MakeTransparent(); + il.Images.Add(b); + images[imageName] =b; + break; + } + } + } + } + + ToolboxItem item = new ToolboxItem(t); + + if (images[imageName] != null) { + try { + item.Bitmap = (Bitmap)images[imageName]; + } catch (Exception ex) { + Console.WriteLine("Exception converting bitmap : " + images[imageName] + " : " + ex.ToString()); + } + } + toolBoxItems.Add(item); + + skip:; + } + } + } + } + return toolBoxItems; + } + + void SelectedTabItemChanged(object sender, EventArgs e) + { + AxSideTabItem item = (sender as AxSideTab).ChoosedItem; + if (item == null) { + toolboxService.SetSelectedToolboxItem(null); + } else { + toolboxService.SetSelectedToolboxItem(item.Tag as ToolboxItem); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabItemDesigner.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabItemDesigner.cs new file mode 100644 index 0000000000..865ef7ce02 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Gui/SideTabItemDesigner.cs @@ -0,0 +1,78 @@ +/* + * Module : FormDesigner + * + * Project : FormDesigner Loading Library Control. + * + * Source code altering : A1 + * + * Description : création of the Tab item displayed into the AXSideTabDesigner control. + * the control's creator initialize the toolboxitem of the tab item + * + * Denis ERCHOFF 22/01/2003 + */ + + +// Denis ERCHOFF 22/01/2003 BEGIN A1 + +using System; +using System.Windows.Forms; +using System.Drawing.Design; +using System.Drawing; +using System.ComponentModel.Design; + +using ICSharpCode.Core; +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.FormDesigner.Gui +{ + public class SideTabItemDesigner : SharpDevelopSideTabItem + { + + public void CreatedUserControl() + { + InitializeComponents(); + } + + void InitializeComponents() + { + } + + ///create a tabitem from a toolboxitem. It init Icon and name from the tag + public SideTabItemDesigner(ToolboxItem tag) : base(tag.DisplayName, tag) + { + this.Icon = tag.Bitmap; + ReloadToolBox(); + } + + ///create a tabitem from a toolboxitem. It init Icon from the tag + public SideTabItemDesigner(string name, ToolboxItem tag) : base(name, tag) + { + this.Icon = tag.Bitmap; + ReloadToolBox(); + } + + ///create a default tabitem : a pointer icon with an empty toolboxitem + public SideTabItemDesigner() : base("Pointer") + { + + + + Bitmap pointerBitmap = new Bitmap(IconService.GetBitmap("Icons.16x16.FormsDesigner.PointerIcon"), 16, 16); +// ToolboxItem toolboxItemPointer = new ToolboxItem(); +// toolboxItemPointer.Bitmap = pointerBitmap; +// toolboxItemPointer.DisplayName = "Pointer"; + this.Icon = pointerBitmap; + this.Tag = null; //toolboxItemPointer; + ReloadToolBox(); + } + + ///it force to reload toolboxitem into the ToolboxService when the hostchange + public void ReloadToolBox() + { + if (this.Name != "Pointer") { + ToolboxProvider.ToolboxService.AddToolboxItem(this.Tag as ToolboxItem); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/AbstractMenuEditorControl.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/AbstractMenuEditorControl.cs new file mode 100644 index 0000000000..a2336da6c2 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/AbstractMenuEditorControl.cs @@ -0,0 +1,641 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Drawing.Drawing2D; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +//using ICSharpCode.FormDesigner.Services; +// +//using System.Drawing.Design; +// +//namespace ICSharpCode.FormDesigner { +// +// public enum ItemSelection { +// Last, +// First, +// Next, +// Prev +// } +// +// public abstract class AbstractMenuEditorControl : Panel +// { +// protected Menu menu; +// protected SizeF[] menuItemSize; +// protected RectangleF[] menuItemAreas; +// +// protected RectangleF typeArea; +// protected SizeF typeSize; +// protected string typeAreaText = "Type here"; +// +// protected IDesignerHost host; +// protected ItemEditor itemEditor = null; +// +// protected Control rootControl; +// protected SubMenuEditorControl subMenuEditor = null; +// +// protected int oldSelectedItem = -1; +// protected int selectedItem = -1; +// protected int mouseOverItem = -1; +// protected bool isMouseOverLeftSpacing = false; +// +// protected bool isHorizontal = true; +// protected bool canEditMenuItems = true; +// protected bool drawMenuGlyphs = false; +// protected Size borderSize = new Size(0, 0); +// +// public static bool MenuEditorFocused = false; +// public bool iveTheFocus; +// +// public int SelectedItem { +// get { +// return this.selectedItem; +// } +// set { +// this.oldSelectedItem = selectedItem; +// if (selectedItem != value) { +// selectedItem = value; +// Refresh(); +// } +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// if (menu != null && selectedItem >= 0 && selectedItem < menu.MenuItems.Count) { +// selectionService.SetSelectedComponents(new object[] { menu.MenuItems[selectedItem] }); +// } else { +// selectionService.SetSelectedComponents(null); +// } +// } +// } +// +// protected override void OnGotFocus(EventArgs e) +// { +// base.OnGotFocus(e); +// MenuEditorFocused = true; +// iveTheFocus = true; +// Refresh(); +// } +// +// protected override void OnLostFocus(EventArgs e) +// { +// base.OnLostFocus(e); +// iveTheFocus = false; +//// SelectedItem = -1; +// Refresh(); +// } +// +// protected override Size DefaultSize { +// get { +// return new Size(320, System.Windows.Forms.SystemInformation.MenuHeight + 2); +// } +// } +// +// protected AbstractMenuEditorControl(IDesignerHost host, Menu menu) +// { +// this.host = host; +// this.menu = menu; +// rootControl = (Control)host.RootComponent; +// rootControl.Resize += new EventHandler(SetSize); +// SetSize(null, null); +// this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); +// } +// +// public virtual void SetSize(object sender, EventArgs e) +// { +// int boundsLeftRightOffset = 0; +// int boundsTopOffset = 0; +// +// if (rootControl is Form) { +// Form f = (Form)rootControl; +// switch (f.FormBorderStyle) { +// case FormBorderStyle.Fixed3D: +// boundsLeftRightOffset = SystemInformation.Border3DSize.Width + SystemInformation.FixedFrameBorderSize.Width; +// break; +// +// case FormBorderStyle.FixedDialog: +// case FormBorderStyle.FixedSingle: +// case FormBorderStyle.FixedToolWindow: +// boundsLeftRightOffset = SystemInformation.FixedFrameBorderSize.Width; +// break; +// +// case FormBorderStyle.Sizable: +// case FormBorderStyle.SizableToolWindow: +// boundsLeftRightOffset = SystemInformation.FrameBorderSize.Width; +// break; +// } +// +// switch (f.FormBorderStyle) { +// case FormBorderStyle.Fixed3D: +// case FormBorderStyle.FixedDialog: +// case FormBorderStyle.FixedSingle: +// boundsTopOffset = SystemInformation.FixedFrameBorderSize.Height + SystemInformation.CaptionHeight; +// break; +// +// case FormBorderStyle.Sizable: +// boundsTopOffset = SystemInformation.FrameBorderSize.Height + SystemInformation.CaptionHeight; +// break; +// +// case FormBorderStyle.SizableToolWindow: +// boundsTopOffset = SystemInformation.FrameBorderSize.Height + SystemInformation.ToolWindowCaptionHeight; +// break; +// case FormBorderStyle.FixedToolWindow: +// boundsTopOffset = SystemInformation.FixedFrameBorderSize.Height + SystemInformation.ToolWindowCaptionHeight; +// break; +// } +// } +// +// SetBounds(rootControl.Bounds.Left + boundsLeftRightOffset, +// rootControl.Bounds.Top + boundsTopOffset, +// rootControl.Bounds.Width - boundsLeftRightOffset * 2, +// System.Windows.Forms.SystemInformation.MenuHeight + 2); +// Show(); +// } +// +// protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent) +// { +// Graphics g = pevent.Graphics; +// g.FillRectangle(new SolidBrush(SystemColors.Menu), +// pevent.ClipRectangle.X, +// pevent.ClipRectangle.Y, +// pevent.ClipRectangle.Width, +// pevent.ClipRectangle.Height); +// } +// +// int GetLeftSpacing() +// { +// return drawMenuGlyphs ? SystemInformation.MenuHeight : 0; +// } +// int GetRightSpacing() +// { +// return drawMenuGlyphs ? SystemInformation.MenuHeight : 0; +// } +// int GetLeftRightSpacing() +// { +// return GetLeftSpacing() + GetRightSpacing(); +// } +// +// protected virtual void MeasureMenuItems() +// { +// Graphics g = null; +// try { +// g = base.CreateGraphics(); +// } catch (Exception e) { +// Console.WriteLine("Got exception : " + e.ToString()); +// return; +// } +// +// Font f = System.Windows.Forms.SystemInformation.MenuFont; +// +// menuItemAreas = new RectangleF[menu.MenuItems.Count]; +// +// float curX = 0; +// float curY = 0; +// float maxWidth = 0; +// menuItemSize = new SizeF[menu.MenuItems.Count]; +// for (int i = 0; i < menu.MenuItems.Count; ++i) { +// menuItemSize[i] = g.MeasureString(menu.MenuItems[i].Text + "min", f); +// menuItemSize[i].Height += 2; +// maxWidth = Math.Max(maxWidth, menuItemSize[i].Width + GetLeftRightSpacing()); +// } +// +// typeSize = g.MeasureString(typeAreaText, f); +// typeSize.Height += 2; +// maxWidth = Math.Max(maxWidth, typeSize.Width + GetLeftRightSpacing()); +// +// for (int i = 0; i < menu.MenuItems.Count; ++i) { +// menuItemAreas[i] = new RectangleF(curX + this.borderSize.Width, +// curY + this.borderSize.Height, +// isHorizontal ? menuItemSize[i].Width : maxWidth, +// SystemInformation.MenuHeight); +// +// if (this.isHorizontal) { +// curX += menuItemAreas[i].Width + 4; +// } else { +// curY += menuItemAreas[i].Height; +// } +// } +// +// typeArea = new RectangleF(curX + this.borderSize.Width, +// curY + this.borderSize.Height, +// isHorizontal ? typeSize.Width : maxWidth, +// SystemInformation.MenuHeight); +// +// g.Dispose(); +// } +// +// protected void DrawTypeHere(Graphics g, bool isSelected, bool isMouseOver) +// { +// int yOffset = (int)((typeArea.Height - typeSize.Height) / 2); +// +// if (isSelected && iveTheFocus) { +// DrawSelcectionRectangle(g, typeArea, isMouseOver, false, true); +// } else { +// g.FillRectangle(new SolidBrush(Color.White), +// (int)typeArea.X + 2, +// (int)typeArea.Y + yOffset, +// (int)typeArea.Width - 4, +// (int)typeSize.Height); +// +// g.DrawRectangle(new Pen(Color.Gray), +// (int)typeArea.X + 2, +// (int)typeArea.Y + yOffset, +// (int)typeArea.Width - 4, +// (int)typeSize.Height); +// } +// +// +// g.DrawString(typeAreaText, +// SystemInformation.MenuFont, +// SystemBrushes.InactiveBorder, +// (int)typeArea.X + this.GetLeftSpacing(), +// (int)typeArea.Y + yOffset); +// } +// +// protected void DrawSelcectionRectangle(Graphics g, RectangleF drawArea, bool isMouseOver, bool mouseOverLeft, bool alwaysSelectAll) +// { +// g.FillRectangle(SystemBrushes.Highlight, +// (int)drawArea.X + 2, +// (int)drawArea.Y + 2, +// (int)drawArea.Width - 3, +// (int)drawArea.Height - 3); +// +// if (isMouseOver) { +// if (mouseOverLeft) { +// g.DrawRectangle(new Pen(Color.White), +// (int)drawArea.X + 2, +// (int)drawArea.Y + 2, +// (int)this.GetLeftSpacing() - 3, +// (int)drawArea.Height - 3); +// } else { +// if (this.drawMenuGlyphs && !alwaysSelectAll) { +// g.DrawRectangle(new Pen(Color.White), +// (int)drawArea.X + this.GetLeftSpacing(), +// (int)drawArea.Y + 2, +// (int)drawArea.Width - 1 - this.GetLeftSpacing() - 1, +// (int)drawArea.Height - 3); +// } else { +// g.DrawRectangle(new Pen(Color.White), +// (int)drawArea.X + 2, +// (int)drawArea.Y + 2, +// (int)drawArea.Width - 3, +// (int)drawArea.Height - 3); +// } +// } +// } +// +// g.DrawRectangle(new Pen(new HatchBrush(HatchStyle.Percent50, SystemColors.Highlight, SystemColors.Menu)), +// (int)drawArea.X, +// (int)drawArea.Y, +// (int)drawArea.Width, +// (int)drawArea.Height); +// } +// +// protected void DrawItem(Graphics g, int i, bool isSelected, bool isMouseOver) +// { +// Brush drawBrush = SystemBrushes.ControlText; +// if (isSelected && iveTheFocus) { +// DrawSelcectionRectangle(g, menuItemAreas[i], isMouseOver, isMouseOverLeftSpacing, menu.MenuItems[i].MenuItems.Count > 0); +// drawBrush = SystemBrushes.HighlightText; +// } +// +// int yOffset = (int)((menuItemAreas[i].Height - menuItemSize[i].Height) / 2); +// g.DrawString(menu.MenuItems[i].Text, +// SystemInformation.MenuFont, +// drawBrush, +// (int)menuItemAreas[i].X + this.GetLeftSpacing(), +// (int)menuItemAreas[i].Y + yOffset + 1); +// +// if (drawMenuGlyphs) { +// int r = SystemInformation.MenuHeight; +// if (menu.MenuItems[i].Checked) { +// ControlPaint.DrawMenuGlyph(g, (int)menuItemAreas[i].X, +// (int)menuItemAreas[i].Y, +// r, r, MenuGlyph.Checkmark); +// } +// if (menu.MenuItems[i].MenuItems.Count > 0) { +// ControlPaint.DrawMenuGlyph(g, (int)(menuItemAreas[i].Right - r), +// (int)(menuItemAreas[i].Y), +// r, r, MenuGlyph.Arrow); +// } +// } +// } +// +// protected override void OnPaint(PaintEventArgs pe) +// { +// Graphics g = pe.Graphics; +// Font f = System.Windows.Forms.SystemInformation.MenuFont; +// +// MeasureMenuItems(); +// +// for (int i = 0; i < menu.MenuItems.Count; ++i) { +// DrawItem(g, i, this.selectedItem == i, i == mouseOverItem); +// } +// +// if (MenuEditorFocused) { +// DrawTypeHere(g, this.selectedItem == menu.MenuItems.Count, mouseOverItem == menu.MenuItems.Count); +// ShowSubMenuEditor(); +// } +// } +// +// public void CloseSubMenuEditor() +// { +// if (this.subMenuEditor != null) { +// try { +// subMenuEditor.Parent.Controls.Remove(subMenuEditor); +// } catch (Exception e) { +// Console.WriteLine(e); +// } +// subMenuEditor.Parent = null; +// try { +// this.subMenuEditor.Dispose(); +// this.subMenuEditor = null; +// } catch (Exception e) { +// Console.WriteLine(e); +// } +// } +// } +// +// protected override void Dispose(bool disposing) +// { +// base.Dispose(disposing); +// CloseSubMenuEditor(); +// } +// +// protected virtual void ShowSubMenuEditor() +// { +// if (this.selectedItem >= 0 && this.selectedItem < menu.MenuItems.Count) { +// if (menu.MenuItems[this.selectedItem].Checked) { +// CloseSubMenuEditor(); +// } else { +// if (subMenuEditor == null || subMenuEditor.menu != menu.MenuItems[this.selectedItem]) { +// SubMenuEditorControl panel = new SubMenuEditorControl(host, this, menu.MenuItems[this.selectedItem]); +// panel.Location = GetSubmenuLocation(this.selectedItem); +// rootControl.Parent.Controls.Add(panel); +// panel.BringToFront(); +// if (this.subMenuEditor != null) { +// CloseSubMenuEditor(); +// } +// this.subMenuEditor = panel; +// } +// } +// } else if (this.selectedItem == menu.MenuItems.Count) { +// CloseSubMenuEditor(); +// } +// } +// +// protected virtual Point GetSubmenuLocation(int menuIndex) +// { +// // implementation for a top leven menu +// RectangleF r; +// if (menuItemAreas == null || menuIndex >= menu.MenuItems.Count || menuIndex < 0) { +// r = typeArea; +// } else { +// r = menuItemAreas[menuIndex]; +// } +// +// return new Point((int)(Left + r.X), +// (int)(Top + SystemInformation.MenuHeight)); +// } +// +// int GetItemIndex(int x, int y) +// { +// if (menuItemAreas != null) { +// for (int i = 0; i < menuItemAreas.Length; ++i) { +// if (menuItemAreas[i].Contains(x, y)) { +// return i; +// } +// } +// } +// return -1; +// } +// +// protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) +// { +// int itemIndex = GetItemIndex(e.X, e.Y); +// AbstractMenuEditorControl.MenuEditorFocused = true; +// +// Select(); +// if (itemIndex == -1 && typeArea.Contains(e.X, e.Y)) { +// SelectedItem = menu.MenuItems.Count; +// } else { +// SelectedItem = itemIndex; +// } +// } +// +// protected override void OnMouseLeave(System.EventArgs e) +// { +// base.OnMouseLeave(e); +// if (-1 != mouseOverItem) { +// mouseOverItem = -1; +// Refresh(); +// } +// } +// +// +// protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e) +// { +// int itemIndex = GetItemIndex(e.X, e.Y); +// +// int newMouseOver; +// bool newIsMouseOverLeftSpacing = e.X < GetLeftSpacing(); +// +// if (itemIndex == -1 && typeArea.Contains(e.X, e.Y)) { +// newMouseOver = menu.MenuItems.Count; +// newIsMouseOverLeftSpacing = false; +// } else { +// newMouseOver = itemIndex; +// if (itemIndex >= 0 && itemIndex < menu.MenuItems.Count) { +// newIsMouseOverLeftSpacing &= menu.MenuItems[itemIndex].MenuItems.Count == 0; +// } +// } +// +// if (newMouseOver != mouseOverItem || newIsMouseOverLeftSpacing != isMouseOverLeftSpacing) { +// mouseOverItem = newMouseOver; +// isMouseOverLeftSpacing = newIsMouseOverLeftSpacing; +// Refresh(); +// } +// } +// +// +// protected override void OnMouseUp(MouseEventArgs e) +// { +// base.OnMouseUp(e); +// if (oldSelectedItem == selectedItem) { +// int itemIndex = GetItemIndex(e.X, e.Y); +// +// if (itemIndex == -1 && typeArea.Contains(e.X, e.Y)) { +//// if (menu.MenuItems.Count == selectedItem) { +//// EditMode(menu.MenuItems.Count); +//// } +// } else { +// if (itemIndex == selectedItem && itemIndex != -1) { +// if (isMouseOverLeftSpacing) { +// menu.MenuItems[itemIndex].Checked = !menu.MenuItems[itemIndex].Checked; +// Refresh(); +// } else { +// EditMode(itemIndex); +// } +// } +// } +// } +// } +// +// protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e) +// { +// base.OnKeyPress(e); +// EditMode(selectedItem); +// if (itemEditor != null) { +// itemEditor.Text = String.Empty; +// itemEditor.AppendText(e.KeyChar.ToString()); +// } +// } +// +// protected override bool ProcessDialogKey(System.Windows.Forms.Keys keyData) +// { +// switch (keyData) { +// case Keys.Home: +// SelectItem(ItemSelection.First); +// return true; +// case Keys.End: +// SelectItem(ItemSelection.Last); +// return true; +// case Keys.Return: +// EditMode(this.SelectedItem); +// return true; +// case Keys.Left: +// SelectItem(ItemSelection.Prev); +// return true; +// case Keys.Right: +// SelectItem(ItemSelection.Next); +// return true; +// case Keys.Up: +// if (subMenuEditor != null) { +// subMenuEditor.Focus(); +// subMenuEditor.SelectItem(ItemSelection.Last); +// } +// return true; +// case Keys.Down: +// if (subMenuEditor != null) { +// subMenuEditor.Focus(); +// subMenuEditor.SelectItem(ItemSelection.First); +// } +// return true; +// case Keys.Escape: { +// SelectedItem = -1; +// AbstractMenuEditorControl.MenuEditorFocused = false; +// Refresh(); +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// selectionService.SetSelectedComponents(new object[] { host.RootComponent }); +// return true; +// } +// case Keys.Back: +// case Keys.Delete: { +// if (itemEditor != null && !itemEditor.Focused) { +// DeleteCommand(); +// return true; +// } +// break; +// } +// +// } +// return base.ProcessDialogKey(keyData); +// } +// public void DeleteCommand() +// { +// if (selectedItem >= 0 && selectedItem < menu.MenuItems.Count) { // && subMenuEditor == null +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// if (selectedItem == 0) { +// selectionService.SetSelectedComponents(new object[] { }); +// } else { +// selectionService.SetSelectedComponents(new object[] { menu.MenuItems[selectedItem - 1] }); +// } +// ComponentChangeService componentChangeService = (ComponentChangeService)host.GetService(typeof(IComponentChangeService)); +// +// PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(menu); +// System.ComponentModel.PropertyDescriptor myProperty = properties.Find("MenuItems", false); +// +// object[] oldArray = new object[menu.MenuItems.Count]; +// menu.MenuItems.CopyTo(oldArray, 0); +// MenuItem item = menu.MenuItems[selectedItem]; +// +// DesignerTransaction transaction = host.CreateTransaction("remove menu item"); +// componentChangeService.OnComponentChanging(menu, myProperty); +// menu.MenuItems.Remove(item); +// componentChangeService.OnComponentChanged(menu, myProperty, oldArray, menu.MenuItems); +// +// host.DestroyComponent(item); +// transaction.Commit(); +// SetSize(null, null); +// Refresh(); +// } +// } +// +// public void SelectItem(ItemSelection selection) +// { +// switch (selection) { +// case ItemSelection.Last: +// SelectedItem = menu.MenuItems.Count; +// break; +// case ItemSelection.First: +// SelectedItem = 0; +// break; +// case ItemSelection.Next: +// this.SelectedItem = (SelectedItem == menu.MenuItems.Count ? 0 : selectedItem + 1); +// break; +// case ItemSelection.Prev: +// this.SelectedItem = (SelectedItem == 0 ? menu.MenuItems.Count : selectedItem - 1); +// break; +// } +// } +// +// void EditMode(int itemNumber) +// { +// if (itemNumber < 0 || !canEditMenuItems) { +// return; +// } +// try { +// itemEditor = new ItemEditor(this); +// RectangleF r = itemNumber >= menu.MenuItems.Count ? this.typeArea : menuItemAreas[itemNumber]; +// SizeF s = itemNumber >= menu.MenuItems.Count ? this.typeSize : menuItemSize[itemNumber]; +// int yOffset = (int)((r.Height - s.Height) / 2); +// itemEditor.SetBounds((int)r.X + 2 + this.GetLeftSpacing(), +// (int)r.Y + yOffset, +// (int)r.Width - 4, +// (int)r.Height); +// +// if (itemNumber >= menu.MenuItems.Count) { +// DesignerTransaction transaction = host.CreateTransaction("create menu item"); +// ComponentChangeService componentChangeService = (ComponentChangeService)host.GetService(typeof(IComponentChangeService)); +// MenuItem newItem = (MenuItem)host.CreateComponent(typeof(MenuItem)); +// componentChangeService.OnComponentAdding(newItem); +// +// newItem.Text = newItem.Site.Name; +// menu.MenuItems.Add(newItem); +// componentChangeService.OnComponentAdded(newItem); +// transaction.Commit(); +// MeasureMenuItems(); +// } +// itemEditor.SetItem(menu.MenuItems[itemNumber]); +// base.Controls.Add(itemEditor); +// MenuEditorFocused = true; +// itemEditor.Select(); +// MenuEditorFocused = true; +// Refresh(); +// } catch (Exception e) { +// Console.WriteLine(e); +// if (itemEditor != null) { +// base.Controls.Remove(itemEditor); +// itemEditor.Dispose(); +// itemEditor = null; +// } +// } +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/ContextMenuEditorControl.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/ContextMenuEditorControl.cs new file mode 100644 index 0000000000..67284d6528 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/ContextMenuEditorControl.cs @@ -0,0 +1,71 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +// +//using System.Drawing.Design; +// +//namespace ICSharpCode.FormDesigner { +// +// public class ContextMenuEditorControl : AbstractMenuEditorControl +// { +// public ContextMenuEditorControl(IDesignerHost host, Menu menu) : base(host, menu) +// { +// typeAreaText = "Context Menu"; +// canEditMenuItems = false; +// MeasureMenuItems(); +// } +// +// protected override void OnLostFocus(EventArgs e) +// { +// MenuEditorFocused = base.subMenuEditor != null && !subMenuEditor.iveTheFocus; +// base.OnLostFocus(e); +// } +// +// protected override void MeasureMenuItems() +// { +// Graphics g = base.CreateGraphics(); +// Font f = System.Windows.Forms.SystemInformation.MenuFont; +// +// typeSize = g.MeasureString(typeAreaText, f); +// typeArea = new RectangleF(this.borderSize.Width, +// this.borderSize.Height, +// typeSize.Width, +// SystemInformation.MenuHeight); +// g.Dispose(); +// } +// +// protected override void OnPaint(PaintEventArgs pe) +// { +// MeasureMenuItems(); +// DrawTypeHere(pe.Graphics, this.selectedItem == menu.MenuItems.Count, mouseOverItem == menu.MenuItems.Count); +// if (MenuEditorFocused) { +// ShowSubMenuEditor(); +// } +// } +// +// protected override void ShowSubMenuEditor() +// { +// if (this.selectedItem >= 0) { +// SubMenuEditorControl panel = new SubMenuEditorControl(host, this, menu); +// panel.Location = GetSubmenuLocation(this.selectedItem); +// panel.Parent = rootControl.Parent; +// panel.BringToFront(); +// panel.Select(); +// CloseSubMenuEditor(); +// this.subMenuEditor = panel; +// } +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/ItemEditor.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/ItemEditor.cs new file mode 100644 index 0000000000..8d64670331 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/ItemEditor.cs @@ -0,0 +1,81 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +// +//using System.Drawing.Design; +// +//namespace ICSharpCode.FormDesigner +//{ +// public class ItemEditor : TextBox +// { +// MenuItem item = null; +// AbstractMenuEditorControl motherEditor; +// bool isEscape = false; +// +// public ItemEditor(AbstractMenuEditorControl motherEditor) +// { +// this.motherEditor = motherEditor; +// base.BorderStyle = BorderStyle.None; +// } +// +// protected override bool ProcessDialogKey(System.Windows.Forms.Keys keyData) +// { +// switch (keyData) { +// case Keys.Escape: +// isEscape = true; +// CloseItemEditor(); +// return true; +// case Keys.Return: +// try { +// item.Text = Text; +// } catch (Exception e) { +// Console.WriteLine(e); +// } +// CloseItemEditor(); +// return true; +// } +// return base.ProcessDialogKey(keyData); +// } +// +// protected override void OnLostFocus(System.EventArgs e) +// { +// if (!isEscape) { +// try { +// item.Text = Text; +// } catch (Exception ex) { +// Console.WriteLine(ex); +// } +// CloseItemEditor(); +// } +// } +// +// void CloseItemEditor() +// { +// base.Dispose(); +// motherEditor.SetSize(null, null); +// motherEditor.Invalidate(); +// motherEditor.Update(); +// } +// +// public void SetItem(MenuItem item) +// { +// this.item = item; +// this.Text = item.Text; +// AbstractMenuEditorControl.MenuEditorFocused = true; +// } +// +// +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MainMenuEditorControl.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MainMenuEditorControl.cs new file mode 100644 index 0000000000..f8dd36c2f3 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MainMenuEditorControl.cs @@ -0,0 +1,33 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +// +//using System.Drawing.Design; +// +//namespace ICSharpCode.FormDesigner { +// +// public class MainMenuEditorControl : AbstractMenuEditorControl +// { +// public MainMenuEditorControl(IDesignerHost host, Menu menu) : base(host, menu) +// { +// } +// +// protected override void OnLostFocus(EventArgs e) +// { +// MenuEditorFocused = base.subMenuEditor != null && !subMenuEditor.iveTheFocus; +// base.OnLostFocus(e); +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MenuDesigner.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MenuDesigner.cs new file mode 100644 index 0000000000..869a442a5c --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MenuDesigner.cs @@ -0,0 +1,52 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +// +//using System.Drawing.Design; +//using ICSharpCode.FormDesigner; +// +//namespace Microsoft.VisualStudio.Windows.Forms { +// +// public class MenuDesigner : ComponentDesigner +// { +// DesignerVerbCollection designerVerbCollection = new DesignerVerbCollection(); +// +// public override void DoDefaultAction() +// { +// Console.WriteLine("MenuDesigner.DoDefaultAction"); +// } +// +// public override void Initialize(IComponent component) +// { +// base.Initialize(component); +// } +// +// public override ICollection AssociatedComponents { +// get { +// Menu menu = base.Component as Menu; +// if (menu != null) { +// return menu.MenuItems; +// } +// return null; +// } +// } +// +// public override DesignerVerbCollection Verbs { +// get { +// return designerVerbCollection; +// } +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MenuEditorService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MenuEditorService.cs new file mode 100644 index 0000000000..f2f12d8a18 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/MenuEditorService.cs @@ -0,0 +1,134 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +// +//using System.Drawing.Design; +// +//namespace ICSharpCode.FormDesigner { +// +// public class MenuEditorService : IMenuEditorService +// { +// IDesignerHost host; +// bool isActive = false; +// +// AbstractMenuEditorControl menuEditorControl = null; +// Menu menu; +// +// public IDesignerHost Host { +// get { +// return host; +// } +// set { +// host = value; +// } +// } +// +// public AbstractMenuEditorControl MenuEditorControl { +// get { +// return menuEditorControl; +// } +// } +// +// +// public MenuEditorService(IDesignerHost host) +// { +// this.host = host; +// Initialize(); +// } +// +// void Initialize() +// { +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// selectionService.SelectionChanged += new EventHandler(HandleSelectionChange); +// } +// +// void HandleSelectionChange(object sender, EventArgs e) +// { +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// Menu selectedMenu = selectionService.PrimarySelection as Menu; +// +// if (selectedMenu != null) { +// if (menu != selectedMenu && (selectedMenu is MainMenu || selectedMenu is ContextMenu)) { +// DisposeMenuEditorControl(); +// this.menu = selectedMenu; +// InitMenuEditorControl(); +// } +// } else { +// if (menuEditorControl != null && selectionService.PrimarySelection != null) { +// AbstractMenuEditorControl.MenuEditorFocused = false; +// menuEditorControl.CloseSubMenuEditor(); +// menuEditorControl.Refresh(); +// } +// } +// } +// +// public void Dispose() +// { +// } +// +// void DisposeMenuEditorControl() +// { +// if (menuEditorControl != null) { +// menuEditorControl.Dispose(); +// menuEditorControl = null; +// } +// } +// +// void InitMenuEditorControl() +// { +// Control rootComponent = host.RootComponent as Control; +// if (rootComponent != null) { +// menuEditorControl = (menu is MainMenu) ? (AbstractMenuEditorControl)new MainMenuEditorControl(host, menu) : +// (AbstractMenuEditorControl)new ContextMenuEditorControl(host, menu); +// rootComponent.Parent.Controls.Add(menuEditorControl); +// menuEditorControl.BringToFront(); +// } +// } +// +// +//#region System.Windows.Forms.Design.IMenuEditorService interface implementation +// public bool IsActive() +// { +// return isActive; +// } +// +// public bool MessageFilter(ref System.Windows.Forms.Message m) +// { +// return false; +// } +// +// public void SetSelection(System.Windows.Forms.MenuItem item) +// { +// Console.WriteLine("!!!TODO!!! SET SELECTION TO : " + item); +// } +// +// public void SetMenu(System.Windows.Forms.Menu menu) +// { +// this.menu = menu; +// isActive = menu != null; +// if (isActive) { +// InitMenuEditorControl(); +// } else { +// DisposeMenuEditorControl(); +// } +// } +// +// public System.Windows.Forms.Menu GetMenu() +// { +// return menu; +// } +//#endregion +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/SubMenuEditorControl.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/SubMenuEditorControl.cs new file mode 100644 index 0000000000..64305c3c9f --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/MenuDesigner/SubMenuEditorControl.cs @@ -0,0 +1,139 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.Diagnostics; +//using System.Drawing; +//using System.Collections; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Windows.Forms; +//using System.Windows.Forms.Design; +// +//using System.Drawing.Design; +// +//namespace ICSharpCode.FormDesigner { +// +// public class SubMenuEditorControl : AbstractMenuEditorControl +// { +// AbstractMenuEditorControl owner; +// +// public SubMenuEditorControl(IDesignerHost host, AbstractMenuEditorControl owner, Menu menu) : base(host, menu) +// { +// isHorizontal = false; +// drawMenuGlyphs = true; +// borderSize = SystemInformation.FrameBorderSize; +// SetSize(null, null); +// this.owner = owner; +// } +// +// public override void SetSize(object sender, EventArgs e) +// { +// try { +// MeasureMenuItems(); +// int maxWidth = (int)base.typeArea.Width + base.borderSize.Width * 2; +// foreach (RectangleF rect in menuItemAreas) { +// maxWidth = (int)Math.Max(maxWidth, rect.Width + base.borderSize.Width * 2); +// } +// +// Size = new Size(maxWidth, base.borderSize.Height * 2 + SystemInformation.MenuHeight * (menu.MenuItems.Count + 1)); +// +// if (subMenuEditor != null) { +// subMenuEditor.Location = GetSubmenuLocation(this.selectedItem); +// } +// } catch (Exception ex) { +// Console.WriteLine(ex); +// if (Parent != null) { +// Parent.Controls.Remove(this); +// } +// } +// } +// +// protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent) +// { +// base.OnPaintBackground(pevent); +// ControlPaint.DrawBorder3D(pevent.Graphics, new Rectangle(0, 0, Width, Height), Border3DStyle.Raised); +// } +// +// protected override Point GetSubmenuLocation(int menuIndex) +// { +// RectangleF r; +// if (menuItemAreas == null || menuIndex >= menu.MenuItems.Count || menuIndex < 0) { +// r = base.typeArea; +// } else { +// r = base.menuItemAreas[menuIndex]; +// } +// return new Point((int)(Right - 2), +// (int)(Top + r.Y)); +// } +// +// +// protected override bool ProcessDialogKey(System.Windows.Forms.Keys keyData) +// { +// switch (keyData) { +// case Keys.Up: +// if (SelectedItem == 0) { +// if (!(owner is SubMenuEditorControl)) { +// owner.Focus(); +// } else { +// SelectedItem = menu.MenuItems.Count; +// } +// } else { +// SelectItem(ItemSelection.Prev); +// } +// Refresh(); +// return true; +// case Keys.Down: +// if (SelectedItem >= menu.MenuItems.Count) { +// if (!(owner is SubMenuEditorControl)) { +// owner.Focus(); +// } else { +// SelectedItem = 0; +// } +// } else { +// SelectItem(ItemSelection.Next); +// } +// Refresh(); +// return true; +// case Keys.Escape: +// owner.CloseSubMenuEditor(); +// owner.Focus(); +// return true; +// case Keys.Left: { +// AbstractMenuEditorControl topLevel = GetTopLevelMenuControl(); +// if (topLevel == owner) { +// topLevel.Focus(); +// topLevel.SelectItem(ItemSelection.Prev); +// } else { +// goto case Keys.Escape; +// } +// return true; +// } +// case Keys.Right: +// if (base.subMenuEditor != null) { +// subMenuEditor.Focus(); +// subMenuEditor.SelectItem(ItemSelection.First); +// } else { +// AbstractMenuEditorControl topLevel = GetTopLevelMenuControl(); +// topLevel.Focus(); +// topLevel.SelectItem(ItemSelection.Next); +// } +// return true; +// } +// return base.ProcessDialogKey(keyData); +// } +// +// AbstractMenuEditorControl GetTopLevelMenuControl() +// { +// AbstractMenuEditorControl curControl = owner; +// while (curControl is SubMenuEditorControl) { +// curControl = ((SubMenuEditorControl)curControl).owner; +// } +// return curControl; +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DefaultServiceContainer.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DefaultServiceContainer.cs new file mode 100644 index 0000000000..91d1d5d81b --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DefaultServiceContainer.cs @@ -0,0 +1,116 @@ +// +// +// +// +// +// + +using System; +using System.Reflection; +using System.Collections; +using System.Collections.Specialized; +using System.Drawing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Windows.Forms.Design; + +namespace ICSharpCode.FormDesigner.Services +{ + public class DefaultServiceContainer : IServiceContainer, IDisposable + { + IServiceContainer serviceContainer; + ArrayList services = new ArrayList(); + + public DefaultServiceContainer() + { + serviceContainer = new ServiceContainer(); + } + + public DefaultServiceContainer(IServiceContainer parent) + { + serviceContainer = new ServiceContainer(parent); + } + + #region System.IDisposable interface implementation + public virtual void Dispose() + { + foreach (object o in services) { + if (o == this) { + continue; + } + // || o.GetType().Assembly != Assembly.GetCallingAssembly() + IDisposable disposeMe = o as IDisposable; + if (disposeMe != null) { + try { + disposeMe.Dispose(); + } catch (Exception e) { + Console.WriteLine("Exception while disposing " + disposeMe + ":" + e.ToString()); + } + } + } + services.Clear(); + services = null; + } + #endregion + + #region System.ComponentModel.Design.IServiceContainer interface implementation + public void RemoveService(System.Type serviceType, bool promote) + { + serviceContainer.RemoveService(serviceType, promote); + } + + public void RemoveService(System.Type serviceType) + { + serviceContainer.RemoveService(serviceType); + } + + public void AddService(System.Type serviceType, System.ComponentModel.Design.ServiceCreatorCallback callback, bool promote) + { + if (IsServiceMissing(serviceType)) { + serviceContainer.AddService(serviceType, callback, promote); + } + } + + public void AddService(System.Type serviceType, System.ComponentModel.Design.ServiceCreatorCallback callback) + { + if (IsServiceMissing(serviceType)) { + serviceContainer.AddService(serviceType, callback); + } + } + + public void AddService(System.Type serviceType, object serviceInstance, bool promote) + { + if (IsServiceMissing(serviceType)) { + serviceContainer.AddService(serviceType, serviceInstance, promote); + services.Add(serviceInstance); + } + } + + public void AddService(System.Type serviceType, object serviceInstance) + { + if (IsServiceMissing(serviceType)) { + serviceContainer.AddService(serviceType, serviceInstance); + services.Add(serviceInstance); + } + } + #endregion + + #region System.IServiceProvider interface implementation + public object GetService(System.Type serviceType) + { +// if (IsServiceMissing(serviceType)) { +//// Console.WriteLine("request missing service : {0} from Assembly {1} is not aviable.", serviceType, serviceType.Assembly.FullName); +//// Console.ReadLine(); +// } else { +// Console.WriteLine("get service : {0} from Assembly {1}.", serviceType, serviceType.Assembly.FullName); +// } + return serviceContainer.GetService(serviceType); + } + #endregion + + bool IsServiceMissing(Type serviceType) + { + return serviceContainer.GetService(serviceType) == null; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerEventService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerEventService.cs new file mode 100644 index 0000000000..e6e5f8af30 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerEventService.cs @@ -0,0 +1,114 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Collections; +using System.Collections.Specialized; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Windows.Forms.Design; + +using ICSharpCode.Core; + +namespace ICSharpCode.FormDesigner.Services +{ + public class DesignerEventService : IDesignerEventService + { + IDesignerHost activeDesigner = null; + ArrayList designers = new ArrayList(); + + public void Reset() + { + this.activeDesigner = null; + this.designers.Clear(); + } + + public IDesignerHost ActiveDesigner { + get { + return activeDesigner; + } + } + + public DesignerCollection Designers { + get { + return new DesignerCollection(designers); + } + } + + public void AddDesigner(IDesignerHost host) + { + this.designers.Add(host); + if (designers.Count == 1) { + SetActiveDesigner(host); + } + OnDesignerCreated(new DesignerEventArgs(host)); + } + + public void RemoveDesigner(IDesignerHost host) + { + designers.Remove(host); + if (activeDesigner == host) { + if (designers.Count <= 0) { + SetActiveDesigner(null); + } else { + this.SetActiveDesigner((IDesignerHost)this.designers[designers.Count - 1]); + } + } + ((IContainer)host).Dispose(); + OnDesignerDisposed(new DesignerEventArgs(host)); + } + + public void SetActiveDesigner(IDesignerHost host) + { + if (activeDesigner != host) { + IDesignerHost oldDesigner = activeDesigner; + activeDesigner = host; + FileSelectionChanged(); + OnActiveDesignerChanged(new ActiveDesignerEventArgs(oldDesigner, host)); + } + } + + public void FileSelectionChanged() + { + if (SelectionChanged != null) { + SelectionChanged(this, EventArgs.Empty); + } + } + + protected virtual void OnDesignerCreated(DesignerEventArgs e) + { + if (DesignerCreated != null) { + DesignerCreated(this, e); + } + } + + protected virtual void OnDesignerDisposed(DesignerEventArgs e) + { + if (DesignerDisposed != null) { + DesignerDisposed(this, e); + } + } + + protected virtual void OnActiveDesignerChanged(ActiveDesignerEventArgs e) + { + if (ActiveDesignerChanged != null) { + ActiveDesignerChanged(this, e); + } + } + + public event EventHandler SelectionChanged; + + public event DesignerEventHandler DesignerCreated; + public event DesignerEventHandler DesignerDisposed; + + public event ActiveDesignerEventHandler ActiveDesignerChanged; + + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerOptionService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerOptionService.cs new file mode 100644 index 0000000000..408f80b299 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerOptionService.cs @@ -0,0 +1,98 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Drawing; +using System.ComponentModel.Design; +using System.Windows.Forms.Design; +using ICSharpCode.Core; + +namespace ICSharpCode.FormDesigner.Services +{ + public class DesignerOptionService : IDesignerOptionService + { + public const string GridSize = "GridSize"; + public const string ShowGrid = "ShowGrid"; + public const string SnapToGrid = "SnapToGrid"; + public const string LayoutMode = "LayoutMode"; + + const string GridSizeWidth = "GridSize.Width"; + const string GridSizeHeight = "GridSize.Height"; + + public const string FormsDesignerPageName = "SharpDevelop Forms Designer\\General"; + + Hashtable pageOptionTable = new Hashtable(); + + + + public DesignerOptionService() + { + pageOptionTable[FormsDesignerPageName] = new Hashtable(); + } + + public object GetOptionValue(string pageName, string valueName) + { + switch (valueName) { + case GridSize: + return new Size(PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeWidth", 8), + PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeHeight", 8)); + case ShowGrid: + return PropertyService.Get("FormsDesigner.DesignerOptions.ShowGrid", true); + case SnapToGrid: + return PropertyService.Get("FormsDesigner.DesignerOptions.SnapToGrid", true); + case GridSizeWidth: + return PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeWidth", 8); + case GridSizeHeight: + return PropertyService.Get("FormsDesigner.DesignerOptions.GridSizeHeight", 8); +// case LayoutMode: +// return PropertyService.Get("FormsDesigner.DesignerOptions.LayoutMode", LayoutOptions.SnapLines); + default: + Hashtable pageTable = (Hashtable)pageOptionTable[pageName]; + + if (pageTable == null) { + return null; + } + return pageTable[valueName]; + } + } + + public void SetOptionValue(string pageName, string valueName, object val) + { + switch (valueName) { + case GridSize: + Size size = (Size)val; + PropertyService.Set("FormsDesigner.DesignerOptions.GridSizeWidth", size.Width); + PropertyService.Set("FormsDesigner.DesignerOptions.GridSizeHeight", size.Height); + break; + case ShowGrid: + PropertyService.Set("FormsDesigner.DesignerOptions.ShowGrid", (bool)val); + break; + case SnapToGrid: + PropertyService.Set("FormsDesigner.DesignerOptions.SnapToGrid", (bool)val); + break; + case GridSizeWidth: + PropertyService.Set("FormsDesigner.DesignerOptions.GridSizeWidth", (int)val); + break; + case GridSizeHeight: + PropertyService.Set("FormsDesigner.DesignerOptions.GridSizeHeight", (int)val); + break; +// case LayoutMode: +// PropertyService.Set("FormsDesigner.DesignerOptions.LayoutMode", (LayoutOptions)val); +// break; + + default: + Hashtable pageTable = (Hashtable)pageOptionTable[pageName]; + if (pageTable == null) { + pageOptionTable[pageName] = pageTable = new Hashtable(); + } + pageTable[valueName] = val; + break; + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs new file mode 100644 index 0000000000..6be06c4a1d --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/DesignerResourceService.cs @@ -0,0 +1,247 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.IO; +using System.Collections; +using System.Resources; +using System.Text; +using System.Collections.Specialized; +using System.Drawing.Design; +using System.ComponentModel.Design; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.FormDesigner.Services +{ + public class DesignerResourceService : System.ComponentModel.Design.IResourceService , IDisposable + { + IDesignerHost host; + + public string FileName = String.Empty; + public string NameSpace = String.Empty; + public string RootType = String.Empty; + + protected IProject project; + + protected Hashtable Readers = new Hashtable(); + protected Hashtable Writers = new Hashtable(); + + #region ResourceStorage + public class ResourceStorage + { + public MemoryStream stream = null; + public byte[] storage = null; + public IProject project = null; + + public ResourceStorage(MemoryStream stream) + { + this.stream = stream; + } + + public ResourceStorage(ResourceStorage rs) + { + this.storage = (byte []) rs.storage.Clone(); + this.stream = new MemoryStream(this.storage); + } + + public void Dispose() + { + this.storage = null; + this.stream.Close(); + } + + public void Save(string fileName) + { + using (BinaryWriter binWriter = new BinaryWriter(System.IO.File.OpenWrite(fileName))) { + binWriter.Write(this.storage); + } + + // Add this resource file to the project + if (project != null && !project.IsFileInProject(fileName)) { +// ProjectFile fileInformation = ProjectService.AddFileToProject(project, fileName, BuildAction.EmbedAsResource); +// TODO: Project system... +// ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView pbv = (ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)WorkbenchSingleton.Workbench.GetPad(typeof(ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)); +// pbv.UpdateCombineTree(); +// projectService.SaveCombine(); + } + } + } + #endregion + + // In ResourceMemoryStreams are stored: + // Key: "true" file names from the project + // Value: ResourceStorage, where the resources are stored + // If the file is read, after + // calculating of the "true" file name, it looks for MemoryStream + // uses it if it exists. + // Memory streams are cleared, when WriteSerialization will start + // or File in the editor will be reloaded from the disc and of + // course in Dispose of the service + protected Hashtable resources = null; + public Hashtable Resources + { + get { + return resources; + } + set { + resources = value; + } + } + public IDesignerHost Host { + get { + return host; + } + set { + host = value; + } + } + + public DesignerResourceService(Hashtable resources) + { + project = ProjectService.CurrentProject; + this.resources = resources; + } + + #region System.ComponentModel.Design.IResourceService interface implementation + public System.Resources.IResourceWriter GetResourceWriter(System.Globalization.CultureInfo info) + { + try { + IResourceWriter resourceWriter = (IResourceWriter)Writers[info]; + string fileName = CalcResourceFileName(info); + + if (resourceWriter == null) { + ResourceStorage resourceStorage = new ResourceStorage(new MemoryStream()); + resources[fileName] = resourceStorage; + resourceWriter = new ResourceWriter(resourceStorage.stream); + Writers[info] = resourceWriter; + resourceStorage.project = project; + + } + return resourceWriter; + } catch (Exception e) { + System.Windows.Forms.MessageBox.Show(e.ToString()); + return null; + } + } + + public System.Resources.IResourceReader GetResourceReader(System.Globalization.CultureInfo info) + { + try { + string fileName = CalcResourceFileName(info); + IResourceReader resourceReader = (IResourceReader)Readers[info]; + if (resourceReader == null) { + if (resources != null && resources[fileName] != null) { + MemoryStream stream = (MemoryStream) ((ResourceStorage)resources[fileName]).stream; + stream.Seek( 0, System.IO.SeekOrigin.Begin ); + resourceReader = new ResourceReader( stream ); + } else if (File.Exists(fileName)) { + resourceReader = new ResourceReader(fileName); + } + if (resourceReader != null) { + Readers[info] = resourceReader; + } + } + return resourceReader; + } catch (Exception e) { + System.Windows.Forms.MessageBox.Show(e.ToString()); + return null; + } + } + #endregion + + public void Save() + { + if (resources != null) { + foreach (DictionaryEntry entry in resources) { + + FileUtility.ObservedSave(new NamedFileOperationDelegate(((ResourceStorage)entry.Value).Save), (string) entry.Key, FileErrorPolicy.Inform); + } + } + } + + protected string CalcResourceFileName(System.Globalization.CultureInfo info) + { + StringBuilder resourceFileName = null; + if (FileName != null && FileName != String.Empty) { + resourceFileName = new StringBuilder(Path.GetDirectoryName(FileName)); + } else if (project != null) { + resourceFileName = new StringBuilder(project.Directory); + } else { + // required for untitled files. Untitled files should NOT save their resources. + resourceFileName = new StringBuilder(Path.GetTempPath()); + } + resourceFileName.Append(Path.DirectorySeparatorChar); + resourceFileName.Append(host.RootComponentClassName); + + if (info != null && info.Name.Length > 0) { + resourceFileName.Append('.'); + resourceFileName.Append(info.Name); + } + resourceFileName.Append(".resources"); + return resourceFileName.ToString(); + } + + public void SerializationStarted(bool serialize) + { + if (serialize == true) { + if (resources == null) { + resources = new Hashtable(); + } + foreach (ResourceStorage storage in resources.Values) { + storage.storage = null; + storage.stream.Close(); + } + resources.Clear(); + } else { + if (resources != null) { + foreach (ResourceStorage storage in resources.Values) { + storage.stream = new MemoryStream(storage.storage); + } + } + } + } + + public void SerializationEnded(bool serialize) + { + if (serialize == true && resources != null) { + foreach (ResourceStorage storage in Resources.Values) { + storage.storage = storage.stream.ToArray(); + } + } + + foreach (IResourceWriter resourceWriter in Writers.Values) { + if (resourceWriter != null) { + resourceWriter.Close(); + resourceWriter.Dispose(); + } + } + Writers.Clear(); + + foreach (IResourceReader resourceReader in Readers.Values) { + if (resourceReader != null) { + resourceReader.Close(); + resourceReader.Dispose(); + } + } + Readers.Clear(); + } + + public void Dispose() + { + if (resources != null) { + foreach (ResourceStorage storage in resources.Values) { + storage.Dispose(); + } + resources.Clear(); + } + SerializationEnded(false); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/EventBindingService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/EventBindingService.cs new file mode 100644 index 0000000000..a6e6c5f127 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/EventBindingService.cs @@ -0,0 +1,321 @@ +// +// +// +// +// +// + +using System; +using System.Reflection; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Globalization; + +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.FormDesigner.Services +{ + public class EventBindingService : IEventBindingService + { + public IComponentChangeService changeService = null; + + EventTypeConverter eventTypeConverter; + Hashtable components = new Hashtable(); + IServiceProvider serviceProvider = null; + public IServiceProvider ServiceProvider { + get { + return serviceProvider; + } + set { + serviceProvider = value; + eventTypeConverter = new EventTypeConverter(serviceProvider, this); + changeService = serviceProvider.GetService(typeof(IComponentChangeService)) as IComponentChangeService; + if (changeService != null) { + changeService.ComponentRemoved += new ComponentEventHandler(ComponentRemoved); + changeService.ComponentRename += new ComponentRenameEventHandler(ComponentRenamed); + } + } + } + + public EventBindingService() + { + } + + public virtual string CreateUniqueMethodName(IComponent component, EventDescriptor e) + { + return String.Format("{0}{1}", Char.ToUpper(component.Site.Name[0]) + component.Site.Name.Substring(1), e.DisplayName); + } + + // sohuld look around in form class for compatiable methodes + public ICollection GetCompatibleMethods(EventDescriptor e) + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window != null) { + FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent; + + if (formDesigner != null) { + return formDesigner.GetCompatibleMethods(e); + } + } + return new string[]{}; + } + + public ICollection GetCompatibleMethods(EventInfo e) + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window != null) { + FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent; + + if (formDesigner != null) { + return formDesigner.GetCompatibleMethods(e); + } + } + return new string[]{}; + } + + public EventDescriptor GetEvent(PropertyDescriptor property) + { + EventPropertyDescriptor eventProp = property as EventPropertyDescriptor; + if (eventProp == null) { + return null; + } + return eventProp.Event; + } + + public PropertyDescriptorCollection GetEventProperties(EventDescriptorCollection events) + { + PropertyDescriptor[] props = new PropertyDescriptor[events.Count]; + for (int i = 0; i < events.Count; ++i) { + props[i] = GetEventProperty(events[i]); + } + return new PropertyDescriptorCollection(props); + } + + public PropertyDescriptor GetEventProperty(EventDescriptor e) + { + return new EventPropertyDescriptor(e, this); + } + + public bool ShowCode() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return false; + } + + FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent; + + if (formDesigner != null) { + formDesigner.ShowSourceCode(); + return true; + } + return false; + } + + public bool ShowCode(int lineNumber) + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null) { + return false; + } + + FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent; + + if (formDesigner != null) { + formDesigner.ShowSourceCode(lineNumber); + return true; + } + return false; + } + + public bool ShowCode(IComponent component, EventDescriptor edesc) + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + if (window == null || edesc == null || edesc.Name == null || edesc.Name.Length == 0) { + return false; + } + FormDesignerViewContent formDesigner = window.ActiveViewContent as FormDesignerViewContent; + + if (formDesigner != null) { + object name = ((Hashtable)components[component])[edesc.Name]; + string nameStr = name == null ? null : name.ToString(); + if (nameStr != null && nameStr.Length > 0) { + formDesigner.ShowSourceCode(component, edesc, nameStr); + } else { + // TODO: Remove empty event methods. + } + return true; + } + return false; + } + + protected void ComponentRemoved(object sender, ComponentEventArgs e) + { + components.Remove(e.Component); + } + + protected void ComponentRenamed(object sender, ComponentRenameEventArgs e) + { + } + + protected class EventTypeConverter : TypeConverter + { + IServiceProvider serviceProvider = null; + EventBindingService eventBindingService = null; + + public EventTypeConverter(IServiceProvider serviceProvider, EventBindingService eventBindingService) + { + this.serviceProvider = serviceProvider; + this.eventBindingService = eventBindingService; + } + + public override bool CanConvertFrom(ITypeDescriptorContext context,Type type) + { + return (type == typeof(string)); + } + + public override bool CanConvertTo(ITypeDescriptorContext context,Type type) + { + return (type == typeof(string)); + } + + public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value) + { + if (context != null) + { + EventPropertyDescriptor ed = context.PropertyDescriptor as EventPropertyDescriptor; +// ed.SetValue(context.Instance,value); + return value; + } + else return base.ConvertFrom(context,culture,value); + + } + + public override object ConvertTo(ITypeDescriptorContext context,CultureInfo culture,object value, Type type) + { + if (value != null) { + if (value.GetType() == typeof(string)) { + return value; + } + } + + if (context != null) { + EventPropertyDescriptor ed = context.PropertyDescriptor as EventPropertyDescriptor; + if (ed != null) { + return ed.GetValue(context.Instance); + } + } + + return base.ConvertTo(context, culture, value, type); + } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + { + return false; + } + + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) + { + EventPropertyDescriptor ed = context.PropertyDescriptor as EventPropertyDescriptor; + if (ed == null || ed.eventBindingService == null) { + ISelectionService selectionService = (ISelectionService)this.serviceProvider.GetService(typeof(ISelectionService)); + EventInfo eventInfo = selectionService.PrimarySelection.GetType().GetEvent(context.PropertyDescriptor.Name); + return new StandardValuesCollection(eventBindingService.GetCompatibleMethods(eventInfo)); + } + + ICollection col = ed.eventBindingService.GetCompatibleMethods(((EventPropertyDescriptor)context.PropertyDescriptor).Event); + return new StandardValuesCollection(col); + } + + public override bool IsValid(ITypeDescriptorContext context, object o) + { + return true; + } + } + + protected class EventPropertyDescriptor : PropertyDescriptor + { + protected EventDescriptor baseDescriptor = null; + public EventBindingService eventBindingService = null; + + public EventPropertyDescriptor(EventDescriptor eventDesc, EventBindingService service): base(eventDesc) + { + baseDescriptor = eventDesc; + eventBindingService = service; + } + + public EventDescriptor Event { + get { return baseDescriptor;} + } + + public override Type ComponentType { + get {return Event.ComponentType;} + } + + public override TypeConverter Converter { + get {return eventBindingService.eventTypeConverter;} + } + + public override bool IsReadOnly { + get {return false;} + } + + public override Type PropertyType { + get { return typeof(string);} + } + + public override bool CanResetValue(object component) + { + return true; + } + + public override object GetValue(object component) + { + IDictionary events = eventBindingService.components[component] as IDictionary; + if (events == null) { + return null; + } + return events[Name]; + } + + public override void ResetValue(object component) + { + SetValue(component,null); + } + + public override void SetValue(object component, object value) + { + if (value as string == "") { + value = null; + } + + IDictionary events = eventBindingService.components[component] as IDictionary; + string oldValue = null; + if (events != null) { + oldValue = (string)events[Name]; + } else if (value != null) { + events = new Hashtable(); + eventBindingService.components[component] = (Hashtable)events; + } + + if (String.Compare(oldValue,(string)value) != 0) { +// eventBindingService.changeService.OnComponentChanging(component,Event); + events[Name] = value; +// eventBindingService.changeService.OnComponentChanged(component,Event,oldValue,value); + } + } + + public override bool ShouldSerializeValue(object component) + { + return false; + } + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/HelpService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/HelpService.cs new file mode 100644 index 0000000000..42a4f85262 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/HelpService.cs @@ -0,0 +1,102 @@ +// created on 10/10/2002 at 16:13 + +using System; +using System.Drawing; +using System.Collections; +using System.Collections.Specialized; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Windows.Forms; +using System.Threading; +using Microsoft.Win32; + +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.FormDesigner.Services +{ + /// + /// BaseImlementation of IHelpService + /// + /// + /// created by - Niv + /// created on - 10/10/2002 11:44:46 + /// + public class HelpService : IHelpService + { + Hashtable LocalContexts = new Hashtable(); + ArrayList ContextAttributes = new ArrayList(); + + string f1Keyword = null; + string generalKeyword = null; + + + public HelpService() + { + } + + public void AddContextAttribute(string name, string value, HelpKeywordType keywordType) + { + switch (keywordType) { + case HelpKeywordType.F1Keyword: + f1Keyword = value; + return; + case HelpKeywordType.GeneralKeyword: + generalKeyword = value; + return; + } + } + + public void ClearContextAttributes() + { + } + + public IHelpService CreateLocalContext(HelpContextType contextType) + { + return this; + } + + public void RemoveContextAttribute(string name, string value) + { +// System.Console.WriteLine("child removeing {0} : {1}",name,value); +// object att = helpGUI.RemoveContextAttributeFromView(name,value); +// ContextAttributes.Remove(att);; + } + + public void RemoveLocalContext(IHelpService localContext) + { + LocalContexts.Remove(LocalContexts); + } + + public void ShowHelpFromKeyword(string helpKeyword) + { + if (helpKeyword == null) { + helpKeyword = f1Keyword; + } + string classStr = helpKeyword; + string memberStr = String.Empty; + + // show member help + if (helpKeyword == f1Keyword) { + int idx = helpKeyword.LastIndexOf('.'); + classStr = helpKeyword.Substring(0, idx); + memberStr = helpKeyword.Substring(idx + 1); + } + HelpBrowser helpBrowser = (HelpBrowser)WorkbenchSingleton.Workbench.GetPad(typeof(HelpBrowser)).PadContent; + helpBrowser.ShowHelpFromType(classStr, memberStr); + } + public void ShowGeneralHelp() + { + ShowHelpFromKeyword(generalKeyword); + } + public void ShowHelp() + { + ShowHelpFromKeyword(f1Keyword); + } + + public void ShowHelpFromUrl(string helpURL) + { + HelpBrowser helpBrowser = (HelpBrowser)WorkbenchSingleton.Workbench.GetPad(typeof(HelpBrowser)).PadContent; + helpBrowser.ShowHelpBrowser(helpURL); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/MenuCommandService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/MenuCommandService.cs new file mode 100644 index 0000000000..9d171bf9e2 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/MenuCommandService.cs @@ -0,0 +1,151 @@ +// +// +// +// +// +// + +using System; +using System.Diagnostics; +using System.Drawing; +using System.Collections; +using System.Collections.Specialized; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +using ICSharpCode.Core; + +namespace ICSharpCode.FormDesigner.Services +{ + class MenuCommandService : IMenuCommandService + { + IServiceContainer serviceContainer; + + ArrayList commands = new ArrayList(); + ArrayList verbs = new ArrayList(); + + Control panel; + + public DesignerVerbCollection Verbs { + get { + DesignerVerbCollection verbCollection = CreateDesignerVerbCollection(); + verbCollection.AddRange((DesignerVerb[])verbs.ToArray(typeof(DesignerVerb))); + return verbCollection; + } + } + + public MenuCommandService(Control panel, IServiceContainer serviceContainer) + { + this.panel = panel; + this.serviceContainer = serviceContainer; + } + + public void AddCommand(System.ComponentModel.Design.MenuCommand command) + { + if (command != null && command.CommandID != null) { + if (!commands.Contains(command)) { + this.commands.Add(command); + } + } + } + + public void AddVerb(DesignerVerb verb) + { + if (verb != null) { + this.verbs.Add(verb); + } + } + + public void RemoveCommand(System.ComponentModel.Design.MenuCommand command) + { + if (command != null) { + commands.Remove(command.CommandID); + } + } + + public void RemoveVerb(DesignerVerb verb) + { + if (verb != null) { + verbs.Remove(verb); + } + } + + public bool GlobalInvoke(CommandID commandID) + { + System.ComponentModel.Design.MenuCommand menuCommand = FindCommand(commandID); + if (menuCommand == null) { + return false; + } + + menuCommand.Invoke(); + return true; + } + + public System.ComponentModel.Design.MenuCommand FindCommand(CommandID commandID) + { +// if (StringType.StrCmp(MenuUtilities.GetCommandNameFromCommandID(commandID), "", false) == 0 && StringType.StrCmp(commandID.ToString(), "74d21313-2aee-11d1-8bfb-00a0c90f26f7 : 12288", false) == 0) { +// return MenuUtilities.gPropertyGridResetCommand; +// } + + foreach (System.ComponentModel.Design.MenuCommand menuCommand in commands) { + if (menuCommand.CommandID == commandID) { + return menuCommand; + } + } + + foreach (DesignerVerb verb in Verbs) { + if (verb.CommandID == commandID) { + return verb; + } + } + return null; + } + + public void ShowContextMenu(CommandID menuID, int x, int y) + { + string contextMenuPath = "/SharpDevelop/FormsDesigner/ContextMenus/"; + + if (menuID == MenuCommands.ComponentTrayMenu) { + contextMenuPath += "ComponentTrayMenu"; + } else if (menuID == MenuCommands.ContainerMenu) { + contextMenuPath += "ContainerMenu"; + } else if (menuID == MenuCommands.SelectionMenu) { + contextMenuPath += "SelectionMenu"; + } else if (menuID == MenuCommands.TraySelectionMenu) { + contextMenuPath += "TraySelectionMenu"; + } else { + throw new Exception(); + } + Point p = panel.PointToClient(new Point(x, y)); + + + MenuService.ShowContextMenu(this, contextMenuPath, panel, p.X, p.Y); + } + + public DesignerVerbCollection CreateDesignerVerbCollection() + { + DesignerVerbCollection designerVerbCollection = new DesignerVerbCollection(); + + ISelectionService selectionService = (ISelectionService)serviceContainer.GetService(typeof(ISelectionService)); + IDesignerHost host = (IDesignerHost)serviceContainer.GetService(typeof(IDesignerHost)); + if (host != null && selectionService != null && selectionService.SelectionCount == 1) { + IComponent selectedComponent = selectionService.PrimarySelection as Component; + if (selectedComponent != null) { + IDesigner designer = host.GetDesigner((IComponent)selectedComponent); + if (designer != null) { + designerVerbCollection.AddRange(designer.Verbs); + } + } + + if (selectedComponent == host.RootComponent) { + designerVerbCollection.AddRange((DesignerVerb[])this.verbs.ToArray(typeof(DesignerVerb))); + } + } + return designerVerbCollection; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/PropertyValueUIService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/PropertyValueUIService.cs new file mode 100644 index 0000000000..d9859e08da --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/PropertyValueUIService.cs @@ -0,0 +1,56 @@ +// +// +// +// +//
+ +using System; +using System.ComponentModel; +using System.Drawing.Design; +using System.Collections; + +namespace ICSharpCode.FormDesigner.Services +{ + public class PropertyValueUIService : IPropertyValueUIService + { + PropertyValueUIHandler propertyValueUIHandler; + + public void AddPropertyValueUIHandler(PropertyValueUIHandler newHandler) + { + propertyValueUIHandler += newHandler; + } + + public PropertyValueUIItem[] GetPropertyUIValueItems(ITypeDescriptorContext context, PropertyDescriptor propDesc) + { + // Let registered handlers have a chance to add their UIItems + ArrayList propUIValues = new ArrayList(); + if (propertyValueUIHandler != null) { + propertyValueUIHandler(context,propDesc,propUIValues); + } + PropertyValueUIItem[] values = new PropertyValueUIItem[propUIValues.Count]; + if (propUIValues.Count > 0) { + propUIValues.CopyTo(values); + } + return values; + } + + public void NotifyPropertyValueUIItemsChanged() + { + OnPropertyUIValueItemsChanged(EventArgs.Empty); + } + + public void RemovePropertyValueUIHandler(PropertyValueUIHandler newHandler) + { + propertyValueUIHandler -= newHandler; + } + + protected virtual void OnPropertyUIValueItemsChanged(EventArgs e) + { + if (PropertyUIValueItemsChanged != null) { + PropertyUIValueItemsChanged(this, e); + } + } + + public event EventHandler PropertyUIValueItemsChanged; + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/ToolboxService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/ToolboxService.cs new file mode 100644 index 0000000000..6855f8b52f --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/ToolboxService.cs @@ -0,0 +1,522 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Drawing.Design; +using System.ComponentModel.Design; + +namespace ICSharpCode.FormDesigner.Services +{ + public delegate void ToolboxEventHandler(object sender, ToolboxEventArgs tea); + + public class ToolboxEventArgs : EventArgs + { + ToolboxItem item = null; + string category = null; + IDesignerHost host = null; + + public ToolboxEventArgs(ToolboxItem item, string category, IDesignerHost host) + { + this.item = item; + this.category = category; + this.host = host; + } + + public ToolboxItem Item { + get { + return item; + } + } + + public string Category { + get { + return category; + } + } + + public IDesignerHost Host { + get { + return host; + } + } + } + + /// + /// Provides access to the toolbox in the development environment. + /// + /// + /// Provides designers with the ability to configure what tools + /// are available on the toolbox. + /// + public class ToolboxService : IToolboxService + { + static readonly string ALL_HOSTS = "_all_hosts_"; + static readonly string ALL_CATEGORIES = "_all_categories_"; + + IDictionary toolboxByCategory = new ListDictionary(); + IDictionary toolboxByHost = new ListDictionary(); + ArrayList toolboxItems = new ArrayList(); + + IDictionary creators = new HybridDictionary(); + IDictionary creatorsByHost = new ListDictionary(); + + string selectedCategory = null; + ToolboxItem selectedItem = null; + + // Constructor + public ToolboxService() + { + IList list = new ArrayList(); + toolboxByCategory.Add(ALL_CATEGORIES, list); + + list = new ArrayList(); + toolboxByHost.Add(ALL_HOSTS, list); + } + + // Properties + + /// + /// Gets the names of all the tool categories currently on the toolbox. + /// + /// + /// A + /// containing the tool categories. + /// + public CategoryNameCollection CategoryNames { + get { + string[] names = new string[toolboxByCategory.Count]; + toolboxByCategory.Keys.CopyTo(names, 0); + return new CategoryNameCollection(names); + } + } + + /// + /// Gets or sets the name of the currently selected tool category + /// from the toolbox. + /// + /// + /// The name of the currently selected category. + /// + /// + /// The implementation of this property's "set" accessor fires the + /// events and + /// . + /// + public string SelectedCategory { + get { + return selectedCategory; + } + set { + if (value != selectedCategory) { + FireSelectedCategoryChanging(); + selectedCategory = value; + FireSelectedCategoryChanged(); + } + } + } + + // Methods + /// + /// Adds a new toolbox item creator. + /// + /// + /// A + /// that can create a component when the toolbox item + /// is invoked. + /// + /// The data format this creator responds to. If a creator responds + /// to more than one format, call AddCreator more than once. It is + /// an error to add more than one creator for the same format. + /// + /// + /// A toolbox item creator is used to handle data formats other than + /// the standard native format of the toolbox service. Typically, the + /// standard toolbox service format should be used, because it provides + /// ample opportunity for customization in an object-oriented way. + /// However, there are times when a legacy data format may need to be + /// supported. A toolbox item creator is the mechanism by which these + /// legacy data formats may be converted into toolbox items. + /// + public void AddCreator(ToolboxItemCreatorCallback creator, string format) + { + AddCreator(creator, format, null); + } + + /// + /// Adds a new toolbox item creator. + /// + /// + /// A + /// that can create a component when the toolbox item + /// is invoked. + /// + /// The data format this creator responds to. If a creator responds + /// to more than one format, call AddCreator more than once. It is + /// an error to add more than one creator for the same format. + /// + /// + /// The designer host to associate with the creator. If this parameter + /// is set to a null reference (Nothing in Visual Basic), this creator + /// will be available to all designers. If a designer host is supplied, + /// the creator will only be available to designers using the specified + /// host. + /// + /// + /// A toolbox item creator is used to handle data formats other than + /// the standard native format of the toolbox service. Typically, the + /// standard toolbox service format should be used, because it provides + /// ample opportunity for customization in an object-oriented way. + /// However, there are times when a legacy data format may need to be + /// supported. A toolbox item creator is the mechanism by which these + /// legacy data formats may be converted into toolbox items. + /// + /// This implemetation does add the specified creator to a collection, + /// but at this time I have no idea what to do with it! + /// + /// + public void AddCreator(ToolboxItemCreatorCallback creator, string format, IDesignerHost host) + { + //System.Console.WriteLine("\tDefaultToolboxService:AddCreator({0}, {1}, {2})", + // creator, format, host); + if (host == null) { + creators.Add(format, creator); + } else { + IDictionary creatorsDict = (IDictionary)creatorsByHost[host]; + if (creatorsDict == null) { + creatorsDict = new HybridDictionary(); + creatorsByHost.Add(host, creatorsDict); + } + creatorsDict[format] =creator; + } + } + + void AddItemToToolbox(ToolboxItem toolboxItem, string category, IDesignerHost host) + { + toolboxItems.Add(toolboxItem); + + if (host != null) { + IList list = (IList)toolboxByHost[host]; + if (list == null) { + list = new ArrayList(); + toolboxByHost.Add(host, list); + } + list.Add(toolboxItem); + } else { + IList list = (IList)toolboxByHost[ALL_HOSTS]; + list.Add(toolboxItem); + } + + if (category != null) { + IList list = (IList)toolboxByCategory[category]; + if (list == null) { + list = new ArrayList(); + toolboxByCategory.Add(category, list); + } + list.Add(toolboxItem); + } else { + IList list = (IList)toolboxByCategory[ALL_CATEGORIES]; + list.Add(toolboxItem); + } + + FireToolboxItemAdded(toolboxItem, category, host); + } + + public void AddLinkedToolboxItem(ToolboxItem toolboxItem, string category, IDesignerHost host) + { + AddItemToToolbox(toolboxItem, category, host); + } + + public void AddLinkedToolboxItem(ToolboxItem toolboxItem, IDesignerHost host) + { + this.AddLinkedToolboxItem(toolboxItem, null, host); + } + + public void AddToolboxItem(ToolboxItem toolboxItem) + { + this.AddItemToToolbox(toolboxItem, null, null); + } + + public void AddToolboxItem(ToolboxItem toolboxItem, string category) + { + this.AddItemToToolbox(toolboxItem, category, null); + } + + public ToolboxItem DeserializeToolboxItem(object serializedObject) + { + if (serializedObject is System.Windows.Forms.IDataObject) { + if (((System.Windows.Forms.IDataObject)serializedObject).GetDataPresent(typeof(ToolboxItem))) { + return (ToolboxItem) ((System.Windows.Forms.IDataObject)serializedObject).GetData(typeof(ToolboxItem)); + } + } + return null; + } + + public ToolboxItem DeserializeToolboxItem(object serializedObject, IDesignerHost host) + { + if (serializedObject is System.Windows.Forms.IDataObject) { + if (((System.Windows.Forms.IDataObject)serializedObject).GetDataPresent(typeof(ToolboxItem))) { + ToolboxItem item = (ToolboxItem) ((System.Windows.Forms.IDataObject)serializedObject).GetData(typeof(ToolboxItem)); + if (host != null) { + ArrayList list = (ArrayList)toolboxByHost[host]; + if (list != null && list.Contains(item)) { + return item; + } + list = (ArrayList)toolboxByHost[ALL_HOSTS]; + if (list != null && list.Contains(item)) { + return item; + } + } + } + } + return null; + } + + public ToolboxItem GetSelectedToolboxItem() + { + return selectedItem; + } + + public ToolboxItem GetSelectedToolboxItem(IDesignerHost host) + { + IList list = (IList)toolboxByHost[host]; + if (list != null && list.Contains(selectedItem)) { + return selectedItem; + } + + list = (IList)toolboxByHost[ALL_HOSTS]; + if (list.Contains(selectedItem)) { + return selectedItem; + } + return null; + } + + public ToolboxItemCollection GetToolboxItems() + { + ToolboxItem[] items = new ToolboxItem[toolboxItems.Count]; + toolboxItems.CopyTo(items); + return new ToolboxItemCollection(items); + } + + public ToolboxItemCollection GetToolboxItems(string category) + { + if (category == null) { + category = ALL_CATEGORIES; + } + + ArrayList list = (ArrayList)toolboxByCategory[category]; + list.Add((ArrayList)toolboxByCategory[ALL_CATEGORIES]); + ToolboxItem[] items = new ToolboxItem[list.Count]; + toolboxItems.CopyTo(items); + return new ToolboxItemCollection(items); + } + + public ToolboxItemCollection GetToolboxItems(string category, IDesignerHost host) + { + if (category == null) { + category = ALL_CATEGORIES; + } + + ArrayList hList = null; + + if (host == null) { + hList = (ArrayList)toolboxByHost[ALL_HOSTS]; + } else { + hList = (ArrayList)toolboxByHost[host]; + } + + ArrayList cList = (ArrayList)toolboxByCategory[category]; + ArrayList list = new ArrayList(); + + foreach (ToolboxItem item in hList) { + if (cList.Contains(item)) { + list.Add(item); + } + } + + ToolboxItem[] items = new ToolboxItem[list.Count]; + toolboxItems.CopyTo(items); + return new ToolboxItemCollection(items); + } + + public ToolboxItemCollection GetToolboxItems(IDesignerHost host) + { + ArrayList hList = null; + + if(host == null) { + hList = (ArrayList)toolboxByHost[ALL_HOSTS]; + } else { + hList = (ArrayList)toolboxByHost[host]; + } + ArrayList list = (ArrayList)toolboxByHost[host]; + list.Add((ArrayList)toolboxByHost[ALL_HOSTS]); + ToolboxItem[] items = new ToolboxItem[list.Count]; + toolboxItems.CopyTo(items); + return new ToolboxItemCollection(items); + } + + public bool IsSupported(object serializedObject, ICollection filterAttributes) + { + return false; + } + + public bool IsSupported(object serializedObject, IDesignerHost host) + { + return false; + } + + public bool IsToolboxItem(object serializedObject) + { + if (serializedObject is System.Windows.Forms.IDataObject) { + if (((System.Windows.Forms.IDataObject)serializedObject).GetDataPresent(typeof(ToolboxItem))) { + return true; + } + } + return false; + } + + public bool IsToolboxItem(object serializedObject, IDesignerHost host) + { + // needed for Toolbox drag & drop + if (serializedObject is System.Windows.Forms.IDataObject) { + if (((System.Windows.Forms.IDataObject)serializedObject).GetDataPresent(typeof(ToolboxItem))) { + ToolboxItem item = (ToolboxItem) ((System.Windows.Forms.IDataObject)serializedObject).GetData(typeof(ToolboxItem)); + if (host != null) { + ArrayList list = (ArrayList)toolboxByHost[host]; + if (list != null && list.Contains(item)) + return true; + list = (ArrayList)toolboxByHost[ALL_HOSTS]; + if (list != null && list.Contains(item)) + return true; + } + } + } + return false; + } + + public void Refresh() + { + //System.Console.WriteLine("\tDefaultToolboxService:Refresh()"); + } + + public void RemoveCreator(string format) + { + } + + public void RemoveCreator(string format, IDesignerHost host) + { + } + + public void RemoveToolboxItem(ToolboxItem toolboxItem) + { + toolboxItems.Remove(toolboxItem); + ArrayList list = (ArrayList)toolboxByCategory[ALL_CATEGORIES]; + list.Remove(toolboxItem); + list = (ArrayList)toolboxByHost[ALL_HOSTS]; + list.Remove(toolboxItem); + FireToolboxItemRemoved(toolboxItem, null, null); + } + + public void RemoveToolboxItem(ToolboxItem toolboxItem, string category) + { + toolboxItems.Remove(toolboxItem); + ArrayList list = (ArrayList)toolboxByCategory[category]; + list.Remove(toolboxItem); + FireToolboxItemRemoved(toolboxItem, category, null); + } + + public void SelectedToolboxItemUsed() + { + FireSelectedItemUsed(); + } + + public object SerializeToolboxItem(ToolboxItem toolboxItem) + { + return null; + } + + public bool SetCursor() + { + if (selectedItem == null) { + return false; + } + if (selectedItem.DisplayName == "Pointer") { + return false; + } + return true; + } + + public void SetSelectedToolboxItem(ToolboxItem toolboxItem) + { + if (toolboxItem != selectedItem) { + FireSelectedItemChanging(); + selectedItem = toolboxItem; + FireSelectedItemChanged(); + } + } + + // Event helpers + void FireSelectedCategoryChanging() + { + if (SelectedCategoryChanging != null) { + SelectedCategoryChanging(this, EventArgs.Empty); + } + } + + void FireSelectedItemChanged() + { + if (SelectedItemChanged != null) { + SelectedItemChanged(this, EventArgs.Empty); + } + } + + void FireSelectedItemChanging() + { + if (SelectedItemChanging != null) { + SelectedItemChanging(this, EventArgs.Empty); + } + } + + void FireSelectedCategoryChanged() + { + if (SelectedCategoryChanged != null) { + SelectedCategoryChanged(this, EventArgs.Empty); + } + } + + void FireSelectedItemUsed() + { + if (SelectedItemUsed != null) { + SelectedItemUsed(this, EventArgs.Empty); + } + } + + void FireToolboxItemAdded(ToolboxItem item, string category, IDesignerHost host) + { + if (ToolboxItemAdded != null) { + ToolboxItemAdded(this, new ToolboxEventArgs(item, category, host)); + } + } + + void FireToolboxItemRemoved(ToolboxItem item, string category, IDesignerHost host) + { + if (ToolboxItemAdded != null) { + ToolboxItemRemoved(this, new ToolboxEventArgs(item, category, host)); + } + } + + // Events + public event EventHandler SelectedCategoryChanging; + public event EventHandler SelectedCategoryChanged; + public event EventHandler SelectedItemChanging; + public event EventHandler SelectedItemChanged; + public event EventHandler SelectedItemUsed; + public event ToolboxEventHandler ToolboxItemAdded; + public event ToolboxEventHandler ToolboxItemRemoved; + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDescriptorFilterService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDescriptorFilterService.cs new file mode 100644 index 0000000000..aa984cdd0e --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeDescriptorFilterService.cs @@ -0,0 +1,64 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; + +namespace ICSharpCode.FormDesigner.Services +{ + public class TypeDescriptorFilterService : ITypeDescriptorFilterService + { + IDesignerFilter GetDesignerFilter(IComponent component) + { + ISite site = component.Site; + + if (site == null) { + return null; + } + + IDesignerHost host = (IDesignerHost)site.GetService(typeof(IDesignerHost)); + if (host == null) + return null; + return host.GetDesigner(component) as IDesignerFilter; + } + + +#region System.ComponentModel.Design.ITypeDescriptorFilterService interface implementation + public bool FilterProperties(System.ComponentModel.IComponent component, System.Collections.IDictionary properties) + { + IDesignerFilter designerFilter = GetDesignerFilter(component); + if (designerFilter != null) { + designerFilter.PreFilterProperties(properties); + designerFilter.PostFilterProperties(properties); + } + return false; + } + + public bool FilterEvents(System.ComponentModel.IComponent component, System.Collections.IDictionary events) + { + IDesignerFilter designerFilter = GetDesignerFilter(component); + if (designerFilter != null) { + designerFilter.PreFilterEvents(events); + designerFilter.PostFilterEvents(events); + } + return false; + } + + public bool FilterAttributes(System.ComponentModel.IComponent component, System.Collections.IDictionary attributes) + { + IDesignerFilter designerFilter = GetDesignerFilter(component); + if (designerFilter != null) { + designerFilter.PreFilterAttributes(attributes); + designerFilter.PostFilterAttributes(attributes); + } + return false; + } +#endregion + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeResolutionService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeResolutionService.cs new file mode 100644 index 0000000000..bf7c00efe7 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/TypeResolutionService.cs @@ -0,0 +1,97 @@ +// +// +// +// +// +// + +using System; +using System.Reflection; +using System.Collections; +using System.Collections.Specialized; +using System.Drawing; +using System.ComponentModel; +using System.ComponentModel.Design; + +namespace ICSharpCode.FormDesigner.Services +{ + public class TypeResolutionService : ITypeResolutionService + { + public Assembly GetAssembly(AssemblyName name) + { + return GetAssembly(name, false); + } + + public Assembly GetAssembly(AssemblyName name, bool throwOnError) + { + return Assembly.Load(name); + } + + + public string GetPathOfAssembly(AssemblyName name) + { + Assembly assembly = GetAssembly(name); + if (assembly != null) { + return assembly.Location; + } + return null; + } + + public Type GetType(string name) + { + return GetType(name, false); + } + + public Type GetType(string name, bool throwOnError) + { + return GetType(name, throwOnError, false); + } + + public Type GetType(string name, bool throwOnError, bool ignoreCase) + { + if (name == null || name.Length == 0) { + return null; + } + Assembly lastAssembly = null; + foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { + Type t = asm.GetType(name, throwOnError); + if (t != null) { + lastAssembly = asm; + } + } + if (lastAssembly != null) { + return lastAssembly.GetType(name, throwOnError, ignoreCase); + } + + Type type = Type.GetType(name, throwOnError, ignoreCase); + + // type lookup for typename, assembly, xyz style lookups + if (type == null) { + int idx = name.IndexOf(","); + if (idx > 0) { + string[] splitName = name.Split(','); + string typeName = splitName[0]; + string assemblyName = splitName[1].Substring(1); + Assembly assembly = null; + try { + assembly = Assembly.Load(assemblyName); + } catch (Exception e) { + Console.WriteLine(e); + } + if (assembly != null) { + type = assembly.GetType(typeName, throwOnError, ignoreCase); + } else { + type = Type.GetType(typeName, throwOnError, ignoreCase); + } + } + } + + return type; + } + + public void ReferenceAssembly(AssemblyName name) + { + Console.WriteLine("TODO!!! : Add Assembly reference : " + name); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/UIService.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/UIService.cs new file mode 100644 index 0000000000..11e16899a0 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/Services/UIService.cs @@ -0,0 +1,115 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Collections; +using System.Collections.Specialized; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.FormDesigner.Services +{ + public class UIService : IUIService + { + IDictionary styles = new Hashtable(); + + public IDictionary Styles { + get { + return styles; + } + } + + public UIService() + { + + styles["DialogFont"] = ResourceService.LoadFont("Tahoma", 10); + styles["HighlightColor"] = Color.LightYellow; + } + + public void SetUIDirty() + { + // TODO: Fixme! + } + + #region ComponentEditor functions + public bool CanShowComponentEditor(object component) + { + return false; + } + + public bool ShowComponentEditor(object component, IWin32Window parent) + { + throw new System.NotImplementedException("Cannot display component editor for " + component); + } + #endregion + + #region Dialog functions + public IWin32Window GetDialogOwnerWindow() + { + return WorkbenchSingleton.MainForm; + } + + public DialogResult ShowDialog(Form form) + { + return form.ShowDialog(GetDialogOwnerWindow()); + } + #endregion + + #region Show error functions + public void ShowError(Exception ex) + { + ShowError(ex, null); + } + + public void ShowError(string message) + { + ShowError(null, message); + } + + public void ShowError(Exception ex, string message) + { +// string msg = String.Empty; +// +// if (ex != null) { +// msg = "Exception occurred: " + ex.ToString() + "\n"; +// } +// +// if (message != null) { +// msg += message; +// } + + + MessageBox.Show(GetDialogOwnerWindow(), ex.Message, ResourceService.GetString("Global.ErrorText"), MessageBoxButtons.OK, MessageBoxIcon.Error); + } + #endregion + + #region Show Message functions + public void ShowMessage(string message) + { + ShowMessage(message, "", MessageBoxButtons.OK); + } + + public void ShowMessage(string message, string caption) + { + ShowMessage(message, caption, MessageBoxButtons.OK); + } + + public DialogResult ShowMessage(string message, string caption, MessageBoxButtons buttons) + { + return MessageBox.Show(GetDialogOwnerWindow(), message, caption, buttons); + } + #endregion + + public bool ShowToolWindow(Guid toolWindow) + { + return false; + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs new file mode 100644 index 0000000000..64b4057972 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs @@ -0,0 +1,200 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.Collections; +using System.Drawing; +using System.Drawing.Design; +using System.Reflection; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Drawing.Printing; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.ComponentModel.Design.Serialization; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Internal.Undo; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; + +using ICSharpCode.Core; + +using ICSharpCode.FormDesigner.Services; +using ICSharpCode.FormDesigner.Gui; + +using System.CodeDom; +using System.CodeDom.Compiler; + +using Microsoft.CSharp; +using Microsoft.VisualBasic; + +namespace ICSharpCode.FormDesigner +{ + public class ToolboxProvider + { + static ICSharpCode.FormDesigner.Services.ToolboxService toolboxService = null; + static ITypeResolutionService typeResolutionService = new TypeResolutionService(); + public static ArrayList SideTabs = new ArrayList(); + + static ComponentLibraryLoader componentLibraryLoader = new ComponentLibraryLoader(); + + public static ITypeResolutionService TypeResolutionService { + get { + return typeResolutionService; + } + } + + public static ComponentLibraryLoader ComponentLibraryLoader { + get { + return componentLibraryLoader; + } + } + public static ICSharpCode.FormDesigner.Services.ToolboxService ToolboxService { + get { + if (toolboxService == null) { + toolboxService = new ICSharpCode.FormDesigner.Services.ToolboxService(); + ReloadSideTabs(false); + toolboxService.SelectedItemUsed += new EventHandler(SelectedToolUsedHandler); + } + return toolboxService; + } + } + + static ToolboxProvider() + { + PadDescriptor pad = WorkbenchSingleton.Workbench.GetPad(typeof(SideBarView)); + pad.CreatePad(); + LoadToolbox(); + } + static string componentLibraryFile = "SharpDevelopControlLibrary.sdcl"; + + static string GlobalConfigFile { + get { + return PropertyService.DataDirectory + Path.DirectorySeparatorChar + + "options" + Path.DirectorySeparatorChar + + componentLibraryFile; + } + } + + static string UserConfigFile { + get { + return Path.Combine(PropertyService.ConfigDirectory, componentLibraryFile); + } + } + + public static void SaveToolbox() + { + componentLibraryLoader.SaveToolComponentLibrary(UserConfigFile); + } + + public static void LoadToolbox() + { + if (!componentLibraryLoader.LoadToolComponentLibrary(UserConfigFile)) { + if (!componentLibraryLoader.LoadToolComponentLibrary(GlobalConfigFile)) { + + MessageService.ShowWarning("${res:ICSharpCode.FormDesigner.ToolboxProvider.CantLoadSidbarComponentLibraryWarning}"); + } + } + } + + public static void ReloadSideTabs(bool doInsert) + { + bool reInsertTabs = false; + foreach(AxSideTab tab in SideTabs) { + if (SharpDevelopSideBar.SideBar.Tabs.Contains(tab)) { + SharpDevelopSideBar.SideBar.Tabs.Remove(tab); + reInsertTabs = true;; + } + } + reInsertTabs &= doInsert; + + SideTabs.Clear(); + foreach (Category category in componentLibraryLoader.Categories) { + if (category.IsEnabled) { + try { + SideTabDesigner newTab = new SideTabDesigner(SharpDevelopSideBar.SideBar, category, toolboxService); + SideTabs.Add(newTab); + } catch (Exception e) { + Console.WriteLine("Can't add tab : " + e); + } + } + } + SideTabDesigner customTab = new CustomComponentsSideTab(SharpDevelopSideBar.SideBar, "Custom Components", toolboxService); + SideTabs.Add(customTab); + if (reInsertTabs) { + foreach(AxSideTab tab in SideTabs) { + SharpDevelopSideBar.SideBar.Tabs.Add(tab); + } + } + } + + static void SelectedToolUsedHandler(object sender, EventArgs e) + { + AxSideTab tab = SharpDevelopSideBar.SideBar.ActiveTab; + + // try to add project reference + if (sender != null && sender is ICSharpCode.FormDesigner.Services.ToolboxService && !(tab is CustomComponentsSideTab)) { + ToolboxItem selectedItem = (sender as IToolboxService).GetSelectedToolboxItem(); + if (selectedItem != null) { + if (selectedItem.AssemblyName != null) { +// TODO: Project system... +// //We Put the assembly reference into the reference project folder +// IProject currentProject = ProjectService.CurrentProject; +// +// if (currentProject != null) { +// bool isAlreadyInRefFolder = false; +// +// if (currentProject.ProjectType == "C#" || currentProject.ProjectType == "VBNET") { +// foreach (string assembly in DefaultParserService.AssemblyList) { +// if (selectedItem.AssemblyName.FullName.StartsWith(assembly + ",")) { +// isAlreadyInRefFolder = true; +// break; +// } +// } +// } +// +// foreach (ProjectReference refproj in currentProject.ProjectReferences) { +// if (refproj.ReferenceType == ReferenceType.Assembly) { +// AssemblyName assemblyName = AssemblyName.GetAssemblyName(refproj.Reference); +// if (assemblyName != null && assemblyName.FullName == selectedItem.AssemblyName.FullName) { +// isAlreadyInRefFolder = true; +// break; +// } +// } else if (refproj.ReferenceType == ReferenceType.Gac) { +// if (refproj.Reference == selectedItem.AssemblyName.FullName) { +// isAlreadyInRefFolder = true; +// break; +// } +// } +// } +// +// if (!isAlreadyInRefFolder && !selectedItem.AssemblyName.FullName.StartsWith("System.")) { +// ToolComponent toolComponent = ToolboxProvider.ComponentLibraryLoader.GetToolComponent(selectedItem.AssemblyName.FullName); +// if (toolComponent == null || toolComponent.HintPath == null) { +// currentProject.ProjectReferences.Add(new ProjectReference(ReferenceType.Gac, selectedItem.AssemblyName.FullName)); +// } else { +// currentProject.ProjectReferences.Add(new ProjectReference(ReferenceType.Assembly, toolComponent.FileName)); +// } +// ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView pbv = (ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)WorkbenchSingleton.Workbench.GetPad(typeof(ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)); +// pbv.UpdateCombineTree(); +// projectService.SaveCombine(); +// } +// } + } + } + } + + if (tab.Items.Count > 0) { + tab.ChoosedItem = tab.Items[0]; + } + SharpDevelopSideBar.SideBar.Refresh(); + } + } +} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentAddedUndoAction.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentAddedUndoAction.cs new file mode 100644 index 0000000000..ca77eecfe1 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentAddedUndoAction.cs @@ -0,0 +1,66 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.IO; +//using System.Collections; +//using System.Drawing; +//using System.Drawing.Design; +//using System.Reflection; +//using System.Windows.Forms; +//using System.Drawing.Printing; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Xml; +//using System.ComponentModel.Design.Serialization; +//using ICSharpCode.SharpDevelop.Project; +//using ICSharpCode.SharpDevelop.Internal.Undo; +//using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +// +//using ICSharpCode.Core; +// +//using ICSharpCode.FormDesigner.Services; +//using ICSharpCode.TextEditor; +// +//using System.CodeDom; +//using System.CodeDom.Compiler; +// +//using Microsoft.CSharp; +//using Microsoft.VisualBasic; +// +//using ICSharpCode.SharpDevelop.Gui.ErrorDialogs; +//using ICSharpCode.FormDesigner.Gui; +// +//using ICSharpCode.SharpDevelop.Gui.OptionPanels; +// +//namespace ICSharpCode.FormDesigner { +// +// public class ComponentAddedUndoAction : ICSharpCode.SharpDevelop.Internal.Undo.IUndoableOperation +// { +// IDesignerHost host; +// +// Type componentType; +// string componentName; +// +// public ComponentAddedUndoAction(IDesignerHost host, ComponentEventArgs cea) +// { +// this.host = host; +// componentName = cea.Component.Site.Name; +// componentType = cea.Component.GetType(); +// } +// +// public void Undo() +// { +// host.DestroyComponent(host.Container.Components[componentName]); +// } +// +// public void Redo() +// { +// host.CreateComponent(componentType, componentName); +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentChangedUndoAction.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentChangedUndoAction.cs new file mode 100644 index 0000000000..8413bfb824 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentChangedUndoAction.cs @@ -0,0 +1,190 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.IO; +//using System.Collections; +//using System.Drawing; +//using System.Drawing.Design; +//using System.Reflection; +//using System.Windows.Forms; +//using System.Drawing.Printing; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Xml; +//using System.ComponentModel.Design.Serialization; +//using ICSharpCode.SharpDevelop.Gui; +//using ICSharpCode.SharpDevelop.Project; +//using ICSharpCode.SharpDevelop.Internal.Undo; +//using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +// +//using ICSharpCode.Core; +// +//using ICSharpCode.FormDesigner.Services; +//using ICSharpCode.TextEditor; +// +//using System.CodeDom; +//using System.CodeDom.Compiler; +// +//using Microsoft.CSharp; +//using Microsoft.VisualBasic; +// +//using ICSharpCode.SharpDevelop.Gui.ErrorDialogs; +//using ICSharpCode.FormDesigner.Gui; +// +//using ICSharpCode.SharpDevelop.Gui.OptionPanels; +// +//namespace ICSharpCode.FormDesigner { +// +// public class ComponentChangedUndoAction : ICSharpCode.SharpDevelop.Internal.Undo.IUndoableOperation +// { +// IDesignerHost host; +// +// string componentName; +// MemberDescriptor member; +// bool isCollection; +// bool isComponentCollection; +// object oldValue = null; +// object newValue = null; +// +// public ComponentChangedUndoAction(IDesignerHost host, ComponentChangedEventArgs ea) +// { +// this.host = host; +// IComponent component = ea.Component as IComponent; +// if (component == null) { +// return; +// } +// +// this.member = ea.Member; +// this.componentName = component.Site.Name; +// +// isCollection = ea.NewValue is IList; +// +// if (isCollection) { +// IList oldCol = (IList)ea.OldValue; +// IList newCol = (IList)ea.NewValue; +// object[] newArray = new object[newCol.Count]; +// isComponentCollection = false; +// if (newCol.Count > 0) { +// isComponentCollection = newCol[0] is IComponent; +// } +// +// if (oldCol != null) { +// object[] oldArray = new object[oldCol.Count]; +// if (isComponentCollection) { +// int idx = 0; +// foreach (IComponent cmp in oldCol) { +// oldArray[idx++] = cmp.Site.Name; +// } +// } else { +// oldCol.CopyTo(oldArray, 0); +// } +// this.oldValue = oldArray; +// } +// if (isComponentCollection) { +// int idx = 0; +// foreach (IComponent cmp in newCol) { +// newArray[idx++] = cmp.Site.Name; +// } +// } else { +// newCol.CopyTo(newArray, 0); +// } +// +// this.newValue = newArray; +// } else { +// this.oldValue = ea.OldValue; +// this.newValue = ea.NewValue; +// } +// } +// +// public void Undo() +// { +// ComponentChangeService componentChangeService = (ComponentChangeService)host.GetService(typeof(System.ComponentModel.Design.IComponentChangeService)); +// +// IComponent component = host.Container.Components[componentName]; +// componentChangeService.OnComponentChanging(component, member); +// +// +// Type t = component.GetType(); +// +// PropertyInfo pInfo = t.Get(member.Name); +// if (isCollection) { +// IList coll = (IList)pInfo.GetValue(component, null); +// +// if (isComponentCollection) { +// int idx = 0; +// foreach (string name in (object[])oldValue) { +// try { +// if (coll is Menu.MenuItemCollection) { +// ((Menu.MenuItemCollection)coll).Add(idx++, (MenuItem)host.Container.Components[name]); +// } else { +// coll.Add(host.Container.Components[name]); +// } +// } catch (Exception e) { +// +// MessageService.ShowError(e, "Can't add " + name + " to collection."); +// } +// } +// } else { +// foreach (object o in (object[])oldValue) { +// coll.Add(o); +// } +// } +// } else { +// pInfo.SetValue(component, oldValue, null); +// } +// componentChangeService.OnComponentChanged(component, +// member, +// newValue, +// oldValue); +// } +// +// public void Redo() +// { +// ComponentChangeService componentChangeService = (ComponentChangeService)host.GetService(typeof(System.ComponentModel.Design.IComponentChangeService)); +// +// IComponent component = host.Container.Components[componentName]; +// componentChangeService.OnComponentChanging(component, member); +// Type t = component.GetType(); +// if (isCollection) { +// IList coll = (IList)t.InvokeMember(member.Name, +// BindingFlags.Public | +// BindingFlags.NonPublic | +// BindingFlags.Instance | +// BindingFlags.FlattenHierarchy | +// BindingFlags.GetProperty, +// null, +// component, +// null); +// coll.Clear(); +// if (isComponentCollection) { +// foreach (string name in (object[])newValue) { +// coll.Add(host.Container.Components[name]); +// } +// } else { +// foreach (object o in (object[])newValue) { +// coll.Add(o); +// } +// } +// } else { +// t.InvokeMember(member.Name, +// BindingFlags.Public | +// BindingFlags.NonPublic | +// BindingFlags.Instance | +// BindingFlags.FlattenHierarchy | +// BindingFlags.SetProperty, +// null, +// component, +// new object[] { newValue }); +// } +// componentChangeService.OnComponentChanged(component, +// member, +// oldValue, +// newValue); +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentRemovedUndoAction.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentRemovedUndoAction.cs new file mode 100644 index 0000000000..5b731b4a0c --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/ComponentRemovedUndoAction.cs @@ -0,0 +1,89 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.IO; +//using System.Collections; +//using System.Drawing; +//using System.Drawing.Design; +//using System.Reflection; +//using System.Windows.Forms; +//using System.Drawing.Printing; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Xml; +//using System.ComponentModel.Design.Serialization; +//using ICSharpCode.SharpDevelop.Gui; +//using ICSharpCode.SharpDevelop.Project; +//using ICSharpCode.SharpDevelop.Internal.Undo; +//using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +// +// +//using ICSharpCode.FormDesigner.Services; +//using ICSharpCode.Core; +//using ICSharpCode.TextEditor; +// +//using System.CodeDom; +//using System.CodeDom.Compiler; +// +//using Microsoft.CSharp; +//using Microsoft.VisualBasic; +// +//using ICSharpCode.SharpDevelop.Gui.ErrorDialogs; +//using ICSharpCode.FormDesigner.Gui; +// +//using ICSharpCode.SharpDevelop.Gui.OptionPanels; +// +//namespace ICSharpCode.FormDesigner { +// +// public class ComponentRemovedUndoAction : ICSharpCode.SharpDevelop.Internal.Undo.IUndoableOperation +// { +// IDesignerHost host; +// +// Type componentType; +// string componentName; +// string parent; +// IComponent oldComponent; +// +// public ComponentRemovedUndoAction(IDesignerHost host, ComponentEventArgs cea, string parent) +// { +// this.host = host; +// oldComponent = cea.Component; +// componentName = cea.Component.Site.Name; +// componentType = cea.Component.GetType(); +// this.parent = parent; +// } +// +// public void Undo() +// { +// IComponent component = host.CreateComponent(componentType, componentName); +// if (parent != null && parent.Length > 0) { +// IComponent parentCtrl = host.Container.Components[parent]; +// ((Control)parentCtrl).Controls.Add((Control)component); +// } +// +// PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(oldComponent.GetType()); +// foreach (PropertyDescriptor pd in properties) { +// try { +// if (pd.ShouldSerializeValue(oldComponent) && pd.IsBrowsable) { +// if (pd.Name == "Visible") { +// continue; +// } +// pd.SetValue(component, pd.GetValue(oldComponent)); +// } +// } catch (Exception e) { +// Console.WriteLine(e); +// } +// } +// } +// +// public void Redo() +// { +// host.DestroyComponent(host.Container.Components[componentName]); +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/SelectComponentsUndoAction.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/SelectComponentsUndoAction.cs new file mode 100644 index 0000000000..6aa28ed851 --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/SelectComponentsUndoAction.cs @@ -0,0 +1,71 @@ +//// +//// +//// +//// +//// +//// +// +//using System; +//using System.IO; +//using System.Collections; +//using System.Drawing; +//using System.Drawing.Design; +//using System.Reflection; +//using System.Windows.Forms; +//using System.Drawing.Printing; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Xml; +//using System.ComponentModel.Design.Serialization; +//using ICSharpCode.SharpDevelop.Gui; +//using ICSharpCode.SharpDevelop.Project; +//using ICSharpCode.SharpDevelop.Internal.Undo; +//using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +// +// +//using ICSharpCode.FormDesigner.Services; +//using ICSharpCode.Core; +//using ICSharpCode.TextEditor; +// +//using System.CodeDom; +//using System.CodeDom.Compiler; +// +//using Microsoft.CSharp; +//using Microsoft.VisualBasic; +// +//using ICSharpCode.SharpDevelop.Gui.ErrorDialogs; +//using ICSharpCode.FormDesigner.Gui; +// +//using ICSharpCode.SharpDevelop.Gui.OptionPanels; +// +//namespace ICSharpCode.FormDesigner { +// +// public class SelectComponentsUndoAction : ICSharpCode.SharpDevelop.Internal.Undo.IUndoableOperation +// { +// IDesignerHost host; +// +// ArrayList oldComponentNames; +// ArrayList newComponentNames; +// +// public SelectComponentsUndoAction(IDesignerHost host, ArrayList oldComponentNames) +// { +// this.host = host; +// this.oldComponentNames = oldComponentNames; +// } +// +// public void SetNewSelection(ArrayList newComponentNames) +// { +// this.newComponentNames = newComponentNames; +// } +// +// public void Undo() +// { +// UndoHandler.SetSelectedComponentsPerName(host, oldComponentNames); +// } +// +// public void Redo() +// { +// UndoHandler.SetSelectedComponentsPerName(host, newComponentNames); +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/UndoHandler.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/UndoHandler.cs new file mode 100644 index 0000000000..eb0073306e --- /dev/null +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/UndoRedo/UndoHandler.cs @@ -0,0 +1,266 @@ +//// +////
+// +//using System; +//using System.IO; +//using System.Collections; +//using System.Drawing; +//using System.Drawing.Design; +//using System.Reflection; +//using System.Windows.Forms; +//using System.Drawing.Printing; +//using System.ComponentModel; +//using System.ComponentModel.Design; +//using System.Xml; +//using System.ComponentModel.Design.Serialization; +//using ICSharpCode.SharpDevelop.Gui; +//using ICSharpCode.SharpDevelop.Project; +//using ICSharpCode.SharpDevelop.Internal.Undo; +//using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +// +//using ICSharpCode.Core; +// +//using ICSharpCode.FormDesigner.Services; +//using ICSharpCode.TextEditor; +// +//using System.CodeDom; +//using System.CodeDom.Compiler; +// +//using Microsoft.CSharp; +//using Microsoft.VisualBasic; +// +//using ICSharpCode.SharpDevelop.Gui.ErrorDialogs; +//using ICSharpCode.FormDesigner.Gui; +// +//using ICSharpCode.SharpDevelop.Gui.OptionPanels; +// +//namespace ICSharpCode.FormDesigner { +// +// public class UndoHandler +// { +// IDesignerHost host; +// Hashtable sizePos = new Hashtable(); +// +// ICSharpCode.SharpDevelop.Internal.Undo.UndoStack undoStack = new ICSharpCode.SharpDevelop.Internal.Undo.UndoStack(); +// +// bool inUndoRedo = false; +// int transactionLevel = 0; +// int undoOperations = 0; +// +// public bool EnableUndo { +// get { +// return undoStack.CanUndo; +// } +// } +// public bool EnableRedo { +// get { +// return undoStack.CanRedo; +// } +// } +// +// public void Reset() +// { +// undoStack.ClearAll(); +// } +// +// // BUG ALERT !!! +// // WINDOWS FORMS DESIGNER BUG: +// // MOVE/RESIZE IN THE DESIGNER --> OldValue == NewValue in change event +// // THEREFORE A WORKAROUND IS NEEDED (AN UGLY WORKAROUND) +// // BUG ALERT 2 !!! +// // SOME MS CODERS DON'T KNOW THE DIFFERENCE BETWEEN REFERENCE AND VALUE !!! +// // CONTROL COLLECTION new/old values are the same !!!! +// void InitSizePosTable() +// { +// sizePos.Clear(); +// foreach (IComponent component in host.Container.Components) { +// Control ctrl = component as Control; +// if (ctrl != null) { +// object[] ctrlCol = new object[ctrl.Controls.Count]; +// ctrl.Controls.CopyTo(ctrlCol, 0); +// sizePos[component.Site.Name] = new object[] { ctrl.Location, ctrl.Size, ctrlCol}; +// } +// } +// } +// +// void ComponentChanged(object sender, ComponentChangedEventArgs ea) +// { +// if (inUndoRedo) { +// return; +// } +// if (ea.Component == null || (ea.Component is IComponent == false)) { +// return; +// } +// +// ++undoOperations; +// if (ea.Member != null) +// { +// if (sizePos[((IComponent)ea.Component).Site.Name] != null) +// { +// if (ea.Member.Name == "Location") +// { +// ea = new ComponentChangedEventArgs(ea.Component, ea.Member, ((object[])sizePos[((IComponent)ea.Component).Site.Name])[0], ea.NewValue); +// } +// else if (ea.Member.Name == "Size") +// { +// ea = new ComponentChangedEventArgs(ea.Component, ea.Member, ((object[])sizePos[((IComponent)ea.Component).Site.Name])[1], ea.NewValue); +// } +// else if (ea.Member.Name == "Controls") +// { +// ea = new ComponentChangedEventArgs(ea.Component, ea.Member, ((object[])sizePos[((IComponent)ea.Component).Site.Name])[2], ea.NewValue); +// } +// } +// } +// undoStack.Push(new ComponentChangedUndoAction(host, ea)); +// } +// +// void ComponentAdded(object sender, ComponentEventArgs ea) +// { +// if (inUndoRedo) { +// return; +// } +// ++undoOperations; +// undoStack.Push(new ComponentAddedUndoAction(host, ea)); +// } +// +// void ComponentRemoved(object sender, ComponentEventArgs ea) +// { +// if (inUndoRedo) { +// return; +// } +// ++undoOperations; +// string parentName = null; +// foreach (DictionaryEntry entry in sizePos) { +// object[] arr = (object[])entry.Value; +// if (arr[2] != null) { +// foreach (object ctr in ((IList)arr[2])) { +// if (ctr == ea.Component) { +// parentName = entry.Key.ToString(); +// } +// } +// } +// } +// undoStack.Push(new ComponentRemovedUndoAction(host, ea, parentName)); +// } +// SelectComponentsUndoAction selectComponentsUndoAction = null; +// +// void TransactionOpened(object sender, EventArgs e) +// { +// if (transactionLevel == 0) { +// undoOperations = 0; +// InitSizePosTable(); +// selectComponentsUndoAction = new SelectComponentsUndoAction(host, GetSelectedComponentNames(host)); +// undoStack.Push(selectComponentsUndoAction); +// } +// ++transactionLevel; +// } +// +// void TransactionClosed(object sender, DesignerTransactionCloseEventArgs e) +// { +// --transactionLevel; +// if (transactionLevel == 0 && undoOperations > 0) { +// if (selectComponentsUndoAction != null) { +// selectComponentsUndoAction.SetNewSelection(GetSelectedComponentNames(host)); +// selectComponentsUndoAction = null; +// } +// undoStack.UndoLast(undoOperations + 1); +// ((DefaultWorkbench)WorkbenchSingleton.Workbench).UpdateToolbars(); +// } +// } +// +// public static ArrayList GetSelectedComponentNames(IDesignerHost host) +// { +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// ArrayList names = new ArrayList(); +// +// foreach (IComponent component in selectionService.GetSelectedComponents()) { +// if (component.Site != null) { +// names.Add(component.Site.Name); +// } else { +// +// MessageService.ShowError(component + " has no site."); +// } +// } +// return names; +// } +// +// public static void SetSelectedComponentsPerName(IDesignerHost host, ArrayList names) +// { +// ArrayList components = new ArrayList(); +// +// foreach (string name in names) { +// if (host.Container.Components[name] != null) { +// components.Add(host.Container.Components[name]); +// } else { +// +// MessageService.ShowError("Can't select component : Component " + name + " not found."); +// } +// } +// +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// selectionService.SetSelectedComponents(components); +// } +// +// +// public void Attach(IDesignerHost host) +// { +// this.host = host; +// +// IComponentChangeService componentChangeService = (IComponentChangeService)host.GetService(typeof(IComponentChangeService)); +// componentChangeService.ComponentChanged += new ComponentChangedEventHandler(ComponentChanged); +// componentChangeService.ComponentAdded += new ComponentEventHandler(ComponentAdded); +// componentChangeService.ComponentRemoved += new ComponentEventHandler(ComponentRemoved); +// +// host.TransactionOpened += new EventHandler(TransactionOpened); +// host.TransactionClosed += new DesignerTransactionCloseEventHandler(TransactionClosed); +// } +// +// public void Detach() +// { +// IComponentChangeService componentChangeService = (IComponentChangeService)host.GetService(typeof(IComponentChangeService)); +// componentChangeService.ComponentChanged -= new ComponentChangedEventHandler(ComponentChanged); +// componentChangeService.ComponentAdded -= new ComponentEventHandler(ComponentAdded); +// componentChangeService.ComponentRemoved -= new ComponentEventHandler(ComponentRemoved); +// +// host.TransactionOpened -= new EventHandler(TransactionOpened); +// host.TransactionClosed -= new DesignerTransactionCloseEventHandler(TransactionClosed); +// } +// +// public void Undo() +// { +// inUndoRedo = true; +// try { +// undoStack.Undo(); +// UpdateSelectableObjects(); +// } catch (Exception e) { +// Console.WriteLine("UndoException : " + e.ToString()); +// } finally { +// inUndoRedo = false; +// } +// } +// +// public void Redo() +// { +// inUndoRedo = true; +// try { +// undoStack.Redo(); +// UpdateSelectableObjects(); +// } catch (Exception e) { +// Console.WriteLine("UndoException : " + e.ToString()); +// } finally { +// inUndoRedo = false; +// } +// } +// +// protected void UpdateSelectableObjects() +// { +// if (host != null) { +// PropertyPad.SetSelectableObjects(host.Container.Components); +// ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); +// if (selectionService != null) { +// ICSharpCode.SharpDevelop.Gui.PropertyPad.SetDesignableObject(selectionService.PrimarySelection); +// } +// } +// } +// } +//} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Configuration/AssemblyInfo.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..0a023139e0 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("Resource editor")] +[assembly: AssemblyDescription("Resource editor display binding for #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("www.icsharpcode.net")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) Mike Krueger/Markus Palme")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.addin b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.addin new file mode 100644 index 0000000000..40c00be6a8 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.addin @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj new file mode 100644 index 0000000000..8e50efa532 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj @@ -0,0 +1,80 @@ + + + Debug + AnyCPU + 8.0.41115 + 2.0 + {CBC6C247-747B-4908-B09A-4D2E0F640B6B} + ResourceEditor + Library + 4 + False + False + OnSuccessfulBuild + Library + + + True + True + True + True + ..\..\..\AddIns\DisplayBindings\ + False + + + True + True + True + True + ..\..\..\AddIns\DisplayBindings\ + False + + + + + + + + + + + + + + + + + + + UserControl + + + + + + + + UserControl + + + + + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + False + + + + + + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj.user b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj.user new file mode 100644 index 0000000000..746ae1f782 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj.user @@ -0,0 +1,9 @@ + + + + + 8.0.41115 + ShowAllFiles + 0 + + \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/AddNewFileCommand.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/AddNewFileCommand.cs new file mode 100644 index 0000000000..d5e0d9fc3f --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/AddNewFileCommand.cs @@ -0,0 +1,112 @@ +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; +using System.Runtime.Serialization.Formatters.Binary; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ResourceEditor +{ + class AddNewFileCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditorControl editor = (ResourceEditorControl)window.ViewContent.Control; + + if(editor.ResourceList.WriteProtected) { + return; + } + + using (OpenFileDialog fdiag = new OpenFileDialog()) { + fdiag.AddExtension = true; + fdiag.Filter = "All files (*.*)|*.*"; + fdiag.Multiselect = true; + fdiag.CheckFileExists = true; + + if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + foreach (string filename in fdiag.FileNames) { + string oresname = Path.ChangeExtension(Path.GetFileName(filename), null); + if (oresname == "") oresname = "new"; + + string resname = oresname; + + int i = 0; + TestName: + if (editor.ResourceList.Resources.ContainsKey(resname)) { + if (i == 10) { + continue; + } + i++; + resname = oresname + "_" + i.ToString(); + goto TestName; + } + + object tmp = loadResource(filename); + if (tmp == null) { + continue; + } + editor.ResourceList.Resources.Add(resname, new ResourceItem(resname, tmp)); + + } + editor.ResourceList.InitializeListView(); + } + } + editor.ResourceList.OnChanged(); + } + + object loadResource(string name) + { + switch (Path.GetExtension(name).ToUpper()) { + case ".CUR": + try { + return new Cursor(name); + } catch { + return null; + } + case ".ICO": + try { + return new Icon(name); + } catch { + return null; + } + default: + // try to read a bitmap + try { + return new Bitmap(name); + } catch {} + + // try to read a serialized object + try { + Stream r = File.Open(name, FileMode.Open); + try { + BinaryFormatter c = new BinaryFormatter(); + object o = c.Deserialize(r); + r.Close(); + return o; + } catch { r.Close(); } + } catch { } + + // try to read a byte array :) + try { + FileStream s = new FileStream(name, FileMode.Open); + BinaryReader r = new BinaryReader(s); + Byte[] d = new Byte[(int) s.Length]; + d = r.ReadBytes((int) s.Length); + s.Close(); + return d; + } catch(Exception) { + + + string message = ResourceService.GetString("ResourceEditor.Messages.CantLoadResource"); + MessageService.ShowWarning(message + " " + name + "."); + } + break; + } + return null; + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/AddStringEntryCommand.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/AddStringEntryCommand.cs new file mode 100644 index 0000000000..f78fe21f98 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/AddStringEntryCommand.cs @@ -0,0 +1,39 @@ +using System; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ResourceEditor +{ + class AddStringCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditorControl editor = (ResourceEditorControl)window.ViewContent.Control; + + if(editor.ResourceList.WriteProtected) { + return; + } + + int count = 1; + string newNameBase = " new string entry "; + string newName = newNameBase + count.ToString(); + string type = "System.String"; + + while(editor.ResourceList.Resources.ContainsKey(newName)) { + count++; + newName = newNameBase + count.ToString(); + } + + ResourceItem item = new ResourceItem(newName, ""); + editor.ResourceList.Resources.Add(newName, item); + ListViewItem lv = new ListViewItem(new string[] { newName, type, "" }, item.ImageIndex); + editor.ResourceList.Items.Add(lv); + editor.ResourceList.OnChanged(); + lv.BeginEdit(); + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/ClipboardCommands.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/ClipboardCommands.cs new file mode 100644 index 0000000000..fdfe9c2da6 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/ClipboardCommands.cs @@ -0,0 +1,22 @@ +using System; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ResourceEditor +{ + + class SelectAllCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditWrapper editor = (ResourceEditWrapper)window.ViewContent; + + editor.SelectAll(); + } + } + +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/CopyResourceNameCommand.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/CopyResourceNameCommand.cs new file mode 100644 index 0000000000..2de23838b0 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/CopyResourceNameCommand.cs @@ -0,0 +1,22 @@ +using System; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ResourceEditor +{ + class CopyResourceNameCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditorControl editor = (ResourceEditorControl)window.ViewContent.Control; + + if(editor.ResourceList.SelectedItems.Count > 0) { + Clipboard.SetDataObject(editor.ResourceList.SelectedItems[0].Text, true); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/DeleteEntryCommand.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/DeleteEntryCommand.cs new file mode 100644 index 0000000000..ec4f80927e --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/DeleteEntryCommand.cs @@ -0,0 +1,20 @@ +using System; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ResourceEditor +{ + class DeleteEntryCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditWrapper editor = (ResourceEditWrapper)window.ViewContent; + + editor.Delete(); + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/RenameEntryCommand.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/RenameEntryCommand.cs new file mode 100644 index 0000000000..f552d3dffc --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/RenameEntryCommand.cs @@ -0,0 +1,23 @@ +using System; +using System.Windows.Forms; +using System.IO; +using System.Drawing; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; +namespace ResourceEditor +{ + class RenameEntryCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditorControl editor = (ResourceEditorControl)window.ViewContent.Control; + + if(editor.ResourceList.SelectedItems.Count != 0) { + editor.ResourceList.SelectedItems[0].BeginEdit(); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/SaveEntryAsCommand.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/SaveEntryAsCommand.cs new file mode 100644 index 0000000000..bb826fe764 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/Commands/SaveEntryAsCommand.cs @@ -0,0 +1,75 @@ +using System; +using System.Windows.Forms; +using System.IO; +using System.Drawing; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ResourceEditor +{ + class SaveEntryAsCommand : AbstractMenuCommand + { + public override void Run() + { + IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow; + ResourceEditorControl editor = (ResourceEditorControl)window.ViewContent.Control; + ResourceList list = editor.ResourceList; + + if(list.SelectedItems.Count != 1) { + return; + } + + string key = list.SelectedItems[0].Text; + if(! list.Resources.ContainsKey(key)) { + return; + } + + ResourceItem item = list.Resources[key]; + SaveFileDialog sdialog = new SaveFileDialog(); + sdialog.AddExtension = true; + sdialog.FileName = key; + + if (item.ResourceValue is Bitmap) { + sdialog.Filter = "Bitmap files (*.bmp)|*.bmp"; + sdialog.DefaultExt = ".bmp"; + } else if (item.ResourceValue is Icon) { + sdialog.Filter = "Icon files (*.ico)|*.ico"; + sdialog.DefaultExt = ".ico"; + } else if (item.ResourceValue is Cursor) { + sdialog.Filter = "Cursor files (*.cur)|*.cur"; + sdialog.DefaultExt = ".cur"; + } else if (item.ResourceValue is byte[]){ + sdialog.Filter = "Binary files (*.*)|*.*"; + sdialog.DefaultExt = ".bin"; + } else { + return; + } + + DialogResult dr = sdialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + sdialog.Dispose(); + if (dr != DialogResult.OK) { + return; + } + + try { + if (item.ResourceValue is Icon) { + FileStream fstr = new FileStream(sdialog.FileName, FileMode.Create); + ((Icon)item.ResourceValue).Save(fstr); + fstr.Close(); + } else if(item.ResourceValue is Image) { + Image img = (Image)item.ResourceValue; + img.Save(sdialog.FileName); + } else { + FileStream fstr = new FileStream(sdialog.FileName, FileMode.Create); + BinaryWriter wr = new BinaryWriter(fstr); + wr.Write((byte[])item.ResourceValue); + fstr.Close(); + } + } catch(Exception ex) { + MessageBox.Show(ex.Message, "Can't save resource to " + sdialog.FileName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs new file mode 100644 index 0000000000..1c93b0b435 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs @@ -0,0 +1,269 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui; + +using ResourceEditor; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + public class ResourceEditorDisplayBinding : IDisplayBinding + { + // IDisplayBinding interface + public bool CanCreateContentForFile(string fileName) + { + return Path.GetExtension(fileName).ToUpper() == ".RESOURCES" || + Path.GetExtension(fileName).ToUpper() == ".RESX"; + } + + public bool CanCreateContentForLanguage(string language) + { + return language == "ResourceFiles"; + } + + public IViewContent CreateContentForFile(string fileName) + { + ResourceEditWrapper di2 = new ResourceEditWrapper(); + di2.Load(fileName); + return di2; + } + + public IViewContent CreateContentForLanguage(string language, string content) + { + return new ResourceEditWrapper(); + } + } + + /// + /// This class describes the main functionality of a language codon + /// + public class ResourceEditWrapper : AbstractViewContent, IClipboardHandler + { + ResourceEditorControl resourceEditor = new ResourceEditorControl(); + + public override Control Control { + get { + return resourceEditor; + } + } + + public override bool IsReadOnly { + get { + return false; + } + } + + void SetDirty(object sender, EventArgs e) + { + IsDirty = true; + } + + public ResourceEditWrapper() + { + resourceEditor.ResourceList.Changed += new EventHandler(SetDirty); + } + + public override void RedrawContent() + { + } + + public override void Dispose() + { + resourceEditor.Dispose(); + } + + public override void Save() + { + Save(FileName); + } + + public override void Load(string filename) + { + resourceEditor.ResourceList.LoadFile(filename); + TitleName = Path.GetFileName(filename); + FileName = filename; + IsDirty = false; + } + + public override void Save(string filename) + { + OnSaving(EventArgs.Empty); + resourceEditor.ResourceList.SaveFile(filename); + TitleName = Path.GetFileName(filename); + FileName = filename; + IsDirty = false; + OnSaved(new SaveEventArgs(true)); + } + + + public bool EnableCut + { + get { + return resourceEditor.ResourceList.SelectedItems.Count > 0; + } + } + + public bool EnableCopy + { + get { + return resourceEditor.ResourceList.SelectedItems.Count > 0; + } + } + + public bool EnablePaste + { + get { + return true; + } + } + + public bool EnableDelete + { + get { + return resourceEditor.ResourceList.SelectedItems.Count > 0; + } + } + + public bool EnableSelectAll + { + get { + return true; + } + } + + public void Cut() + { + if (resourceEditor.ResourceList.WriteProtected || resourceEditor.ResourceList.SelectedItems.Count < 1) + return; + + Hashtable tmphash = new Hashtable(); + foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) { + tmphash.Add(item.Text, resourceEditor.ResourceList.Resources[item.Text].ResourceValue); + resourceEditor.ResourceList.Resources.Remove(item.Text); + resourceEditor.ResourceList.Items.Remove(item); + } + resourceEditor.ResourceList.OnChanged(); + Clipboard.SetDataObject(tmphash); + } + + public void Copy() + { + if (resourceEditor.ResourceList.SelectedItems.Count < 1) { + return; + } + + Hashtable tmphash = new Hashtable(); + foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) { + object resourceValue = GetClonedResource(resourceEditor.ResourceList.Resources[item.Text].ResourceValue); + tmphash.Add(item.Text, resourceValue); // copy a clone to clipboard + } + Clipboard.SetDataObject(tmphash); + } + + public void Paste() + { + if (resourceEditor.ResourceList.WriteProtected) { + return; + } + + IDataObject dob = Clipboard.GetDataObject(); + + if (dob.GetDataPresent(typeof(Hashtable).FullName)) { + Hashtable tmphash = (Hashtable)dob.GetData(typeof(Hashtable)); + foreach (DictionaryEntry entry in tmphash) { + + object resourceValue = GetClonedResource(entry.Value); + ResourceItem item; + + if (!resourceEditor.ResourceList.Resources.ContainsKey((string)entry.Key)) { + item = new ResourceItem(entry.Key.ToString(), resourceValue); + } else { + int count = 1; + string newNameBase = entry.Key.ToString() + " "; + string newName = newNameBase + count.ToString(); + + while(resourceEditor.ResourceList.Resources.ContainsKey(newName)) { + count++; + newName = newNameBase + count.ToString(); + } + item = new ResourceItem(newName, resourceValue); + } + resourceEditor.ResourceList.Resources.Add(item.Name, item); + resourceEditor.ResourceList.OnChanged(); + } + resourceEditor.ResourceList.InitializeListView(); + } + } + + /// + /// Clones a resource if the + /// is cloneable. + /// + /// A resource to clone. + /// A cloned resource if the object implements + /// the ICloneable interface, otherwise the + /// object. + object GetClonedResource(object resource) + { + object clonedResource = null; + + ICloneable cloneableResource = resource as ICloneable; + if (cloneableResource != null) { + clonedResource = cloneableResource.Clone(); + } else { + clonedResource = resource; + } + + return clonedResource; + } + + public void Delete() + { + if (resourceEditor.ResourceList.WriteProtected) { + return; + } + + if (resourceEditor.ResourceList.SelectedItems.Count==0) return; // nothing to do + DialogResult rc; + + try { + + rc=MessageBox.Show(ResourceService.GetString("ResourceEditor.DeleteEntry.Confirm"),ResourceService.GetString("ResourceEditor.DeleteEntry.Title"),MessageBoxButtons.OKCancel); + } + catch { + // when something happens - like resource is missing - try to use default message + rc = MessageBox.Show("Do you really want to delete?","Delete-Warning!",MessageBoxButtons.OKCancel); + } + + if (rc != DialogResult.OK) { + return; + } + + foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) { + //// not clear why this check is present here - seems to be extra + ////if (item.Text != null) { + resourceEditor.ResourceList.Resources.Remove(item.Text); + resourceEditor.ResourceList.Items.Remove(item); + // and set dirty flag + resourceEditor.ResourceList.OnChanged(); + } + } + + public void SelectAll() + { + foreach (ListViewItem i in resourceEditor.ResourceList.Items) { + i.Selected=true; + } + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/AbstractImageView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/AbstractImageView.cs new file mode 100644 index 0000000000..a1fc1f6405 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/AbstractImageView.cs @@ -0,0 +1,82 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + /// + /// This control is used for displaying images. Large images + /// can be scrolled. + /// + abstract class AbstractImageView : ScrollableControl, IResourceView + { + protected PictureBox pictureBox; + + public event ResourceChangedEventHandler ResourceChanged; + + public abstract ResourceItem ResourceItem + { + get; + set; + } + + public abstract bool WriteProtected + { + get; + set; + } + + protected void resized(object sender, EventArgs e) + { + adjustMargin(); + } + + protected AbstractImageView(ResourceItem item) + { + Dock = DockStyle.Fill; + AutoScroll = true; + pictureBox = new PictureBox(); + pictureBox.BorderStyle = BorderStyle.FixedSingle; + this.SizeChanged += new EventHandler(resized); + pictureBox.SizeMode = PictureBoxSizeMode.AutoSize; + Controls.Add(this.pictureBox); + ResourceItem = item; + } + + protected void OnResourceChanged(string resourceName, object val) + { + if(ResourceChanged != null) { + ResourceChanged(this, new ResourceEventArgs(resourceName, val)); + } + } + + protected void adjustMargin() + { + int deltaY = Height - pictureBox.Image.Height; + int deltaX = Width - pictureBox.Image.Width; + + if(deltaY > 0) { + pictureBox.Top = deltaY / 2; + } + pictureBox.Top = Math.Max(pictureBox.Top, 20); + + if(deltaX > 0) { + pictureBox.Left = deltaX / 2; + } + pictureBox.Left = Math.Max(pictureBox.Left, 20); + AutoScrollMargin = new Size(pictureBox.Left / 2, pictureBox.Top / 2); + } + } +} + diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BinaryView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BinaryView.cs new file mode 100644 index 0000000000..3142cef360 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BinaryView.cs @@ -0,0 +1,129 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using System.Text; +using System.Text.RegularExpressions; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + /// + /// This class displays binary data. + /// + class BinaryView : UserControl, IResourceView + { + TextBox byteDataTextBox = new TextBox(); + CheckBox viewHexDumpCheckBox = new CheckBox(); + + ResourceItem resourceItem; + + ASCIIEncoding enc = new ASCIIEncoding(); + Regex rgex = new Regex(@"\p{Cc}"); + + public event ResourceChangedEventHandler ResourceChanged; + + public BinaryView(ResourceItem item) + { + + + byteDataTextBox.ReadOnly = true; + byteDataTextBox.Multiline = true; + + byteDataTextBox.Top = 24; + byteDataTextBox.Left = 0; + byteDataTextBox.Width = Width; + byteDataTextBox.Height = Height - 24; + byteDataTextBox.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Top; + byteDataTextBox.Font = ResourceService.LoadFont("Courier New", 10); + byteDataTextBox.ScrollBars = ScrollBars.Both; + byteDataTextBox.BackColor = SystemColors.Window; + + viewHexDumpCheckBox.Location = new Point(8, 4); + viewHexDumpCheckBox.Size = new Size(Width - 16, 16); + viewHexDumpCheckBox.Text = "Show as Hex Dump"; + viewHexDumpCheckBox.CheckedChanged += new EventHandler(CheckEvt); + + Controls.Add(byteDataTextBox); + Controls.Add(viewHexDumpCheckBox); + byteDataTextBox.Select(); + ResourceItem = item; + } + + public bool WriteProtected + { + get { + return true; + } + set { + } + } + + public ResourceItem ResourceItem + { + get { + return resourceItem; + } + set { + resourceItem = value; + showData(); + } + } + + protected void OnResourceChanged(string resourceName, object val) + { + if(ResourceChanged != null) { + ResourceChanged(this, new ResourceEventArgs(resourceName, val)); + } + } + + void showData() + { + byte[] bytes= (byte[])ResourceItem.ResourceValue; + string regText = enc.GetString(bytes).Replace("\x0", "."); + + if (viewHexDumpCheckBox.Checked) { + // Hex Dump + StringBuilder sb = new StringBuilder(); + + string byteString = BitConverter.ToString(bytes).Replace("-", " "); + string stext = rgex.Replace(regText, "."); + + byteDataTextBox.Text = ""; + int max = bytes.Length; + int last = max % 16; + + int i = 0; + int count = 16; + do { + sb.Append(String.Format("{0:X8} ", i) + + byteString.Substring(i*3, (count * 3) - 1) + " " + + stext.Substring(i, count) + "\r\n"); + i += 16; + if (i >= (max - last)) { + count = last; + } + } while (i < max); + byteDataTextBox.Text = sb.ToString(); + } else { + // Regular Text + byteDataTextBox.Text = regText; + } + } + + public void CheckEvt(object sender, EventArgs e) + { + showData(); + } + + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BitmapView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BitmapView.cs new file mode 100644 index 0000000000..60caa06e4e --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BitmapView.cs @@ -0,0 +1,83 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + /// + /// This control is used for displaying images. Large images + /// can be scrolled. + /// + class BitmapView : AbstractImageView + { + ResourceItem resourceItem; + LinkLabel updateLinkLabel; + + public BitmapView(ResourceItem item) : base(item) + { + + updateLinkLabel = new LinkLabel(); + updateLinkLabel.Text = ResourceService.GetString("ResourceEditor.BitmapView.UpdateBitmap"); + updateLinkLabel.Location = new Point(4, 4); + updateLinkLabel.AutoSize = true; + updateLinkLabel.Click += new EventHandler(updateBitmapLinkLabelClick); + Controls.Add(updateLinkLabel); + } + + void updateBitmapLinkLabelClick(object sender, EventArgs e) + { + using(OpenFileDialog fileDialog = new OpenFileDialog()) + { + Bitmap bitmap; + fileDialog.AddExtension = true; + fileDialog.Filter = "All files (*.*)|*.*"; + fileDialog.CheckFileExists = true; + + if(fileDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + try { + bitmap = new Bitmap(fileDialog.FileName); + } catch { + + MessageService.ShowWarning("Can't load bitmap file."); + return; + } + ResourceItem = new ResourceItem(resourceItem.Name, bitmap); + OnResourceChanged(resourceItem.Name, bitmap); + } + } + } + + public override bool WriteProtected + { + get { + return true; + } + set { + } + } + + public override ResourceItem ResourceItem + { + get { + return resourceItem; + } + set { + resourceItem = value; + pictureBox.Image = (Bitmap)value.ResourceValue; + adjustMargin(); + } + } + } +} + diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BooleanView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BooleanView.cs new file mode 100644 index 0000000000..08c6c9dd40 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/BooleanView.cs @@ -0,0 +1,71 @@ +using System; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + class BooleanView : Panel, IResourceView + { + public event ResourceChangedEventHandler ResourceChanged; + private ResourceItem resourceItem; + + private RadioButton trueRadioButton = new RadioButton(); + private RadioButton falseRadioButton = new RadioButton(); + + public BooleanView(ResourceItem item) + { + trueRadioButton.Location = new Point(4, 4); + trueRadioButton.Text = "True"; + trueRadioButton.CheckedChanged += new EventHandler(valueChanged); + Controls.Add(trueRadioButton); + + falseRadioButton.Location = new Point(4, 24); + falseRadioButton.Text = "False"; + falseRadioButton.CheckedChanged += new EventHandler(valueChanged); + Controls.Add(falseRadioButton); + + ResourceItem = item; + } + + public bool WriteProtected + { + get { + return ! trueRadioButton.Enabled; + } + set { + trueRadioButton.Enabled = ! value; + falseRadioButton.Enabled = ! value; + } + } + + public ResourceItem ResourceItem + { + get { + return resourceItem; + } + set { + this.resourceItem = value; + if((bool)resourceItem.ResourceValue == true) { + trueRadioButton.Checked = true; + } else { + falseRadioButton.Checked = true; + } + } + } + + protected void OnResourceChanged(string resourceName, object val) + { + if(ResourceChanged != null) { + ResourceChanged(this, new ResourceEventArgs(resourceName, val)); + } + } + + void valueChanged(object sender, EventArgs e) + { + OnResourceChanged(resourceItem.Name, trueRadioButton.Checked); + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/CursorView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/CursorView.cs new file mode 100644 index 0000000000..d5a1e71e86 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/CursorView.cs @@ -0,0 +1,58 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + /// + /// This control is used for displaying images. Large images + /// can be scrolled. + /// + class CursorView : AbstractImageView + { + ResourceItem resourceItem; + + public CursorView(ResourceItem item) : base(item) + { + } + + public override bool WriteProtected + { + get { + return true; + } + set { + } + } + + public override ResourceItem ResourceItem + { + get { + return resourceItem; + } + set { + resourceItem = value; + + Cursor c = (Cursor)resourceItem.ResourceValue; + Bitmap a = new Bitmap(c.Size.Width, c.Size.Height); + Graphics g = Graphics.FromImage(a); + g.FillRectangle(new SolidBrush(Color.DarkCyan), 0, 0, a.Width, a.Height); + c.Draw(g, new Rectangle(0, 0, a.Width, a.Height)); + pictureBox.Image = a; + g.Dispose(); + adjustMargin(); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/IResourceView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/IResourceView.cs new file mode 100644 index 0000000000..473097f94f --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/IResourceView.cs @@ -0,0 +1,58 @@ +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; + +namespace ResourceEditor +{ + delegate void ResourceChangedEventHandler(object sender, ResourceEventArgs e); + + interface IResourceView : IDisposable + { + bool WriteProtected + { + get; + set; + } + + ResourceItem ResourceItem + { + get; + set; + } + + event ResourceChangedEventHandler ResourceChanged; + } + + class ResourceEventArgs + { + string resourceName; + object resourceValue; + + public ResourceEventArgs(string resourceName, object resourceValue) + { + this.resourceName = resourceName; + this.resourceValue = resourceValue; + } + + public string ResourceName + { + get { + return resourceName; + } + set { + resourceName = value; + } + } + + public object ResourceValue + { + get { + return resourceValue; + } + set { + resourceValue = value; + } + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/IconView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/IconView.cs new file mode 100644 index 0000000000..59f40744b4 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/IconView.cs @@ -0,0 +1,52 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + /// + /// This control is used for displaying images. Large images + /// can be scrolled. + /// + class IconView : AbstractImageView + { + ResourceItem resourceItem; + + public IconView(ResourceItem item) : base(item) + { + } + + public override bool WriteProtected + { + get { + return true; + } + set { + } + } + + public override ResourceItem ResourceItem + { + get { + return resourceItem; + } + set { + resourceItem = value; + pictureBox.Image = ((Icon)value.ResourceValue).ToBitmap(); + adjustMargin(); + } + } + } +} + diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs new file mode 100644 index 0000000000..0890008b3a --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs @@ -0,0 +1,142 @@ +using System; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + public class ResourceEditorControl : UserControl, IOwnerState + { + ResourceList resourceList; + Splitter splitter; + Panel panel; + IResourceView currentView = null; + + [Flags] + public enum ListViewViewState { + Nothing = 0, + ItemsSelected = 1, + } + + protected ListViewViewState internalState = ListViewViewState.Nothing; + + public System.Enum InternalState { + get { + return internalState; + } + } + + public ResourceList ResourceList + { + get { + return resourceList; + } + } + + public ResourceEditorControl() + { + InitializeComponent(); + resourceList.SelectedIndexChanged += new EventHandler(resourceListSelectionChanged); + } + + void resourceListSelectionChanged(object sender, EventArgs e) + { + if(resourceList.SelectedItems.Count == 0) { + internalState = ListViewViewState.Nothing; + showResource(null); + } else { + internalState = ListViewViewState.ItemsSelected; + } + + if(resourceList.SelectedItems.Count != 1) { + return; + } + object key = resourceList.SelectedItems[0].Text; + ResourceItem item = (ResourceItem)resourceList.Resources[key.ToString()]; + showResource(item); + } + + void InitializeComponent() + { + resourceList = new ResourceList(this); + resourceList.Dock = DockStyle.Top; + Controls.Add(resourceList); + + panel = new Panel(); + panel.BackColor = SystemColors.Info; + panel.Dock = DockStyle.Fill; + + splitter = new Splitter(); + splitter.Dock = DockStyle.Top; + + Controls.Add(panel); + Controls.Add(splitter); + Controls.Add(resourceList); + + this.Resize += new EventHandler(initializeLayout); + } + + void initializeLayout(object sender, EventArgs e) + { + resourceList.Height = Convert.ToInt32(0.75 * Height); + } + + void showView(Control viewer) + { + // remvoe old view if there is one + if(panel.Controls.Count == 1) { + Control control = panel.Controls[0]; + panel.Controls.Remove(control); + control.Dispose(); + } + + if(viewer != null) { + viewer.Dock = DockStyle.Fill; + panel.Controls.Add(viewer); + currentView = (IResourceView)viewer; + currentView.WriteProtected = resourceList.WriteProtected; + currentView.ResourceChanged += new ResourceChangedEventHandler(viewResourceChanged); + } + } + + void viewResourceChanged(object sender, ResourceEventArgs e) + { + resourceList.SetResourceValue(e.ResourceName, e.ResourceValue); + + + + } + + void showResource(ResourceItem item) + { + if(item == null) { + showView(null); + return; + } + if (item.ResourceValue is Icon) { + IconView iv = new IconView(item); + showView(iv); + } else if(item.ResourceValue is Bitmap) { + BitmapView bv = new BitmapView(item); + showView(bv); + } else if(item.ResourceValue is Cursor) { + CursorView cv = new CursorView(item); + showView(cv); + } else if(item.ResourceValue is string) { + TextView tv = new TextView(item); + showView(tv); + } else if(item.ResourceValue is byte[]) { + BinaryView bv = new BinaryView(item); + showView(bv); + } else if(item.ResourceValue is bool) { + BooleanView bv = new BooleanView(item); + showView(bv); + } else { + showView(null); + } + } + + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceItem.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceItem.cs new file mode 100644 index 0000000000..912a5b2e11 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceItem.cs @@ -0,0 +1,93 @@ +using System; +using System.Drawing; +using System.Resources; +using System.Windows.Forms; + +namespace ResourceEditor +{ + public class ResourceItem + { + string name; + object resourceValue; + + public ResourceItem(string name, object resourceValue) + { + this.name = name; + this.resourceValue = resourceValue; + } + + public string Name + { + get { + return name; + } + set { + name = value; + } + } + + public object ResourceValue + { + get { + return resourceValue; + } + set { + resourceValue = value; + } + } + + public int ImageIndex + { + get { + switch(this.resourceValue.GetType().ToString()) { + case "System.String": + return 0; + case "System.Drawing.Bitmap": + return 1; + case "System.Drawing.Icon": + return 2; + case "System.Windows.Forms.Cursor": + return 3; + case "System.Byte[]": + return 4; + default: + return 5; + } + } + } + + public override string ToString() + { + string type = ResourceValue.GetType().FullName; + string tmp = String.Empty; + + switch (type) { + case "System.String": + tmp = ResourceValue.ToString(); + break; + case "System.Byte[]": + tmp = "[Size = " + ((byte[])ResourceValue).Length + "]"; + break; + case "System.Drawing.Bitmap": + Bitmap bmp = ResourceValue as Bitmap; + tmp = "[Width = " + bmp.Size.Width + ", Height = " + bmp.Size.Height + "]"; + break; + case "System.Drawing.Icon": + Icon icon = ResourceValue as Icon; + tmp = "[Width = " + icon.Size.Width + ", Height = " + icon.Size.Height + "]"; + break; + case "System.Windows.Forms.Cursor": + Cursor c = ResourceValue as Cursor; + tmp = "[Width = " + c.Size.Width + ", Height = " + c.Size.Height + "]"; + break; + case "System.Boolean": + tmp = ResourceValue.ToString(); + break; + default: + tmp = ResourceValue.ToString(); + break; + } + return tmp; + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceItemHashtable.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceItemHashtable.cs new file mode 100644 index 0000000000..4596397430 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceItemHashtable.cs @@ -0,0 +1,321 @@ +using System; +using System.Collections; + +namespace ResourceEditor +{ + public class ResourceItemHashtable : IDictionary, ICollection, IEnumerable, ICloneable + { + protected Hashtable innerHash; + + #region "Constructors" + public ResourceItemHashtable() + { + innerHash = new Hashtable(); + } + + public ResourceItemHashtable(ResourceItemHashtable original) + { + innerHash = new Hashtable (original.innerHash); + } + + public ResourceItemHashtable(IDictionary dictionary) + { + innerHash = new Hashtable (dictionary); + } + + public ResourceItemHashtable(int capacity) + { + innerHash = new Hashtable(capacity); + } + + public ResourceItemHashtable(IDictionary dictionary, float loadFactor) + { + innerHash = new Hashtable(dictionary, loadFactor); + } + + public ResourceItemHashtable(IHashCodeProvider codeProvider, IComparer comparer) + { + innerHash = new Hashtable (codeProvider, comparer); + } + + public ResourceItemHashtable(int capacity, int loadFactor) + { + innerHash = new Hashtable(capacity, loadFactor); + } + + public ResourceItemHashtable(IDictionary dictionary, IHashCodeProvider codeProvider, IComparer comparer) + { + innerHash = new Hashtable (dictionary, codeProvider, comparer); + } + + public ResourceItemHashtable(int capacity, IHashCodeProvider codeProvider, IComparer comparer) + { + innerHash = new Hashtable (capacity, codeProvider, comparer); + } + + public ResourceItemHashtable(IDictionary dictionary, float loadFactor, IHashCodeProvider codeProvider, IComparer comparer) + { + innerHash = new Hashtable (dictionary, loadFactor, codeProvider, comparer); + } + + public ResourceItemHashtable(int capacity, float loadFactor, IHashCodeProvider codeProvider, IComparer comparer) + { + innerHash = new Hashtable (capacity, loadFactor, codeProvider, comparer); + } + #endregion + + #region Implementation of IDictionary + public ResourceItemHashtableEnumerator GetEnumerator() + { + return new ResourceItemHashtableEnumerator(this); + } + + System.Collections.IDictionaryEnumerator IDictionary.GetEnumerator() + { + return new ResourceItemHashtableEnumerator(this); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Remove(string key) + { + innerHash.Remove (key); + } + + void IDictionary.Remove(object key) + { + Remove ((string)key); + } + + public bool Contains(string key) + { + return innerHash.Contains(key); + } + + bool IDictionary.Contains(object key) + { + return Contains((string)key); + } + + public void Clear() + { + innerHash.Clear(); + } + + public void Add(string key, ResourceItem value) + { + innerHash.Add (key, value); + } + + void IDictionary.Add(object key, object value) + { + Add ((string)key, (ResourceItem)value); + } + + public bool IsReadOnly + { + get + { + return innerHash.IsReadOnly; + } + } + + public ResourceItem this[string key] + { + get + { + return (ResourceItem) innerHash[key]; + } + set + { + innerHash[key] = value; + } + } + + object IDictionary.this[object key] + { + get + { + return this[(string)key]; + } + set + { + this[(string)key] = (ResourceItem)value; + } + } + + public System.Collections.ICollection Values + { + get + { + return innerHash.Values; + } + } + + public System.Collections.ICollection Keys + { + get + { + return innerHash.Keys; + } + } + + public bool IsFixedSize + { + get + { + return innerHash.IsFixedSize; + } + } + #endregion + + #region Implementation of ICollection + public void CopyTo(System.Array array, int index) + { + innerHash.CopyTo (array, index); + } + + public bool IsSynchronized + { + get + { + return innerHash.IsSynchronized; + } + } + + public int Count + { + get + { + return innerHash.Count; + } + } + + public object SyncRoot + { + get + { + return innerHash.SyncRoot; + } + } + #endregion + + #region Implementation of ICloneable + public ResourceItemHashtable Clone() + { + ResourceItemHashtable clone = new ResourceItemHashtable(); + clone.innerHash = (Hashtable) innerHash.Clone(); + + return clone; + } + + object ICloneable.Clone() + { + return Clone(); + } + #endregion + + #region "HashTable Methods" + public bool ContainsKey (string key) + { + return innerHash.ContainsKey(key); + } + + public bool ContainsValue (ResourceItem value) + { + return innerHash.ContainsValue(value); + } + + public static ResourceItemHashtable Synchronized(ResourceItemHashtable nonSync) + { + ResourceItemHashtable sync = new ResourceItemHashtable(); + sync.innerHash = Hashtable.Synchronized(nonSync.innerHash); + + return sync; + } + #endregion + + internal Hashtable InnerHash + { + get + { + return innerHash; + } + } + } + + public class ResourceItemHashtableEnumerator : IDictionaryEnumerator + { + private IDictionaryEnumerator innerEnumerator; + + internal ResourceItemHashtableEnumerator (ResourceItemHashtable enumerable) + { + innerEnumerator = enumerable.InnerHash.GetEnumerator(); + } + + #region Implementation of IDictionaryEnumerator + public string Key + { + get + { + return (string)innerEnumerator.Key; + } + } + + object IDictionaryEnumerator.Key + { + get + { + return Key; + } + } + + public ResourceItem Value + { + get + { + return (ResourceItem)innerEnumerator.Value; + } + } + + object IDictionaryEnumerator.Value + { + get + { + return Value; + } + } + + public System.Collections.DictionaryEntry Entry + { + get + { + return innerEnumerator.Entry; + } + } + #endregion + + #region Implementation of IEnumerator + public void Reset() + { + innerEnumerator.Reset(); + } + + public bool MoveNext() + { + return innerEnumerator.MoveNext(); + } + + public object Current + { + get + { + return innerEnumerator.Current; + } + } + #endregion + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs new file mode 100644 index 0000000000..e06862a401 --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs @@ -0,0 +1,245 @@ +// +// +// +// +// +// + +using System; +using System.IO; +using System.ComponentModel; +using System.Windows.Forms; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Collections; +using System.Resources; +using System.Runtime.Serialization.Formatters.Binary; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Internal.Undo; +using System.Drawing.Printing; + +namespace ResourceEditor +{ + /// + /// This class allows viewing and editing of windows resource files + /// both in XML as in normal format. + /// + public class ResourceList : ListView + { + ColumnHeader name = new ColumnHeader(); + ColumnHeader type = new ColumnHeader(); + ColumnHeader content = new ColumnHeader(); + + ResourceItemHashtable resources = new ResourceItemHashtable(); + ImageList images = new ImageList(); + + UndoStack undoStack = null; + bool writeProtected = false; + + public event EventHandler Changed; + + public bool WriteProtected + { + get { + return writeProtected; + } + set { + writeProtected = value; + } + } + + public ResourceItemHashtable Resources + { + get { + return resources; + } + } + + public UndoStack UndoStack + { + get { + return undoStack; + } + } + + public PrintDocument PrintDocument + { + get { + return null; + } + } + + public ResourceList(ResourceEditorControl editor) + { + undoStack = new UndoStack(); + + + + name.Text = ResourceService.GetString("ResourceEditor.ResourceEdit.NameColumn"); + name.Width = 250; + + type.Text = ResourceService.GetString("ResourceEditor.ResourceEdit.TypeColumn"); + type.Width = 170; + + content.Text = ResourceService.GetString("ResourceEditor.ResourceEdit.ContentColumn"); + content.Width = 300; + + Columns.AddRange(new ColumnHeader[] {name, type, content}); + + FullRowSelect = true; + AutoArrange = true; + Alignment = ListViewAlignment.Left; + View = View.Details; + GridLines = true; + LabelEdit = true; + Sorting = SortOrder.Ascending; + Dock = DockStyle.Fill; + HideSelection = false; + + BorderStyle = System.Windows.Forms.BorderStyle.None; + + images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.string")); + images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.bmp")); + images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.icon")); + images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.cursor")); + images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.bin")); + images.Images.Add(ResourceService.GetIcon("Icons.16x16.ResourceEditor.obj")); + SmallImageList = images; + + AfterLabelEdit += new LabelEditEventHandler(afterLabelEdit); + + + ContextMenuStrip = MenuService.CreateContextMenu(editor, "/SharpDevelop/ResourceEdtior/ResourceList/ContextMenu"); + } + + public void LoadFile(string filename) + { + Stream s = File.OpenRead(filename); + switch (Path.GetExtension(filename).ToLower()) { + case ".resx": + ResXResourceReader rx = new ResXResourceReader(s); + IDictionaryEnumerator n = rx.GetEnumerator(); + while (n.MoveNext()) + if (!resources.ContainsKey(n.Key.ToString())) + resources.Add(n.Key.ToString(), new ResourceItem(n.Key.ToString(), n.Value)); + + rx.Close(); + break; + case ".resources": + //// new file will fail here - so we have to ignore exception(s) + ResourceReader rr=null; + try { + rr = new ResourceReader(s); + foreach (DictionaryEntry entry in rr) { + if (!resources.ContainsKey(entry.Key.ToString())) + resources.Add(entry.Key.ToString(), new ResourceItem(entry.Key.ToString(), entry.Value)); + } + } + catch {} + finally { + if (rr != null) { + rr.Close(); + } + } + break; + } + s.Close(); + InitializeListView(); + } + + public void SaveFile(string filename) + { + Debug.Assert(!writeProtected, "ICSharpCode.SharpDevelop.Gui.Edit.Resource.ResourceEdit.SaveFile(string filename) : trying to save a write protected file"); + switch (Path.GetExtension(filename).ToUpper()) { + + // write XML resource + case ".RESX": + ResXResourceWriter rxw = new ResXResourceWriter(filename); + foreach (DictionaryEntry entry in resources) { + if (entry.Value != null) { + ResourceItem item = (ResourceItem)entry.Value; + rxw.AddResource(item.Name, item.ResourceValue); + } + } + rxw.Generate(); + rxw.Close(); + break; + + // write default resource + default: + ResourceWriter rw = new ResourceWriter(filename); + foreach (DictionaryEntry entry in resources) { + ResourceItem item = (ResourceItem)entry.Value; + rw.AddResource(item.Name, item.ResourceValue); + } + rw.Generate(); + rw.Close(); + break; + } + } + + public void SetResourceValue(string resourceName, object resourceValue) + { + ResourceItem item = ((ResourceItem)Resources[resourceName]); + item.ResourceValue = resourceValue; + SelectedItems[0].SubItems[2].Text = item.ToString(); + OnChanged(); + } + + public void OnChanged() + { + if (Changed != null) { + Changed(this, null); + } + } + + void afterLabelEdit(object sender, LabelEditEventArgs e) + { + if (writeProtected) { + e.CancelEdit = true; + return; + } + string oldName = this.Items[e.Item].Text; + string newName = e.Label; + + if(newName == null) { + // no change + return; + } + + ResourceItem item = (ResourceItem)resources[oldName]; + + if(resources.ContainsKey(newName)) { + + MessageService.ShowWarning("${res:ResourceEditor.ResourceList.KeyAlreadyDefinedWarning}"); + e.CancelEdit = true; + return; + } + + resources.Remove(oldName); + item.Name = newName; + resources.Add(newName, item); + OnChanged(); + } + + public void InitializeListView() + { + BeginUpdate(); + Items.Clear(); + + foreach (DictionaryEntry entry in resources) { + ResourceItem item = (ResourceItem)entry.Value; + + string tmp = item.ToString(); + string type = item.ResourceValue.GetType().FullName; + + ListViewItem lv = new ListViewItem(new String[] {item.Name, type, tmp}, item.ImageIndex); + Items.Add(lv); + } + EndUpdate(); + } + } +} diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/TextView.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/TextView.cs new file mode 100644 index 0000000000..074ffe901e --- /dev/null +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/TextView.cs @@ -0,0 +1,56 @@ +using System; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ResourceEditor +{ + class TextView : TextBox, IResourceView + { + public event ResourceChangedEventHandler ResourceChanged; + private ResourceItem resourceItem; + + public TextView(ResourceItem item) + { + this.Multiline = true; + this.ResourceItem = item; + this.ScrollBars = ScrollBars.Both; + this.TextChanged += new EventHandler(textChanged); + } + + public bool WriteProtected + { + get { + return ! Enabled; + } + set { + Enabled = ! value; + } + } + + public ResourceItem ResourceItem + { + get { + return resourceItem; + } + set { + resourceItem = value; + Text = (string)value.ResourceValue; + } + } + + protected void OnResourceChanged(string resourceName, object val) + { + if(ResourceChanged != null) { + ResourceChanged(this, new ResourceEventArgs(resourceName, val)); + } + } + + void textChanged(object sender, EventArgs e) + { + OnResourceChanged(resourceItem.Name, Text); + } + } +} diff --git a/src/AddIns/Misc/AddinScout/AddinScout.sln b/src/AddIns/Misc/AddinScout/AddinScout.sln new file mode 100644 index 0000000000..8f87029910 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/AddinScout.sln @@ -0,0 +1,6 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# SharpDevelop 2.0.0.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "src\AddinScout.csproj", "{4b8f0f98-8be1-402b-aa8b-c8d548577b38}" +EndProject +Global +EndGlobal diff --git a/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj b/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj new file mode 100644 index 0000000000..b1a9013533 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj @@ -0,0 +1,90 @@ + + + Debug + AnyCPU + 8.0.40607 + 2.0 + {4b8f0f98-8be1-402b-aa8b-c8d548577b38} + NewProject + AddinScout + Library + + + 4 + + + + + False + False + OnSuccessfulBuild + + + + + + + True + True + False + True + + + ..\..\..\..\..\AddIns\AddIns\Misc\AddinScout\ + False + + + True + True + False + True + + + ..\..\..\AddIns\Misc\AddinScout\ + False + + + + + + + + + + + + + + ..\..\..\..\..\bin\SharpDevelop.Base.dll + False + + + ..\..\..\..\..\bin\ICSharpCode.Core.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj.user b/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj.user new file mode 100644 index 0000000000..e956ed7735 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/AddinScout.csproj.user @@ -0,0 +1,13 @@ + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/AddinScout/Project/Resources/AddInScout.addin b/src/AddIns/Misc/AddinScout/Project/Resources/AddInScout.addin new file mode 100644 index 0000000000..e09fe62aa1 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Resources/AddInScout.addin @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/src/AddIns/Misc/AddinScout/Project/Src/AddInScoutCommand.cs b/src/AddIns/Misc/AddinScout/Project/Src/AddInScoutCommand.cs new file mode 100644 index 0000000000..d431e4e06b --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/AddInScoutCommand.cs @@ -0,0 +1,15 @@ +using System; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace AddInScout +{ + public class AddInScoutCommand : AbstractMenuCommand + { + public override void Run() + { + AddInScoutViewContent vw = new AddInScoutViewContent(); + WorkbenchSingleton.Workbench.ShowView(vw); + } + } +} diff --git a/src/AddIns/Misc/AddinScout/Project/Src/AddInScoutViewContent.cs b/src/AddIns/Misc/AddinScout/Project/Src/AddInScoutViewContent.cs new file mode 100644 index 0000000000..7f9407f07d --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/AddInScoutViewContent.cs @@ -0,0 +1,131 @@ +using System; +using System.IO; +using System.Collections; +using System.Windows.Forms; +using System.Drawing; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + + +namespace AddInScout +{ + public class AddInScoutViewContent : AbstractViewContent + { + Control control = null; + + public override Control Control { + get { + return control; + } + } + + public override bool IsViewOnly { + get { + return true; + } + } + + public override void Dispose() + { + control.Dispose(); + } + + public override void Load(string filename) + { + } + + AddInDetailsPanel addInDetailsPanel = new AddInDetailsPanel(); + CodonListPanel codonListPanel = new CodonListPanel(); + + public AddInScoutViewContent() : base("AddIn Scout") + { + Panel p = new Panel(); + p.Dock = DockStyle.Fill; + p.BorderStyle = BorderStyle.FixedSingle; + + Panel RightPanel = new Panel(); + RightPanel.Dock = DockStyle.Fill; + p.Controls.Add(RightPanel); + + codonListPanel.Dock = DockStyle.Fill; + codonListPanel.CurrentAddinChanged += new EventHandler(CodonListPanelCurrentAddinChanged); + RightPanel.Controls.Add(codonListPanel); + + Splitter hs = new Splitter(); + hs.Dock = DockStyle.Top; + RightPanel.Controls.Add(hs); + + addInDetailsPanel.Dock = DockStyle.Top; + addInDetailsPanel.Height = 175; + RightPanel.Controls.Add(addInDetailsPanel); + + Splitter s1 = new Splitter(); + s1.Dock = DockStyle.Left; + p.Controls.Add(s1); + + AddinTreeView addinTreeView = new AddinTreeView(); + addinTreeView.Dock = DockStyle.Fill; + addinTreeView.treeView.AfterSelect += new TreeViewEventHandler(this.tvSelectHandler); + + TreeTreeView treeTreeView = new TreeTreeView(); + treeTreeView.Dock = DockStyle.Fill; + treeTreeView.treeView.AfterSelect += new TreeViewEventHandler(this.tvSelectHandler); + + TabControl tab = new TabControl(); + tab.Width = 300; + tab.Dock = DockStyle.Left; + + TabPage tabPage2 = new TabPage("Tree"); + tabPage2.Dock = DockStyle.Left; + tabPage2.Controls.Add(treeTreeView); + tab.TabPages.Add(tabPage2); + + TabPage tabPage = new TabPage("AddIns"); + tabPage.Dock = DockStyle.Left; + tabPage.Controls.Add(addinTreeView); + tab.TabPages.Add(tabPage); + + p.Controls.Add(tab); + + this.control = p; + this.TitleName = "AddIn Scout"; + } + + void CodonListPanelCurrentAddinChanged(object sender, EventArgs e) + { + addInDetailsPanel.ShowAddInDetails(codonListPanel.CurrentAddIn); + } + + public void tvSelectHandler(object sender, TreeViewEventArgs e) + { + if (e.Node.Tag == null) { + codonListPanel.ClearList(); + return; + } + + TreeNode tn = e.Node; + + object o = e.Node.Tag; + + if (o is AddIn) { + AddIn addIn = (AddIn)o; + addInDetailsPanel.ShowAddInDetails(addIn); + if (tn.FirstNode != null) { + codonListPanel.ListCodons((ExtensionPath)tn.FirstNode.Tag); + } else { + codonListPanel.ClearList(); + } + } else { + ExtensionPath ext = (ExtensionPath)o; + AddIn addIn = tn.Parent.Tag as AddIn; + if (addIn == null) { + codonListPanel.ListCodons(ext.Name); + } else { + addInDetailsPanel.ShowAddInDetails(addIn); + codonListPanel.ListCodons(ext); + } + } + } + } +} diff --git a/src/AddIns/Misc/AddinScout/Project/Src/AssemblyInfo.cs b/src/AddIns/Misc/AddinScout/Project/Src/AssemblyInfo.cs new file mode 100644 index 0000000000..25b180ecdf --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("AddInScout")] +[assembly: AssemblyDescription("Display AddIn Information")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("Satguru P Srivastava")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/AddinScout/Project/Src/Gui/AddInDetailsPanel.cs b/src/AddIns/Misc/AddinScout/Project/Src/Gui/AddInDetailsPanel.cs new file mode 100644 index 0000000000..95d1ea73b9 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/Gui/AddInDetailsPanel.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.Core; + +namespace AddInScout +{ + public class AddInDetailsPanel : Panel + { + ListView addInDetailsListView = new ListView(); + Label addInLabel = new Label(); + + public AddInDetailsPanel() + { + addInDetailsListView.Dock = DockStyle.Fill; + addInDetailsListView.GridLines = false; + addInDetailsListView.View = View.Details; + addInDetailsListView.MultiSelect = false; + addInDetailsListView.FullRowSelect = true; + addInDetailsListView.Activation = ItemActivation.OneClick; + addInDetailsListView.HeaderStyle = ColumnHeaderStyle.None; + addInDetailsListView.BorderStyle = BorderStyle.FixedSingle; + addInDetailsListView.ItemActivate += new EventHandler(AddInDetailsListViewItemActivate); + addInDetailsListView.Columns.Add("Property",100, HorizontalAlignment.Left); + addInDetailsListView.Columns.Add("Value", 500, HorizontalAlignment.Left); + Controls.Add(addInDetailsListView); + + addInLabel.Dock =DockStyle.Top; + addInLabel.Text = "AddIn : "; + addInLabel.Font = new Font(addInLabel.Font.FontFamily,addInLabel.Font.Size*2); + addInLabel.Height = addInLabel.Height*2; + addInLabel.FlatStyle = FlatStyle.Flat; + addInLabel.TextAlign = ContentAlignment.MiddleLeft; + addInLabel.BorderStyle = BorderStyle.FixedSingle; + Controls.Add(addInLabel); + } + + void AddInDetailsListViewItemActivate(object sender, EventArgs e) + { + Cursor.Current = Cursors.WaitCursor; + + ListViewItem selectedItem = ((ListView)sender).SelectedItems[0]; + + if (selectedItem.Text.ToLower().Equals("url")) { + string url = selectedItem.SubItems[1].Text; + try { + System.Diagnostics.Process.Start(url); + } catch (Exception) { +// Silent: On my System the browser starts but Process.Start throws an exception. Mike 2.11.2004/Notebook/ICE 1517 on the way to DevCon Europe 2004 +// MessageBox.Show("Unable to Start Browser\n" + ex.ToString()); + } + } else if (selectedItem.Text.ToLower().Equals("filename")) { + + FileService.OpenFile(selectedItem.SubItems[1].Text); + } + + Cursor.Current = Cursors.Default; + } + + public void ShowAddInDetails(AddIn ai) + { + addInLabel.Text = "AddIn : " + ai.Properties["name"]; + + addInDetailsListView.Items.Clear(); + + ListViewItem[] items = new ListViewItem[] { + new ListViewItem(new string[] { "Author", ai.Properties["author"] }), + new ListViewItem(new string[] { "Copyright", ai.Properties["copyright"]}), + new ListViewItem(new string[] { "Description", ai.Properties["description"] }), + new ListViewItem(new string[] { "FileName", ai.FileName}), + new ListViewItem(new string[] { "Url", ai.Properties["url"]}), + new ListViewItem(new string[] { "Version", ai.Properties["version"]}) + }; + + // set Filename & Url rows to 'weblink' style + items[3].Font = items[4].Font = new Font(addInDetailsListView.Font, FontStyle.Underline); + items[3].ForeColor = items[4].ForeColor = Color.Blue; + addInDetailsListView.Items.AddRange(items); + + foreach (Runtime runtime in ai.Runtimes) { + ListViewItem newListViewItem = new ListViewItem("Runtime Library"); + newListViewItem.SubItems.Add(runtime.Assembly); + addInDetailsListView.Items.Add(newListViewItem); + } + } + } +} diff --git a/src/AddIns/Misc/AddinScout/Project/Src/Gui/AddinTreeView.cs b/src/AddIns/Misc/AddinScout/Project/Src/Gui/AddinTreeView.cs new file mode 100644 index 0000000000..48771b0eda --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/Gui/AddinTreeView.cs @@ -0,0 +1,73 @@ +/* + * Created by SharpDevelop. + * User: Omnibrain + * Date: 01.11.2004 + * Time: 12:03 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using ICSharpCode.Core; +using System.Windows.Forms; + +namespace AddInScout +{ + /// + /// Description of AddinTreeView. + /// + public class AddinTreeView : Panel + { + public TreeView treeView = new TreeView(); + + public AddinTreeView() + { +// treeView.BorderStyle = BorderStyle.; +// treeView.AfterSelect += new TreeViewEventHandler(this.tvSelectHandler); + + PopulateTreeView(); + + + treeView.ImageList = new ImageList(); + treeView.ImageList.ColorDepth = ColorDepth.Depth32Bit; + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.Class")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.Assembly")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.OpenAssembly")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.ClosedFolderBitmap")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.OpenFolderBitmap")); + + treeView.Dock = DockStyle.Fill; + Controls.Add(treeView); + } + + void PopulateTreeView() + { + TreeNode rootNode = new TreeNode("Addins"); + rootNode.ImageIndex = rootNode.SelectedImageIndex = 0; + rootNode.Expand(); + + treeView.Nodes.Add(rootNode); + + for (int i = 0; i < AddInTree.AddIns.Count; i++) { + TreeNode newNode = new TreeNode(AddInTree.AddIns[i].Properties["name"]); + newNode.ImageIndex = 1; + newNode.SelectedImageIndex = 2; + newNode.Tag = AddInTree.AddIns[i]; + GetExtensions(AddInTree.AddIns[i], newNode); + rootNode.Nodes.Add(newNode); + } + } + + void GetExtensions(AddIn ai, TreeNode treeNode) + { + foreach (ExtensionPath ext in ai.Paths.Values) { + TreeNode newNode = new TreeNode(ext.Name); + newNode.ImageIndex = 3; + newNode.SelectedImageIndex = 4; + newNode.Tag = ext; + treeNode.Nodes.Add(newNode); + } + } + + } +} diff --git a/src/AddIns/Misc/AddinScout/Project/Src/Gui/CodonListPanel.cs b/src/AddIns/Misc/AddinScout/Project/Src/Gui/CodonListPanel.cs new file mode 100644 index 0000000000..7ebc5305b4 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/Gui/CodonListPanel.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections; +using System.Drawing; +using System.Windows.Forms; + +using ICSharpCode.Core; + +namespace AddInScout +{ + public class CodonListPanel : Panel + { + ListView CodonLV = new ListView(); // show codin details + Label ExtLabel = new Label(); // show extension name + AddIn currentAddIn = null; + + public AddIn CurrentAddIn { + get { + return currentAddIn; + } + set { + currentAddIn = value; + this.OnCurrentAddinChanged(EventArgs.Empty); + } + } + + public CodonListPanel() + { + CodonLV.Dock = DockStyle.Fill; + CodonLV.GridLines = true; + CodonLV.View = View.Details; + CodonLV.FullRowSelect = true; + CodonLV.MultiSelect = false; + CodonLV.BorderStyle = BorderStyle.FixedSingle; + CodonLV.SelectedIndexChanged += new EventHandler(CodonLVSelectedIndexChanged); + CodonLV.Columns.Add("Codon", 100,HorizontalAlignment.Left); + CodonLV.Columns.Add("Codon ID", 175,HorizontalAlignment.Left); + CodonLV.Columns.Add("Codon Class", 400,HorizontalAlignment.Left); + CodonLV.Columns.Add("Codon Condition -> Action on Fail", 600,HorizontalAlignment.Left); + + + ExtLabel.Text = "Extension : "; + ExtLabel.Dock = DockStyle.Top; + ExtLabel.FlatStyle = FlatStyle.Flat; + ExtLabel.TextAlign = ContentAlignment.MiddleLeft; + ExtLabel.BorderStyle = BorderStyle.FixedSingle; + + Controls.Add(CodonLV); + Controls.Add(ExtLabel); + } + + + void CodonLVSelectedIndexChanged(object sender, EventArgs e) + { + if (CodonLV.SelectedItems.Count != 1) { + return; + } + Codon c = CodonLV.SelectedItems[0].Tag as Codon; + if (c == null) { + return; + } + + CurrentAddIn = c.AddIn; + } + + public void ClearList() + { + ExtLabel.Text = "Extension : "; + CodonLV.Items.Clear(); + } + + public void ListCodons(string path) + { + CodonLV.Items.Clear(); + if (path == null) { + ExtLabel.Text = "Extension : "; + return; + } + + ExtLabel.Text = "Extension : " + path; + + AddInTreeNode node = AddInTree.GetTreeNode(path); + foreach (Codon c in node.Codons) { + ListViewItem lvi = new ListViewItem(c.Name); + lvi.Tag = c; + lvi.SubItems.Add(c.ID); + + lvi.SubItems.Add(c.Properties.Contains("class") ? c.Properties["class"] : ""); + + foreach (ICondition condition in c.Conditions) { + lvi.SubItems.Add(condition.Name + ", " + condition.Action); + } + CodonLV.Items.Add(lvi); + } + } + + public void ListCodons(ExtensionPath ext) + { + CodonLV.Items.Clear(); + if (ext == null) { + ExtLabel.Text = "Extension : "; + return; + } + ListCodons(ext.Name); + } + + protected virtual void OnCurrentAddinChanged(EventArgs e) + { + if (CurrentAddinChanged != null) { + CurrentAddinChanged(this, e); + } + } + + public event EventHandler CurrentAddinChanged; + } +} + diff --git a/src/AddIns/Misc/AddinScout/Project/Src/Gui/TreeTreeView.cs b/src/AddIns/Misc/AddinScout/Project/Src/Gui/TreeTreeView.cs new file mode 100644 index 0000000000..941d98c5e8 --- /dev/null +++ b/src/AddIns/Misc/AddinScout/Project/Src/Gui/TreeTreeView.cs @@ -0,0 +1,75 @@ +using System; +using ICSharpCode.Core; +using System.Windows.Forms; + +namespace AddInScout +{ + /// + /// Description of AddinTreeView. + /// + public class TreeTreeView : Panel + { + public TreeView treeView = new TreeView(); + + public TreeTreeView() + { + PopulateTreeView(); + + + treeView.ImageList = new ImageList(); + treeView.ImageList.ColorDepth = ColorDepth.Depth32Bit; + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.Class")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.Assembly")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.OpenAssembly")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.ClosedFolderBitmap")); + treeView.ImageList.Images.Add(IconService.GetBitmap("Icons.16x16.OpenFolderBitmap")); + + treeView.Dock = DockStyle.Fill; + Controls.Add(treeView); + } + + void PopulateTreeView() + { + TreeNode rootNode = new TreeNode("AddInTree"); + rootNode.ImageIndex = rootNode.SelectedImageIndex = 0; + rootNode.Expand(); + + treeView.Nodes.Add(rootNode); + + for (int i = 0; i < AddInTree.AddIns.Count; i++) { + GetExtensions(AddInTree.AddIns[i], rootNode); + } + } + + void GetExtensions(AddIn ai, TreeNode treeNode) + { + foreach (ExtensionPath ext in ai.Paths.Values) { + string[] name = ext.Name.Split('/'); + TreeNode currentNode = treeNode; + if (name.Length < 1) { + continue; + } + for (int i = 1; i < name.Length; ++i) { + bool found = false; + foreach (TreeNode n in currentNode.Nodes) { + if (n.Text == name[i]) { + currentNode = n; + found = true; + break; + } + } + if (!found) { + TreeNode newNode = new TreeNode(name[i]); + newNode.ImageIndex = 3; + newNode.SelectedImageIndex = 4; + if (i == name.Length - 1) { + newNode.Tag = ext; + } + currentNode.Nodes.Add(newNode); + currentNode = newNode; + } + } + } + } + } +} diff --git a/src/AddIns/Misc/FiletypeRegisterer/Doc/Description.txt b/src/AddIns/Misc/FiletypeRegisterer/Doc/Description.txt new file mode 100644 index 0000000000..dbedf86ce8 --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Doc/Description.txt @@ -0,0 +1,22 @@ +This is my suggestion for the filetype associations in #d. + +The AddIn contains two classes: + - The RegisterFiletypesCommand, that is executed at startup and where the types are registered + - The RegisterFiletypesOptionPanel, that is shown in the IDE Options. + +In the Option panel, you can select the types you want #d to be associated with and whether #d should re-register the types at each startup. +The command, which is autoexecuted at startup, checks if this option is turned on and then performs the task, if necessary. +If this option is turned off, the only point where file types are registered is clicking OK in the option panel. + +The file types are listed in the Filetypes.xml file, which has to be located (as well as the icon files) in the subdir "filetypes" of "data\resources". +So types can be dynamically added or deleted. (In case this file is malformed, the addin will load an internal list that is currently the same as in the XML file.) + +I don't exactly know how to manage that the option panel pops up the first time #d is started (like the code completion database wizard), but I think that's not a point of extremely much work. + +-------------------------------- +New Info +-------------------------------- +- By default, cmbx and prjx are registered. +- The Addin now automatically unregisters filetypes when they are deselected in the option panel. +- An Unregister.exe is included that takes one parameter: the extension. +- When registering file types, old associations are preserved and restored when unregistering. \ No newline at end of file diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/FiletypeRegisterer/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..640595f2cb --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("FiletypeRegisterer")] +[assembly: AssemblyDescription("Registers file types for #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Georg Brandl")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(C) 2002")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin new file mode 100644 index 0000000000..d01d299c13 --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.addin @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj new file mode 100644 index 0000000000..c88c797cf5 --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj @@ -0,0 +1,75 @@ + + + Debug + AnyCPU + 8.0.41115 + 2.0 + {D022A6CE-7438-41E8-AC64-F2DE18EC54C6} + ICSharpCode.FiletypeRegisterer + Library + 4 + False + False + OnSuccessfulBuild + Library + + + True + False + False + True + ..\..\..\AddIns\Misc\FiletypeRegisterer\ + False + + + False + True + False + True + ..\..\..\AddIns\Misc\FiletypeRegisterer\ + False + + + + + + UserControl + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + False + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj.user b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj.user new file mode 100644 index 0000000000..746ae1f782 --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/FiletypeRegisterer.csproj.user @@ -0,0 +1,9 @@ + + + + + 8.0.41115 + ShowAllFiles + 0 + + \ No newline at end of file diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesCommand.cs b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesCommand.cs new file mode 100644 index 0000000000..55196f527b --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesCommand.cs @@ -0,0 +1,144 @@ +using System; +using System.IO; +using System.Drawing; +using System.Windows.Forms; +using System.Reflection; +using System.Xml; + +using Microsoft.Win32; + +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Gui; + + +namespace ICSharpCode.FiletypeRegisterer { + + public class RegisterFiletypesCommand : AbstractCommand + { + readonly public static string uiFiletypesProperty = "SharpDevelop.Filetypes"; + readonly public static string uiRegisterStartupProperty = "SharpDevelop.FiletypesRegisterStartup"; + + const int SHCNE_ASSOCCHANGED = 0x08000000; + const int SHCNF_IDLIST = 0x0; + + readonly public static string[,] FileTypes_err = new string[,] + {{"${res:ICSharpCode.FiletypeRegisterer.SharpDevelopCombineFileAssozisation}", "cmbx", "cmbx.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.SharpDevelopProjectFileAssozisation}", "prjx", "prjx.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.CSharpSourceFileAssozisation}" , "cs" , "cs.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.VBNetSourceFileAssozisation}" , "vb" , "vb.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.JavaSourceFileAssozisation}" , "java", "java.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.XMLFormFileAssozisation}" , "xfrm", "xfrm.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.ResXResourceFilesFileAssozisation}" , "resx", "resx.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.BinaryResourceFilesFileAssozisation}", "resources", "resx.ico"}, + {"${res:ICSharpCode.FiletypeRegisterer.XmlFileAssozisation}" , "xml", "xml.ico"}}; + + public static string[,] GetFileTypes() + { + try { + + XmlDocument doc = new XmlDocument(); + + doc.Load(System.IO.Path.Combine(PropertyService.DataDirectory, "resources") + + Path.DirectorySeparatorChar + "filetypes" + + Path.DirectorySeparatorChar + "Filetypes.xml"); + + XmlNodeList nodes = doc.DocumentElement.ChildNodes; + string[,] ret = new string[doc.DocumentElement.ChildNodes.Count, 3]; + + for(int i = 0; i < nodes.Count; ++i) { + XmlElement el = (XmlElement)nodes.Item(i); + ret[i, 0] = el.InnerText; + ret[i, 1] = el.Attributes["ext"].InnerText; + ret[i, 2] = el.Attributes["icon"].InnerText; + } + return ret; + } catch (Exception) { + return FileTypes_err; + } + } + + public override void Run() + { + + + if (PropertyService.Get(uiRegisterStartupProperty, true)) { + // register Combine and Project by default + RegisterFiletypes(PropertyService.Get(uiFiletypesProperty, "cmbx|prjx")); + } + } + + public static void RegisterFiletypes(string types) + { + string[] singleTypes = types.Split('|'); + string mainExe = Assembly.GetEntryAssembly().Location; + string[,] FileTypes = GetFileTypes(); + + string resPath = System.IO.Path.Combine(PropertyService.DataDirectory, "resources") + Path.DirectorySeparatorChar + "filetypes" + Path.DirectorySeparatorChar; + foreach(string type in singleTypes) { + for(int i = 0; i < FileTypes.GetLength(0); ++i) { + if(FileTypes[i, 1] == type) { + RegisterFiletype(type, FileTypes[i, 0], '"' + Path.GetFullPath(mainExe) + '"' + " \"%1\"", Path.GetFullPath(resPath + FileTypes[i, 2])); + } + } + } + } + + public static void RegisterFiletype(string extension, string description, string command, string icon) + { + try { + RegistryKey extKey, clsKey, openKey; + extKey = Registry.ClassesRoot.CreateSubKey("." + extension); + + // save previous association + string prev = (string)extKey.GetValue("", ""); + if (prev != "" && prev != ("SD." + extension + "file")) { + extKey.SetValue("PreSD", extKey.GetValue("")); + } + extKey.SetValue("", "SD." + extension + "file"); + extKey.Close(); + + clsKey = Registry.ClassesRoot.CreateSubKey("SD." + extension + "file"); + + + clsKey.SetValue("", StringParser.Parse(description)); + clsKey.CreateSubKey("DefaultIcon").SetValue("", '"' + icon + '"'); + openKey = clsKey.CreateSubKey("shell\\open\\command"); + openKey.SetValue("", command); + openKey.Close(); + clsKey.Close(); + + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); + } catch {} + + } + + public static void UnRegisterFiletype(string extension) + { + try { + Registry.ClassesRoot.DeleteSubKeyTree("SD." + extension + "file"); + + RegistryKey extKey; + extKey = Registry.ClassesRoot.OpenSubKey("." + extension, true); + + // if no association return + if (extKey == null) return; + // if other association return too + if ((string)extKey.GetValue("", "") != ("SD." + extension + "file")) return; + + // restore previous association + string prev = (string)extKey.GetValue("PreSD", ""); + if(prev != "") { + extKey.SetValue("", prev); + } + extKey.Close(); + + + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); + } catch {} + } + + [System.Runtime.InteropServices.DllImport("shell32.dll")] + static extern void SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2); + } +} diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.cs b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.cs new file mode 100644 index 0000000000..1a1173f13a --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/RegisterFiletypesPanel.cs @@ -0,0 +1,122 @@ +// created on 16.11.2002 at 21:14 + +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Collections; + +using ICSharpCode.SharpDevelop.Internal.ExternalTool; +using ICSharpCode.Core; +using ICSharpCode.FiletypeRegisterer; + +namespace ICSharpCode.SharpDevelop.Gui.OptionPanels +{ + class RegisterFiletypesPanel : AbstractOptionPanel { + + ListView list = new ListView(); + Label capLbl = new Label(); + CheckBox regChk = new CheckBox(); + + + + + + Hashtable wasChecked = new Hashtable(); + + public RegisterFiletypesPanel() + { + // Initialize dialog controls + InitializeComponent(); + + // Set previous values + SelectFiletypes(PropertyService.Get(RegisterFiletypesCommand.uiFiletypesProperty, "cmbx|prjx")); + regChk.Checked = PropertyService.Get(RegisterFiletypesCommand.uiRegisterStartupProperty, true); + } + + public override bool ReceiveDialogMessage(DialogMessage message) + { + if (message == DialogMessage.OK) { + UnRegisterFiletypes(); + RegisterFiletypesCommand.RegisterFiletypes(SelectedFiletypes); + PropertyService.Set(RegisterFiletypesCommand.uiFiletypesProperty, SelectedFiletypes); + PropertyService.Set(RegisterFiletypesCommand.uiRegisterStartupProperty, regChk.Checked); + } + return true; + } + + string SelectedFiletypes + { + get { + try { + string ret = ""; + + foreach(ListViewItem lv in list.Items) { + if(lv.Checked) ret += (string)lv.Tag + "|"; + } + return ret; + } catch { + return ""; + } + } + } + + void UnRegisterFiletypes() + { + foreach(ListViewItem lv in list.Items) { + if((!lv.Checked) && wasChecked.Contains((string)lv.Tag)) { + RegisterFiletypesCommand.UnRegisterFiletype((string)lv.Tag); + } + } + } + + void SelectFiletypes(string types) { + string[] singleTypes = types.Split('|'); + + foreach(string str in singleTypes) { + wasChecked[str] = true; + foreach(ListViewItem lv in list.Items) { + if(str == (string)lv.Tag) { + lv.Checked = true; + } + } + } + } + + void InitializeComponent() + { + capLbl.Location = new Point(8, 8); + capLbl.Size = new Size(136, 16); + capLbl.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + capLbl.Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.RegisterFiletypesPanel.CaptionLabel}"); + capLbl.FlatStyle = FlatStyle.System; + + list.Location = new Point(8, 30); + list.Size = new Size(136, 250); + list.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + list.View = View.List; + list.CheckBoxes = true; + + FillList(list); + + regChk.Location = new Point(8, 300); + regChk.Size = new Size(136, 20); + regChk.Anchor = capLbl.Anchor; + regChk.FlatStyle = FlatStyle.System; + regChk.Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.Dialogs.OptionPanels.RegisterFiletypesPanel.RegisterCheckBox}"); + + this.Controls.AddRange(new Control[] {capLbl, list, regChk}); + } + + void FillList(ListView list) + { + string[,] Items = RegisterFiletypesCommand.GetFileTypes(); + + for(int i = 0; i < Items.GetLength(0); ++i) { + ListViewItem lv; + lv = new ListViewItem(StringParser.Parse(Items[i, 0]) + " (." + Items[i, 1] + ")"); + lv.Tag = Items[i, 1]; + list.Items.Add(lv); + } + } + } +} diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/Filetypes.xml b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/Filetypes.xml new file mode 100644 index 0000000000..6f6f6464ce --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/Filetypes.xml @@ -0,0 +1,12 @@ + + + SharpDevelop Combine + SharpDevelop Project + C# Source File + VB.NET Source File + Java Source File + SharpDevelop XML Form + .NET Resource File + .NET Resource File (Binary) + XML Document + \ No newline at end of file diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/cmbx.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/cmbx.ico new file mode 100644 index 0000000000..1b5063739f Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/cmbx.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/cs.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/cs.ico new file mode 100644 index 0000000000..2389e7bd2f Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/cs.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/java.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/java.ico new file mode 100644 index 0000000000..3873181b3c Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/java.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/prjx.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/prjx.ico new file mode 100644 index 0000000000..7b3b17293f Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/prjx.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/resx.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/resx.ico new file mode 100644 index 0000000000..1bc198b033 Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/resx.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/vb.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/vb.ico new file mode 100644 index 0000000000..b95d71ebc2 Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/vb.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/xfrm.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/xfrm.ico new file mode 100644 index 0000000000..340f9f7a7d Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/xfrm.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/xml.ico b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/xml.ico new file mode 100644 index 0000000000..e5d84f07d1 Binary files /dev/null and b/src/AddIns/Misc/FiletypeRegisterer/Project/Src/filetypes/xml.ico differ diff --git a/src/AddIns/Misc/FiletypeRegisterer/Project/Unregister/Main.cs b/src/AddIns/Misc/FiletypeRegisterer/Project/Unregister/Main.cs new file mode 100644 index 0000000000..8e860030a2 --- /dev/null +++ b/src/AddIns/Misc/FiletypeRegisterer/Project/Unregister/Main.cs @@ -0,0 +1,61 @@ +/* +using Microsoft.Win32; +using System; + +namespace ICSharpCode.FiletypeRegisterer.Unregister +{ + + public class MainClass + { + const int SHCNE_ASSOCCHANGED = 0x08000000; + const int SHCNF_IDLIST = 0x0; + + public static void UnRegisterFiletype(string extension) { + try { + Registry.ClassesRoot.DeleteSubKeyTree("SD." + extension + "file"); + + RegistryKey extKey; + extKey = Registry.ClassesRoot.OpenSubKey("." + extension, true); + + // if no association return + if (extKey == null) return; + // if other association return too + if ((string)extKey.GetValue("", "") != ("SD." + extension + "file")) return; + + // restore previous association + string prev = (string)extKey.GetValue("PreSD", ""); + if(prev != "") { + extKey.SetValue("", prev); + } + extKey.Close(); + + + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); + } catch {} + + } + + [System.Runtime.InteropServices.DllImport("shell32.dll")] + static extern void SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2); + + public static void Main() { + Console.WriteLine("--------------------------------"); + Console.WriteLine(" Filetype Unregister"); + Console.WriteLine("--------------------------------"); + + string[] args = Environment.GetCommandLineArgs(); + if (args.Length != 2) { + Console.WriteLine("\nUsage: Unregister.exe ext"); + Console.WriteLine(" where ext is the extension, e.g. cs"); + return; + } + + System.Console.WriteLine("Unregistering " + args[1] + "..."); + UnRegisterFiletype(args[1]); + Console.WriteLine("\nSuccessful."); + return; + } + + } +} +*/ diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/HighlightingEditor/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..0ebec27439 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("HighlightingEditor")] +[assembly: AssemblyDescription("Editor for editor highlighting styles in #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Georg Brandl")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(C) 2003")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin new file mode 100644 index 0000000000..5e1d4d5059 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.addin @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj new file mode 100644 index 0000000000..ddc78e514f --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj @@ -0,0 +1,132 @@ + + + Debug + AnyCPU + 8.0.41115 + 2.0 + {8A462940-E5E9-4E85-982D-D4C006EE31D4} + HighlightingEditor + Library + 0 + False + False + OnSuccessfulBuild + Library + + + True + False + False + True + ..\..\..\..\..\AddIns\AddIns\Misc\HighlightingEditor\ + False + + + False + True + False + True + ..\..\..\..\..\AddIns\AddIns\Misc\HighlightingEditor\ + False + + + + + + + + + + + + + + + + + + + + + Form + + + Form + + + Form + + + UserControl + + + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + UserControl + + + + + {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} + ICSharpCode.TextEditor + False + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + False + + + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} + ICSharpCode.Core + + + + + True + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj.user b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj.user new file mode 100644 index 0000000000..96135953c3 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/HighlightingEditor.csproj.user @@ -0,0 +1,13 @@ + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + 8.0.41115 + ShowAllFiles + 0 + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/ColorDialog.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/ColorDialog.xfrm new file mode 100644 index 0000000000..e21d4ddc7e --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/ColorDialog.xfrm @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Digits.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Digits.xfrm new file mode 100644 index 0000000000..9c06aaa104 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Digits.xfrm @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/EditDialog.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/EditDialog.xfrm new file mode 100644 index 0000000000..59ef7c241e --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/EditDialog.xfrm @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Environment.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Environment.xfrm new file mode 100644 index 0000000000..02ba2eee10 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Environment.xfrm @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/KeywordList.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/KeywordList.xfrm new file mode 100644 index 0000000000..ea305e452d --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/KeywordList.xfrm @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/KeywordLists.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/KeywordLists.xfrm new file mode 100644 index 0000000000..e6ace9000d --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/KeywordLists.xfrm @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Marker.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Marker.xfrm new file mode 100644 index 0000000000..2838e4376d --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Marker.xfrm @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Markers.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Markers.xfrm new file mode 100644 index 0000000000..ff5671fd5e --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Markers.xfrm @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/OptionPanel.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/OptionPanel.xfrm new file mode 100644 index 0000000000..ca84624e7f --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/OptionPanel.xfrm @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Properties.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Properties.xfrm new file mode 100644 index 0000000000..d71832c56e --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Properties.xfrm @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/RuleSet.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/RuleSet.xfrm new file mode 100644 index 0000000000..967df0787f --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/RuleSet.xfrm @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/RuleSets.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/RuleSets.xfrm new file mode 100644 index 0000000000..4a0a706324 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/RuleSets.xfrm @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Scheme.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Scheme.xfrm new file mode 100644 index 0000000000..17edac8a9d --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Scheme.xfrm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Span.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Span.xfrm new file mode 100644 index 0000000000..34e303291b --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Span.xfrm @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Resources/Spans.xfrm b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Spans.xfrm new file mode 100644 index 0000000000..a74410c111 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Resources/Spans.xfrm @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/ColorButton.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/ColorButton.cs new file mode 100644 index 0000000000..ad57cec562 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/ColorButton.cs @@ -0,0 +1,118 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; + +namespace ICSharpCode.SharpDevelop.Gui +{ + + public class ColorButton : Button + { + Color centerColor; + + public ColorButton() + { + } + + public Color CenterColor + { + get { return centerColor; } + set { centerColor = value; } + } + + protected override void OnMouseEnter(EventArgs e) + { + base.OnMouseEnter(e); + Invalidate(); + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + Invalidate(); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + Invalidate(); + } + + protected override void OnEnabledChanged(EventArgs e) + { + base.OnEnabledChanged(e); + Invalidate(); + } + + protected override void OnClick(EventArgs e) + { + base.OnClick(e); + + Point p = new Point(0, Height); + p = PointToScreen(p); + + using (ColorPaletteDialog clDlg = new ColorPaletteDialog(p.X, p.Y)) { + clDlg.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + if (clDlg.DialogResult == DialogResult.OK) { + CenterColor = clDlg.Color; + } + } + + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics g = e.Graphics; + + Rectangle r = ClientRectangle; + + byte border = 4; + byte right_border = 15; + + Rectangle rc = new Rectangle(r.Left + border, r.Top + border, + r.Width - border - right_border - 1, r.Height - border * 2 - 1); + + SolidBrush centerColorBrush = new SolidBrush( centerColor ); + g.FillRectangle(centerColorBrush, rc); + + Pen pen = Pens.Black; + g.DrawRectangle(pen, rc); + + Pen greyPen = new Pen(SystemColors.ControlDark); + + //draw the arrow + Point p1 = new Point(r.Width - 9, r.Height / 2 - 1); + Point p2 = new Point(r.Width - 5, r.Height / 2 - 1); + g.DrawLine(Enabled ? pen : greyPen, p1, p2); + + p1 = new Point(r.Width - 8, r.Height / 2); + p2 = new Point(r.Width - 6, r.Height / 2); + g.DrawLine(Enabled ? pen : greyPen, p1, p2); + + p1 = new Point(r.Width - 7, r.Height / 2); + p2 = new Point(r.Width - 7, r.Height / 2 + 1); + g.DrawLine(Enabled ? pen : greyPen, p1, p2); + + //draw the divider line + pen = new Pen(SystemColors.ControlDark); + p1 = new Point(r.Width - 12, 4); + p2 = new Point(r.Width - 12, r.Height - 5 ); + g.DrawLine(pen, p1, p2); + + pen = new Pen(SystemColors.ControlLightLight); + p1 = new Point(r.Width - 11, 4); + p2 = new Point(r.Width - 11, r.Height - 5 ); + g.DrawLine(pen, p1, p2); + } + } + +} + diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/ColorDialog.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/ColorDialog.cs new file mode 100644 index 0000000000..6072e3245f --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/ColorDialog.cs @@ -0,0 +1,212 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; + +namespace ICSharpCode.SharpDevelop.Gui +{ + + public class ColorPaletteDialog : Form + { + byte max = 40; + ColorPanel[] panel = new ColorPanel[40]; + + Color[] color = new Color[40] + { + //row 1 + Color.FromArgb(0,0,0), Color.FromArgb(153,51,0), Color.FromArgb(51,51,0), Color.FromArgb(0,51,0), + Color.FromArgb(0,51,102), Color.FromArgb(0,0,128), Color.FromArgb(51,51,153), Color.FromArgb(51,51,51), + + //row 2 + Color.FromArgb(128,0,0), Color.FromArgb(255,102,0), Color.FromArgb(128,128,0), Color.FromArgb(0,128,0), + Color.FromArgb(0,128,128), Color.FromArgb(0,0,255), Color.FromArgb(102,102,153), Color.FromArgb(128,128,128), + + //row 3 + Color.FromArgb(255,0,0), Color.FromArgb(255,153,0), Color.FromArgb(153,204,0), Color.FromArgb(51,153,102), + Color.FromArgb(51,204,204), Color.FromArgb(51,102,255), Color.FromArgb(128,0,128), Color.FromArgb(153,153,153), + + //row 4 + Color.FromArgb(255,0,255), Color.FromArgb(255,204,0), Color.FromArgb(255,255,0), Color.FromArgb(0,255,0), + Color.FromArgb(0,255,255), Color.FromArgb(0,204,255), Color.FromArgb(153,51,102), Color.FromArgb(192,192,192), + + //row 5 + Color.FromArgb(255,153,204), Color.FromArgb(255,204,153), Color.FromArgb(255,255,153), Color.FromArgb(204,255,204), + Color.FromArgb(204,255,255), Color.FromArgb(153,204,255), Color.FromArgb(204,153,255), Color.FromArgb(255,255,255) + }; + + string[] colorName = new string[40] + { + "Black", "Brown", "Olive Green", "Dark Green", "Dark Teal", "Dark Blue", "Indigo", "Gray-80%", + "Dark Red", "Orange", "Dark Yellow", "Green", "Teal", "Blue", "Blue-Gray", "Gray-50%", + "Red", "Light Orange", "Lime", "Sea Green", "Aqua", "Light Blue", "Violet", "Gray-40%", + "Pink", "Gold", "Yellow", "Bright Green", "Turquoise", "Sky Blue", "Plum", "Gray-25%", + "Rose", "Tan", "Light Yellow", "Light Green", "Light Turquoise", "Pale Blue", "Lavender", "White" + }; + + Button moreColorsButton = new Button(); + Button cancelButton = new Button(); + Color selectedColor; + + public ColorPaletteDialog(int x, int y) + { + Size = new Size(158, 158); + FormBorderStyle = FormBorderStyle.FixedDialog; + MinimizeBox = MaximizeBox = ControlBox = false; + ShowInTaskbar = false; + CenterToScreen(); + Location = new Point(x, y); + + BuildPalette(); + + moreColorsButton.Text = "More colors ..."; + moreColorsButton.Size = new Size(142, 22); + moreColorsButton.Location = new Point(5, 99); + moreColorsButton.Click += new EventHandler(moreColorsButton_Click); + moreColorsButton.FlatStyle = FlatStyle.Popup; + Controls.Add(moreColorsButton); + + //"invisible" button to cancel at Escape + cancelButton.Text = "Cancel"; + cancelButton.Size = new Size(142, 22); + cancelButton.Location = new Point(5, 125); + cancelButton.FlatStyle = FlatStyle.Popup; + cancelButton.Click += new EventHandler(cancelButton_Click); + Controls.Add(cancelButton); + cancelButton.DialogResult = DialogResult.Cancel; + this.CancelButton = cancelButton; + + moreColorsButton.TabIndex = 0; + } + + public Color Color + { + get { return selectedColor; } + } + + void BuildPalette() + { + byte pwidth = 16; + byte pheight = 16; + byte pdistance = 2; + byte border = 5; + int x = border, y = border; + ToolTip toolTip = new ToolTip(); + + for(int i = 0; i < max; i++) + { + panel[i] = new ColorPanel(); + panel[i].Height = pwidth; + panel[i].Width = pheight; + panel[i].Location = new Point(x, y); + toolTip.SetToolTip(panel[i], colorName[i]); + + this.Controls.Add(panel[i]); + + if(x < ( 7 * (pwidth + pdistance))) + x += pwidth + pdistance; + else + { + x = border; + y += pheight + pdistance; + } + + panel[i].BackColor = color[i]; + panel[i].MouseUp += new MouseEventHandler(OnPanelMouseUp); + } + } + + void OnPanelMouseUp(object sender, MouseEventArgs e) + { + Panel panel = (Panel)sender; + selectedColor = panel.BackColor; + DialogResult = DialogResult.OK; + Close(); + } + + void moreColorsButton_Click(object sender, System.EventArgs e) + { + using (ColorDialog colDialog = new ColorDialog()) { + colDialog.FullOpen = true; + if (colDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + selectedColor = colDialog.Color; + DialogResult = DialogResult.OK; + } + } + + Close(); + } + + void cancelButton_Click(object sender, System.EventArgs e) + { + Close(); + } + + internal class ColorPanel : Panel + { + protected override void OnMouseEnter(EventArgs e) + { + base.OnMouseEnter(e); + Draw(1, CreateGraphics()); + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + Draw(0, CreateGraphics()); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + Draw(2, CreateGraphics()); + } + + protected override void OnPaint(PaintEventArgs e) + { + Draw(0, e.Graphics); + } + + void Draw(byte state, Graphics g) + { + Pen pen1, pen2; + + if(state == 1) //mouse over + { + pen1 = new Pen( SystemColors.ControlLightLight ); + pen2 = new Pen( SystemColors. ControlDarkDark); + } + else if(state == 2) //clicked + { + pen1 = new Pen( SystemColors.ControlDarkDark ); + pen2 = new Pen( SystemColors.ControlLightLight ); + } + else //neutral + { + pen1 = new Pen( SystemColors.ControlDark ); + pen2 = new Pen( SystemColors.ControlDark ); + + } + + Rectangle r = ClientRectangle; + Point p1 = new Point( r.Left, r.Top ); //top left + Point p2 = new Point( r.Right -1, r.Top ); //top right + Point p3 = new Point( r.Left, r.Bottom -1 ); //bottom left + Point p4 = new Point( r.Right -1, r.Bottom -1 ); //bottom right + + g.DrawLine( pen1, p1, p2 ); + g.DrawLine( pen1, p1, p3 ); + g.DrawLine( pen2, p2, p4 ); + g.DrawLine( pen2, p3, p4 ); + } + + } + } + +} + diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingColorDialog.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingColorDialog.cs new file mode 100644 index 0000000000..39b207a464 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingColorDialog.cs @@ -0,0 +1,165 @@ +// created on 07.09.2003 at 22:09 +using System; +using System.Windows.Forms; +using System.Reflection; + +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes; + +namespace ICSharpCode.SharpDevelop.Gui { + + public class EditHighlightingColorDialog : BaseSharpDevelopForm + { + private System.Windows.Forms.RadioButton foreNo; + private System.Windows.Forms.RadioButton foreUser; + private ICSharpCode.SharpDevelop.Gui.ColorButton backBtn; + private System.Windows.Forms.RadioButton backSys; + private System.Windows.Forms.Button acceptBtn; + private ICSharpCode.SharpDevelop.Gui.ColorButton foreBtn; + private System.Windows.Forms.RadioButton backNo; + private System.Windows.Forms.ComboBox foreList; + private System.Windows.Forms.CheckBox italicBox; + private System.Windows.Forms.RadioButton foreSys; + private System.Windows.Forms.RadioButton backUser; + private System.Windows.Forms.CheckBox boldBox; + private System.Windows.Forms.ComboBox backList; + + public EditorHighlightColor Color; + + public EditHighlightingColorDialog(EditorHighlightColor color) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.ColorDialog.xfrm")); + + Color = color; + + boldBox = (CheckBox)ControlDictionary["boldBox"]; + italicBox = (CheckBox)ControlDictionary["italicBox"]; + + foreNo = (RadioButton)ControlDictionary["foreNo"]; + foreUser = (RadioButton)ControlDictionary["foreUser"]; + foreSys = (RadioButton)ControlDictionary["foreSys"]; + foreList = (ComboBox)ControlDictionary["foreList"]; + + backNo = (RadioButton)ControlDictionary["backNo"]; + backUser = (RadioButton)ControlDictionary["backUser"]; + backSys = (RadioButton)ControlDictionary["backSys"]; + backList = (ComboBox)ControlDictionary["backList"]; + + acceptBtn = (Button)ControlDictionary["acceptBtn"]; + + this.foreBtn = new ColorButton(); + this.foreBtn.CenterColor = System.Drawing.Color.Empty; + this.foreBtn.Enabled = false; + this.foreBtn.Location = new System.Drawing.Point(30, 78); + this.foreBtn.Name = "foreBtn"; + this.foreBtn.Size = new System.Drawing.Size(98, 24); + + this.ControlDictionary["foreBox"].Controls.Add(foreBtn); + + this.backBtn = new ColorButton(); + this.backBtn.CenterColor = System.Drawing.Color.Empty; + this.backBtn.Enabled = false; + this.backBtn.Location = new System.Drawing.Point(30, 78); + this.backBtn.Name = "backBtn"; + this.backBtn.Size = new System.Drawing.Size(98, 24); + + this.ControlDictionary["backBox"].Controls.Add(backBtn); + + this.acceptBtn.Click += new EventHandler(AcceptClick); + this.foreNo.CheckedChanged += new EventHandler(foreCheck); + this.foreSys.CheckedChanged += new EventHandler(foreCheck); + this.foreUser.CheckedChanged += new EventHandler(foreCheck); + this.backNo.CheckedChanged += new EventHandler(backCheck); + this.backSys.CheckedChanged += new EventHandler(backCheck); + this.backUser.CheckedChanged += new EventHandler(backCheck); + + PropertyInfo[] names = typeof(System.Drawing.SystemColors).GetProperties(BindingFlags.Static | BindingFlags.Public); + + foreach(PropertyInfo info in names) { + foreList.Items.Add(info.Name); + backList.Items.Add(info.Name); + } + foreList.SelectedIndex = backList.SelectedIndex = 0; + + if (color.SysForeColor) { + foreSys.Checked = true; + for (int i = 0; i < foreList.Items.Count; ++i) { + if ((string)foreList.Items[i] == color.SysForeColorName) foreList.SelectedIndex = i; + } + } else if (color.HasForeColor) { + foreUser.Checked = true; + foreBtn.CenterColor = color.ForeColor; + } else { + foreNo.Checked = true; + } + + if (color.SysBackColor) { + backSys.Checked = true; + for (int i = 0; i < backList.Items.Count; ++i) { + if ((string)backList.Items[i] == color.SysForeColorName) backList.SelectedIndex = i; + } + } else if (color.HasBackColor) { + backUser.Checked = true; + backBtn.CenterColor = color.BackColor; + } else { + backNo.Checked = true; + } + + boldBox.Checked = color.Bold; + italicBox.Checked = color.Italic; + } + + void foreCheck(object sender, EventArgs e) + { + if (foreNo.Checked) { + foreBtn.Enabled = false; + foreList.Enabled = false; + } else if (foreUser.Checked) { + foreBtn.Enabled = true; + foreList.Enabled = false; + } else if (foreSys.Checked) { + foreBtn.Enabled = false; + foreList.Enabled = true; + } + } + + void backCheck(object sender, EventArgs e) + { + if (backNo.Checked) { + backBtn.Enabled = false; + backList.Enabled = false; + } else if (backUser.Checked) { + backBtn.Enabled = true; + backList.Enabled = false; + } else if (backSys.Checked) { + backBtn.Enabled = false; + backList.Enabled = true; + } + } + + void AcceptClick(object sender, EventArgs e) + { + object foreColor = null; + object backColor = null; + + if (foreUser.Checked) { + foreColor = (System.Drawing.Color)foreBtn.CenterColor; + } else if (foreSys.Checked) { + foreColor = (string)foreList.SelectedItem; + } + + if (backUser.Checked) { + backColor = (System.Drawing.Color)backBtn.CenterColor; + } else if (backSys.Checked) { + backColor = (string)backList.SelectedItem; + } + + Color = new EditorHighlightColor(foreColor, backColor, boldBox.Checked, italicBox.Checked); + + DialogResult = DialogResult.OK; + } + + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingDialog.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingDialog.cs new file mode 100644 index 0000000000..971967a4fc --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingDialog.cs @@ -0,0 +1,146 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Drawing2D; + +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes; + +namespace ICSharpCode.SharpDevelop.Gui { + + public class EditHighlightingDialog : BaseSharpDevelopForm + { + private System.Windows.Forms.Button acceptBtn; + private System.Windows.Forms.Panel propPanel; + private System.Windows.Forms.Panel optionPanel; + private System.Windows.Forms.TreeView nodeTree; + + private GradientLabel gradientLabel = new GradientLabel(); + private Label bottomLabel = new Label(); + + public EditHighlightingDialog(TreeNode topNode) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.EditDialog.xfrm")); + acceptBtn = (Button)ControlDictionary["acceptBtn"]; + nodeTree = (TreeView)ControlDictionary["nodeTree"]; + propPanel = (Panel)ControlDictionary["propPanel"]; + optionPanel = (Panel)ControlDictionary["optionPanel"]; + + // Form editor does not work properly with the custom control + this.gradientLabel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + this.gradientLabel.BorderStyle = BorderStyle.Fixed3D; + this.gradientLabel.Font = new System.Drawing.Font("Tahoma", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.gradientLabel.Location = new System.Drawing.Point(0, 0); + this.gradientLabel.Size = new System.Drawing.Size(propPanel.Width, 30); + this.gradientLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.propPanel.Controls.Add(gradientLabel); + + this.bottomLabel.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + this.bottomLabel.BorderStyle = BorderStyle.Fixed3D; + this.bottomLabel.Location = new System.Drawing.Point(0, propPanel.Height - 2); + this.bottomLabel.Size = new System.Drawing.Size(propPanel.Width, 2); + this.propPanel.Controls.Add(bottomLabel); + + this.ClientSize = new Size(660, 530); + this.acceptBtn.Click += new EventHandler(acceptClick); + ControlDictionary["cancelBtn"].Click += new EventHandler(cancelClick); + + this.nodeTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.NodeTreeAfterSelect); + this.nodeTree.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.NodeTreeBeforeSelect); + + nodeTree.Nodes.Add(topNode); + nodeTree.ExpandAll(); + + nodeTree.SelectedNode = topNode; + } + + void cancelClick(object sender, EventArgs e) + { + if (currentPanel != null) { + currentPanel.ParentNode.UpdateNodeText(); + optionPanel.Controls.Clear(); + } + nodeTree.Nodes.Clear(); + + DialogResult = DialogResult.Cancel; + + } + + void acceptClick(object sender, EventArgs e) + { + if (currentPanel != null) { + if (!currentPanel.ValidateSettings()) { + return; + } + currentPanel.StoreSettings(); + currentPanel.ParentNode.UpdateNodeText(); + + optionPanel.Controls.Clear(); + } + + nodeTree.Nodes.Clear(); + + DialogResult = DialogResult.OK; + } + + public class GradientLabel : Label + { + protected override void OnPaintBackground(PaintEventArgs pe) + { +// base.OnPaintBackground(pe); + Graphics g = pe.Graphics; + g.FillRectangle(new LinearGradientBrush(new Point(0, 0), new Point(Width, Height), + SystemColors.ControlLightLight, + SystemColors.Control), + new Rectangle(0, 0, Width, Height)); + } + + public GradientLabel() : base() + { + UseMnemonic = false; + } + } + + private NodeOptionPanel currentPanel; + + void NodeTreeBeforeSelect(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) + { + if (currentPanel != null) { + if (!currentPanel.ValidateSettings()) { + e.Cancel = true; + return; + } + } + } + + void NodeTreeAfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) + { + if (currentPanel != null) { + currentPanel.StoreSettings(); + currentPanel.ParentNode.UpdateNodeText(); + } + + optionPanel.Controls.Clear(); + NodeOptionPanel control = ((AbstractNode)e.Node).OptionPanel; + if (control != null) { + optionPanel.Controls.Add(control); + currentPanel = control; + currentPanel.LoadSettings(); + } + + gradientLabel.Text = " " + e.Node.Text; + + } + + } + +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs new file mode 100644 index 0000000000..9d3e0c1d69 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditHighlightingPanel.cs @@ -0,0 +1,305 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Xml; +using System.Xml.Schema; +using System.Text; + +using ICSharpCode.Core; + +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; + +using ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes; + +namespace ICSharpCode.SharpDevelop.Gui.OptionPanels +{ + class EditHighlightingPanel : AbstractOptionPanel { + Label builtinLabel; + ListBox builtinList; + Button copyButton; + Label userLabel; + ListBox userList; + Button deleteButton; + Button modifyButton; + + ResourceSyntaxModeProvider modeProvider; + + public override bool StorePanelContents() + { + ICSharpCode.TextEditor.Document.HighlightingManager.Manager.ReloadSyntaxModes(); + return true; + } + + public EditHighlightingPanel() { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.OptionPanel.xfrm")); + InitializeComponent(); + } + + public override void LoadPanelContents() + { + FillLists(); + } + + void InitializeComponent() { + builtinLabel = (Label)ControlDictionary["builtinLabel"]; + builtinList = (ListBox)ControlDictionary["builtinList"]; + builtinList.SelectedIndexChanged += new EventHandler(BuiltinListSelectedIndexChanged); + + copyButton = (Button)ControlDictionary["copyButton"]; + copyButton.Click += new EventHandler(CopyButtonClick); + + userLabel = (Label)ControlDictionary["userLabel"]; + userList = (ListBox)ControlDictionary["userList"]; + + deleteButton = (Button)ControlDictionary["deleteButton"]; + deleteButton.Click += new EventHandler(DeleteButtonClick); + + modifyButton = (Button)ControlDictionary["modifyButton"]; + modifyButton.Click += new EventHandler(ModifyButtonClick); + + } + + void BuiltinListSelectedIndexChanged(object sender, EventArgs e) + { + if (builtinList.SelectedIndex == -1) { + copyButton.Enabled = false; + return; + } + HighlightItem item = (HighlightItem)builtinList.SelectedItem; + string filename = item.FileName; + if (filename == null) { + filename = item.SyntaxMode.FileName; + } + + string newname = Path.GetFileName(filename); + foreach (HighlightItem item2 in userList.Items) { + if (Path.GetFileName(item2.FileName) == newname) { + copyButton.Enabled = false; + return; + } + } + copyButton.Enabled = true; + } + + protected override void OnResize(System.EventArgs ev) + { + int halfWidth = (Width - 24) / 2; + + builtinLabel.Width = userLabel.Width = halfWidth; + builtinList.Width = userList.Width = halfWidth; + + userLabel.Left = userList.Left = halfWidth + 16; + deleteButton.Left = userList.Left; + modifyButton.Left = deleteButton.Left + 90; + + base.OnResize(ev); + } + + void FillLists() + { + builtinList.Items.Clear(); + userList.Items.Clear(); + + string uPath = Path.Combine(PropertyService.ConfigDirectory, "modes"); + + List uCol; + + if (Directory.Exists(uPath)) { + uCol = FileUtility.SearchDirectory(uPath, "*.xshd", true); + } else { + Directory.CreateDirectory(uPath); + uCol = new List(); + } + + foreach(string str in uCol) { + SchemeNode node = LoadFile(new XmlTextReader(str), true); + if (node == null) continue; + userList.Items.Add(new HighlightItem(null, str, node)); + } + + modeProvider = new ResourceSyntaxModeProvider(); + + foreach(SyntaxMode mode in modeProvider.SyntaxModes){ + SchemeNode node = LoadFile(modeProvider.GetSyntaxModeFile(mode), false); + if (node == null) continue; + builtinList.Items.Add(new HighlightItem(mode, null, node)); + } + + if (builtinList.Items.Count > 0) + builtinList.SelectedIndex = 0; + + if (userList.Items.Count > 0) + userList.SelectedIndex = 0; + } + + void CopyButtonClick(object sender, EventArgs ev) + { + if (builtinList.SelectedIndex == -1) return; + + try { + HighlightItem item = (HighlightItem)builtinList.SelectedItem; + + string filename = item.FileName; + if (filename == null) filename = item.SyntaxMode.FileName; + + string newname = Path.GetFileName(filename); + newname = Path.Combine(PropertyService.ConfigDirectory, "modes" + + Path.DirectorySeparatorChar + newname); + + using (StreamWriter fs = File.CreateText(newname)) { + fs.Write(item.Node.Content); + } + + SchemeNode newNode = LoadFile(new XmlTextReader(newname), true); + if (newNode == null) throw new Exception(); + + userList.Items.Add(new HighlightItem(null, newname, newNode)); + } catch (Exception e) { + MessageService.ShowError(e, "${res:Dialog.Options.TextEditorOptions.EditHighlighting.CopyError}"); + } + BuiltinListSelectedIndexChanged(this, EventArgs.Empty); + } + + void ModifyButtonClick(object sender, EventArgs ev) + { + if (userList.SelectedIndex == -1) { + return; + } + + HighlightItem item = (HighlightItem)userList.SelectedItem; + + using (EditHighlightingDialog dlg = new EditHighlightingDialog(item.Node)) { + DialogResult res = dlg.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + + if (res == DialogResult.OK) { + using (StreamWriter sw = new StreamWriter(item.FileName, false)) { + sw.WriteLine(item.Node.ToXml().Replace("\n", "\r\n")); + } + // refresh item text + userList.Items.RemoveAt(userList.SelectedIndex); + userList.Items.Add(item); + } + + try { + item.Node.Remove(); + } catch {} + + } + } + + void DeleteButtonClick(object sender, EventArgs ev) + { + if (userList.SelectedIndex == -1) return; + HighlightItem item = (HighlightItem)userList.SelectedItem; + + if (!MessageService.AskQuestion("${res:Dialog.Options.TextEditorOptions.EditHighlighting.DeleteConfirm}")) return; + + try { + File.Delete(item.FileName); + } catch (Exception e) { + MessageService.ShowError(e, "${res:Dialog.Options.TextEditorOptions.EditHighlighting.DeleteError}"); + } + userList.Items.RemoveAt(userList.SelectedIndex); + BuiltinListSelectedIndexChanged(this, EventArgs.Empty); + } + + ArrayList errors = new ArrayList(); + + private SchemeNode LoadFile(XmlTextReader reader, bool userList) + { + try { + XmlValidatingReader validatingReader = new XmlValidatingReader(reader); + Stream schemaStream = typeof(SyntaxMode).Assembly.GetManifestResourceStream("Mode.xsd"); + validatingReader.Schemas.Add("", new XmlTextReader(schemaStream)); + validatingReader.ValidationType = ValidationType.Schema; + validatingReader.ValidationEventHandler += new ValidationEventHandler(ValidationHandler); + + XmlDocument doc = new XmlDocument(); + doc.Load(validatingReader); + + if (errors.Count != 0) { + ReportErrors(); + return null; + } else { + return new SchemeNode(doc.DocumentElement, userList); + } + } catch (Exception e) { + + MessageService.ShowError(e, "${res:Dialog.Options.TextEditorOptions.EditHighlighting.LoadError}"); + return null; + } finally { + reader.Close(); + } + + } + + private void ValidationHandler(object sender, ValidationEventArgs args) + { + errors.Add(args); + } + + private void ReportErrors() + { + StringBuilder msg = new StringBuilder(); + msg.Append(ResourceService.GetString("Dialog.Options.TextEditorOptions.EditHighlighting.LoadError") + "\n\n"); + foreach(ValidationEventArgs args in errors) { + msg.Append(args.Message); + msg.Append(Console.Out.NewLine); + } + + MessageService.ShowWarning(msg.ToString()); + } + + internal class HighlightItem + { + string fileName; + SyntaxMode syntaxMode; + SchemeNode node; + + public HighlightItem(SyntaxMode mode, string filename, SchemeNode Node) + { + syntaxMode = mode; + fileName = filename; + node = Node; + } + + public string FileName { + get { + return fileName; + } + } + + public SyntaxMode SyntaxMode { + get { + return syntaxMode; + } + } + + public SchemeNode Node { + get { + return node; + } + } + + public override string ToString() + { + try { + return syntaxMode.Name + " (" + String.Join(", ", node.Extensions) + ")"; + } catch { + return fileName; + } + } + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs new file mode 100644 index 0000000000..9e66f5e1e8 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/EditorHighlightColor.cs @@ -0,0 +1,300 @@ +// +// +// +// +// +// + +using System; +using System.Drawing; +using System.Diagnostics; +using System.Collections.Specialized; +using System.Collections; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Windows.Forms; +using System.Xml; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + public class EditorHighlightColor + { + bool hasForeColor = false; + bool hasBackColor = false; + + Color foreColor; + bool sysForeColor = false; + string sysForeColorName = ""; + + Color backColor; + bool sysBackColor = false; + string sysBackColorName = ""; + + bool bold = false; + bool italic = false; + + bool noColor = false; + + public bool NoColor { + get { + return noColor; + } + } + public bool HasForeColor { + get { + return hasForeColor; + } + } + public bool HasBackColor { + get { + return hasBackColor; + } + } + public Color ForeColor { + get { + return foreColor; + } + } + public bool SysForeColor { + get { + return sysForeColor; + } + } + public string SysForeColorName { + get { + return sysForeColorName; + } + } + public Color BackColor { + get { + return backColor; + } + } + public bool SysBackColor { + get { + return sysBackColor; + } + } + public string SysBackColorName { + get { + return sysBackColorName; + } + } + public bool Bold { + get { + return bold; + } + } + public bool Italic { + get { + return italic; + } + } + + + public EditorHighlightColor(XmlElement el) + { + if (el == null) { + noColor = true; + return; + } + + if (el.Attributes["bold"] == null && + el.Attributes["italic"] == null && + el.Attributes["color"] == null && + el.Attributes["bgcolor"] == null) + { + noColor = true; + return; + } + + if (el.Attributes["bold"] != null) { + bold = Boolean.Parse(el.Attributes["bold"].InnerText); + } + + if (el.Attributes["italic"] != null) { + italic = Boolean.Parse(el.Attributes["italic"].InnerText); + } + + if (el.Attributes["color"] != null) { + hasForeColor = true; + string c = el.Attributes["color"].InnerText; + if (c[0] == '#') { + foreColor = ParseColor(c); + } else if (c.StartsWith("SystemColors.")) { + sysForeColor = true; + sysForeColorName = c.Substring("SystemColors.".Length); + } else { + PropertyInfo myPropInfo = typeof(Color).GetProperty(c, BindingFlags.Public | BindingFlags.Static); + foreColor = (Color)myPropInfo.GetValue(null, null); + } + } + + if (el.Attributes["bgcolor"] != null) { + hasBackColor = true; + string c = el.Attributes["bgcolor"].InnerText; + if (c[0] == '#') { + backColor = ParseColor(c); + } else if (c.StartsWith("SystemColors.")) { + sysBackColor = true; + sysBackColorName = c.Substring("SystemColors.".Length); + } else { + PropertyInfo myPropInfo = typeof(Color).GetProperty(c, BindingFlags.Public | BindingFlags.Static); + backColor = (Color)myPropInfo.GetValue(null, null); + } + } + } + + public EditorHighlightColor(bool hascolor, Color Color, bool hasbackcolor, Color BackColor, bool bold, bool italic) + { + hasForeColor = hascolor; + hasBackColor = hasbackcolor; + this.backColor = BackColor; + this.foreColor = Color; + this.bold = bold; + this.italic = italic; + } + + public EditorHighlightColor(object ForeColor, object BackColor, bool Bold, bool Italic) + { + bold = Bold; + italic = Italic; + + if (ForeColor is Color) { + hasForeColor = true; + foreColor = (Color)ForeColor; + } else if (ForeColor is string) { + hasForeColor = true; + sysForeColor = true; + sysForeColorName = (string)ForeColor; + } + + if (BackColor is Color) { + hasBackColor = true; + backColor = (Color)BackColor; + } else if (BackColor is string) { + hasBackColor = true; + sysBackColor = true; + sysBackColorName = (string)BackColor; + } + } + + public EditorHighlightColor() + { + bold = false; + italic = false; + hasForeColor = true; + sysForeColor = true; + sysForeColorName = "WindowText"; + } + + public EditorHighlightColor(bool NoColor) : this() + { + noColor = NoColor; + } + + static Color ParseColor(string c) + { + int a = 255; + int offset = 0; + if (c.Length > 7) { + offset = 2; + a = Int32.Parse(c.Substring(1,2), NumberStyles.HexNumber); + } + + int r = Int32.Parse(c.Substring(1 + offset,2), NumberStyles.HexNumber); + int g = Int32.Parse(c.Substring(3 + offset,2), NumberStyles.HexNumber); + int b = Int32.Parse(c.Substring(5 + offset,2), NumberStyles.HexNumber); + return Color.FromArgb(a, r, g, b); + } + + public string ToXml() + { + string str = ""; + str += "bold=\"" + bold.ToString().ToLower() + "\" "; + str += "italic=\"" + italic.ToString().ToLower() + "\" "; + if (hasForeColor) { + str += "color=\""; + if (sysForeColor) { + str += "SystemColors." + sysForeColorName; + } else { + str += ReplaceColorName("#" + (foreColor.A != 255 ? foreColor.A.ToString("X2") : "") + + foreColor.R.ToString("X2") + + foreColor.G.ToString("X2") + + foreColor.B.ToString("X2")); + } + + str += "\" "; + } + if (hasBackColor) { + str += "bgcolor=\""; + if (sysBackColor) { + str += "SystemColors." + sysBackColorName; + } else { + str += ReplaceColorName("#" + (backColor.A != 255 ? backColor.A.ToString("X2") : "") + + backColor.R.ToString("X2") + + backColor.G.ToString("X2") + + backColor.B.ToString("X2")); + } + + str += "\" "; + } + return str; + } + + Color ParseSysColor(string colorName) + { + string[] cNames = colorName.Split('*'); + PropertyInfo myPropInfo = typeof(System.Drawing.SystemColors).GetProperty(cNames[0], BindingFlags.Public | BindingFlags.Static); + Color c = (Color)myPropInfo.GetValue(null, null); + + if (cNames.Length == 2) { + // hack : can't figure out how to parse doubles with '.' (culture info might set the '.' to ',') + double factor = Double.Parse(cNames[1]) / 100; + c = Color.FromArgb((int)((double)c.R * factor), (int)((double)c.G * factor), (int)((double)c.B * factor)); + } + + return c; + } + + public Color GetForeColor() + { + if (!hasForeColor) return Color.Transparent; + + if (sysForeColor) return ParseSysColor(sysForeColorName); + + return foreColor; + } + + public Color GetBackColor() + { + if (!hasBackColor) return Color.Transparent; + + if (sysBackColor) return ParseSysColor(sysBackColorName); + + return backColor; + } + + static Hashtable colorNames = new Hashtable(); + + static string ReplaceColorName(string color) + { + if (colorNames.ContainsKey(color)) return (string)colorNames[color]; + return color; + } + + static EditorHighlightColor() + { + PropertyInfo[] names = typeof(System.Drawing.Color).GetProperties(BindingFlags.Public | BindingFlags.Static); + + foreach(PropertyInfo pi in names) { + Color pcolor = (Color)pi.GetValue(null, null); + string colorDesc = "#" + (pcolor.A != 255 ? pcolor.A.ToString("X2") : "") + pcolor.R.ToString("X2") + pcolor.G.ToString("X2") + pcolor.B.ToString("X2"); + try { + colorNames.Add(colorDesc, pi.Name); + } catch {} + } + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs new file mode 100644 index 0000000000..4f18fd6a83 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/AbstractNode.cs @@ -0,0 +1,46 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; + + +using ICSharpCode.Core; +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + abstract class AbstractNode : TreeNode + { + protected NodeOptionPanel panel; + protected string ResNodeName(string resName) + { + try { + return ResourceService.GetString("Dialog.HighlightingEditor.TreeView." + resName); + } catch { + return resName; + } + } + + public NodeOptionPanel OptionPanel { + get { + return panel; + } + } + + public abstract void UpdateNodeText(); + + // should be made abstract when implementing ToXml() + public virtual string ToXml() { return ""; } + + public static string ReplaceXmlChars(string str) + { + return str.Replace("&", "&").Replace("<", "<").Replace(">", ">"); + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs new file mode 100644 index 0000000000..bb5ef83d44 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/DigitsNode.cs @@ -0,0 +1,97 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class DigitsNode : AbstractNode + { + EditorHighlightColor color; + + public EditorHighlightColor Color { + get { + return color; + } + set { + color = value; + } + } + + public DigitsNode(XmlElement el) + { + if (el != null) { + color = new EditorHighlightColor(el); + } else { + color = new EditorHighlightColor(); + } + + Text = ResNodeName("DigitsColor"); + + panel = new DigitsOptionPanel(this); + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + return "\t\n\n"; + } + } + + class DigitsOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button button; + private System.Windows.Forms.Label sampleLabel; + + EditorHighlightColor color = new EditorHighlightColor(); + + public DigitsOptionPanel(DigitsNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Digits.xfrm")); + + button = (Button)ControlDictionary["button"]; + button.Click += new EventHandler(EditButtonClicked); + sampleLabel = (Label)ControlDictionary["sampleLabel"]; + } + + public override void StoreSettings() + { + DigitsNode node = (DigitsNode)parent; + + node.Color = color; + } + + public override void LoadSettings() + { + DigitsNode node = (DigitsNode)parent; + + Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); + sampleLabel.Font = ParseFont(properties.Get("DefaultFont", new Font("Courier New", 10).ToString())); + color = node.Color; + PreviewUpdate(sampleLabel, color); + } + + void EditButtonClicked(object sender, EventArgs e) + { + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(color)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + color = dlg.Color; + PreviewUpdate(sampleLabel, color); + } + } + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs new file mode 100644 index 0000000000..8a1e4538fc --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/EnvironmentNode.cs @@ -0,0 +1,165 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; + +using ICSharpCode.TextEditor.Document; +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class EnvironmentNode : AbstractNode + { + public static string[] ColorNames; + public string[] ColorDescs; + public EditorHighlightColor[] Colors; + + public EnvironmentNode(XmlElement el) + { + + + ArrayList envColors = new ArrayList(); + ArrayList envColorNames = new ArrayList(); + ArrayList envColorDescriptions = new ArrayList(); + if (el != null) { + foreach (XmlNode node in el.ChildNodes) { + if (node is XmlElement) { + Console.WriteLine("Node : " + node); + + envColorNames.Add(node.Name); + envColorDescriptions.Add("${res:Dialog.HighlightingEditor.EnvColors." + node.Name + "}"); + envColors.Add(new EditorHighlightColor((XmlElement)node)); + } + } + } + EnvironmentNode.ColorNames = (string[])envColorNames.ToArray(typeof(string)); + this.ColorDescs = (string[])envColorDescriptions.ToArray(typeof(string)); + this.Colors = (EditorHighlightColor[])envColors.ToArray(typeof(EditorHighlightColor)); + StringParser.Parse(ref ColorDescs); + + Text = ResNodeName("EnvironmentColors"); + + panel = new EnvironmentOptionPanel(this); + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + string str = "\t\n"; + for (int i = 0; i <= ColorNames.GetUpperBound(0); ++i) { + str += "\t\t<" + ColorNames[i] + " " + Colors[i].ToXml() + "/>\n"; + } + str += "\t\n\n"; + return str; + } + } + + class EnvironmentOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button button; + private System.Windows.Forms.ListView listView; + + public EnvironmentOptionPanel(EnvironmentNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Environment.xfrm")); + + button = (Button)ControlDictionary["button"]; + button.Click += new EventHandler(EditButtonClicked); + listView = (ListView)ControlDictionary["listView"]; + + listView.Font = new Font(listView.Font.FontFamily, 10); + } + + public override void StoreSettings() + { + EnvironmentNode node = (EnvironmentNode)parent; + + foreach (EnvironmentItem item in listView.Items) { + node.Colors[item.arrayIndex] = item.Color; + } + } + + public override void LoadSettings() + { + EnvironmentNode node = (EnvironmentNode)parent; + listView.Items.Clear(); + + for (int i = 0; i <= EnvironmentNode.ColorNames.GetUpperBound(0); ++i) { + listView.Items.Add(new EnvironmentItem(i, node.ColorDescs[i], node.Colors[i], listView.Font)); + } + } + + void EditButtonClicked(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + EnvironmentItem item = (EnvironmentItem)listView.SelectedItems[0]; + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(item.Color)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + item.Color = dlg.Color; + item.ColorUpdate(); + } + } + } + + private class EnvironmentItem : ListViewItem + { + public string Name; + public EditorHighlightColor Color; + public int arrayIndex; + + Font basefont; + Font listfont; + + static Font ParseFont(string font) + { + string[] descr = font.Split(new char[]{',', '='}); + return new Font(descr[1], Single.Parse(descr[3])); + } + + public EnvironmentItem(int index, string name, EditorHighlightColor color, Font listFont) : base(new string[] {name, "Sample"}) + { + Name = name; + Color = color; + arrayIndex = index; + + this.UseItemStyleForSubItems = false; + + Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); + basefont = ParseFont(properties.Get("DefaultFont", new Font("Courier New", 10).ToString())); + listfont = listFont; + + ColorUpdate(); + } + + public void ColorUpdate() + { + FontStyle fs = FontStyle.Regular; + if (Color.Bold) fs |= FontStyle.Bold; + if (Color.Italic) fs |= FontStyle.Italic; + + this.Font = new Font(listfont.FontFamily, 8); + + Font font = new Font(basefont, fs); + + this.SubItems[1].Font = font; + + this.SubItems[1].ForeColor = Color.GetForeColor(); + this.SubItems[1].BackColor = Color.GetBackColor(); + } + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs new file mode 100644 index 0000000000..d5b014f1dd --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListNode.cs @@ -0,0 +1,211 @@ +// +// +// +// +// +// + +using System; +using System.Collections.Specialized; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using System.Text; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class KeywordListNode : AbstractNode + { + EditorHighlightColor color; + StringCollection words = new StringCollection(); + string name; + + public EditorHighlightColor Color { + get { + return color; + } + set { + color = value; + } + } + + public StringCollection Words { + get { + return words; + } + set { + if (words != null) { + words.Clear(); + } + words = value; + } + } + + public string Name { + get { + return name; + } + set { + name = value; + } + } + + public KeywordListNode(XmlElement el) + { + Text = ResNodeName("KeywordList"); + panel = new KeywordListOptionPanel(this); + + if (el == null) return; + + color = new EditorHighlightColor(el); + + XmlNodeList keys = el.GetElementsByTagName("Key"); + foreach (XmlElement node in keys) { + if (node.Attributes["word"] != null) words.Add(node.Attributes["word"].InnerText); + } + + if (el.Attributes["name"] != null) { + name = el.Attributes["name"].InnerText; + } + UpdateNodeText(); + + } + + public KeywordListNode(string Name) + { + name = Name; + color = new EditorHighlightColor(); + UpdateNodeText(); + + panel = new KeywordListOptionPanel(this); + } + + public override void UpdateNodeText() + { + if (name != "") Text = name; + } + + public override string ToXml() + { + StringBuilder ret = new StringBuilder("\t\t\t\n"; + ret.Append(color.ToXml()); + ret.Append(">\n"); + foreach(string str in words) { + ////ret += "\t\t\t\t\n"; + ret.Append("\t\t\t\t\n"); + } + ////ret += "\t\t\t\n\n"; + ret.Append("\t\t\t\n\n"); + return ret.ToString(); + } + } + + class KeywordListOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button chgBtn; + private System.Windows.Forms.Button addBtn; + private System.Windows.Forms.ListBox listBox; + private System.Windows.Forms.Button removeBtn; + private System.Windows.Forms.TextBox nameBox; + private System.Windows.Forms.Label sampleLabel; + + public KeywordListOptionPanel(KeywordListNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.KeywordList.xfrm")); + + addBtn = (Button)ControlDictionary["addBtn"]; + addBtn.Click += new EventHandler(addBtnClick); + removeBtn = (Button)ControlDictionary["removeBtn"]; + removeBtn.Click += new EventHandler(removeBtnClick); + chgBtn = (Button)ControlDictionary["chgBtn"]; + chgBtn.Click += new EventHandler(chgBtnClick); + + nameBox = (TextBox)ControlDictionary["nameBox"]; + sampleLabel = (Label)ControlDictionary["sampleLabel"]; + listBox = (ListBox)ControlDictionary["listBox"]; + } + + EditorHighlightColor color; + + public override void StoreSettings() + { + KeywordListNode node = (KeywordListNode)parent; + StringCollection col = new StringCollection(); + + foreach (string word in listBox.Items) { + col.Add(word); + } + node.Words = col; + node.Name = nameBox.Text; + node.Color = color; + } + + public override void LoadSettings() + { + KeywordListNode node = (KeywordListNode)parent; + listBox.Items.Clear(); + + foreach (string word in node.Words) { + listBox.Items.Add(word); + } + + Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); + sampleLabel.Font = ParseFont(properties.Get("DefaultFont", new Font("Courier New", 10).ToString())); + + color = node.Color; + nameBox.Text = node.Name; + PreviewUpdate(sampleLabel, color); + } + + public override bool ValidateSettings() + { + if (nameBox.Text == "") { + ValidationMessage("${res:Dialog.HighlightingEditor.KeywordList.NameEmpty}"); + return false; + } + + return true; + } + + void chgBtnClick(object sender, EventArgs e) + { + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(color)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + color = dlg.Color; + PreviewUpdate(sampleLabel, color); + } + } + } + + void addBtnClick(object sender, EventArgs e) + { + using (InputBox box = new InputBox()) { + box.Label.Text = ResourceService.GetString("Dialog.HighlightingEditor.KeywordList.EnterName"); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + if (box.TextBox.Text == "") return; + foreach (string item in listBox.Items) { + if (item == box.TextBox.Text) + return; + } + + listBox.Items.Add(box.TextBox.Text); + } + } + + void removeBtnClick(object sender, EventArgs e) + { + if (listBox.SelectedIndex == -1) return; + + listBox.Items.RemoveAt(listBox.SelectedIndex); + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs new file mode 100644 index 0000000000..90e72b6c4b --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/KeywordListsNode.cs @@ -0,0 +1,112 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class KeywordListsNode : AbstractNode + { + public KeywordListsNode(XmlElement el) + { + Text = ResNodeName("KeywordLists"); + panel = new KeywordListsOptionPanel(this); + + if (el == null) return; + + XmlNodeList nodes = el.GetElementsByTagName("KeyWords"); + if (nodes == null) return; + + foreach (XmlElement el2 in nodes) { + Nodes.Add(new KeywordListNode(el2)); + } + + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + string ret = ""; + foreach (KeywordListNode node in Nodes) { + ret += node.ToXml(); + } + return ret; + } + } + + class KeywordListsOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button removeBtn; + private System.Windows.Forms.Button addBtn; + private System.Windows.Forms.ListView listView; + + public KeywordListsOptionPanel(KeywordListsNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.KeywordLists.xfrm")); + + addBtn = (Button)ControlDictionary["addBtn"]; + addBtn.Click += new EventHandler(addClick); + removeBtn = (Button)ControlDictionary["removeBtn"]; + removeBtn.Click += new EventHandler(removeClick); + + listView = (ListView)ControlDictionary["listView"]; + } + + public override void StoreSettings() + { + } + + public override void LoadSettings() + { + KeywordListsNode node = (KeywordListsNode)parent; + listView.Items.Clear(); + + foreach (KeywordListNode rn in node.Nodes) { + ListViewItem lv = new ListViewItem(rn.Name); + lv.Tag = rn; + listView.Items.Add(lv); + } + } + + void addClick(object sender, EventArgs e) + { + using (InputBox box = new InputBox()) { + box.Label.Text = ResourceService.GetString("Dialog.HighlightingEditor.KeywordLists.EnterName"); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + if (box.TextBox.Text == "") return; + foreach (ListViewItem item in listView.Items) { + if (item.Text == box.TextBox.Text) + return; + } + + KeywordListNode kwn = new KeywordListNode(box.TextBox.Text); + ListViewItem lv = new ListViewItem(box.TextBox.Text); + lv.Tag = kwn; + parent.Nodes.Add(kwn); + listView.Items.Add(lv); + } + } + + void removeClick(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + ((TreeNode)listView.SelectedItems[0].Tag).Remove(); + listView.SelectedItems[0].Remove(); + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs new file mode 100644 index 0000000000..c7760d008d --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkerNode.cs @@ -0,0 +1,164 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class MarkerNode : AbstractNode + { + bool previous; + string what; + EditorHighlightColor color; + bool markMarker = false; + + public MarkerNode(XmlElement el, bool prev) + { + Text = "Marker"; + previous = prev; + panel = new MarkerOptionPanel(this, prev); + + if (el == null) return; + + color = new EditorHighlightColor(el); + what = el.InnerText; + if (el.Attributes["markmarker"] != null) { + markMarker = Boolean.Parse(el.Attributes["markmarker"].InnerText); + } + + UpdateNodeText(); + + } + + public MarkerNode(string What, bool prev) + { + what = What; + previous = prev; + color = new EditorHighlightColor(); + UpdateNodeText(); + + panel = new MarkerOptionPanel(this, prev); + } + + public override void UpdateNodeText() + { + Text = what; + } + + public override string ToXml() + { + string ret = "\t\t\t\n\n"; + return ret; + } + + public string What { + get { + return what; + } + set { + what = value; + } + } + + public EditorHighlightColor Color { + get { + return color; + } + set { + color = value; + } + } + + public bool MarkMarker { + get { + return markMarker; + } + set { + markMarker = value; + } + } + + } + + class MarkerOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button chgBtn; + private System.Windows.Forms.CheckBox checkBox; + private System.Windows.Forms.TextBox nameBox; + private System.Windows.Forms.Label sampleLabel; + + bool previous; + + public MarkerOptionPanel(MarkerNode parent, bool prev) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Marker.xfrm")); + + chgBtn = (Button)ControlDictionary["chgBtn"]; + chgBtn.Click += new EventHandler(chgBtnClick); + + checkBox = (CheckBox)ControlDictionary["checkBox"]; + nameBox = (TextBox)ControlDictionary["nameBox"]; + sampleLabel = (Label)ControlDictionary["sampleLabel"]; + + previous = prev; + ControlDictionary["explLabel"].Text = ResourceService.GetString(previous ? "Dialog.HighlightingEditor.Marker.ExplanationPrev" : "Dialog.HighlightingEditor.Marker.ExplanationNext"); + } + + EditorHighlightColor color; + + public override void StoreSettings() + { + MarkerNode node = (MarkerNode)parent; + + node.What = nameBox.Text; + node.Color = color; + node.MarkMarker = checkBox.Checked; + } + + public override void LoadSettings() + { + MarkerNode node = (MarkerNode)parent; + + + Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); + sampleLabel.Font = ParseFont(properties.Get("DefaultFont", new Font("Courier New", 10).ToString())); + + color = node.Color; + nameBox.Text = node.What; + checkBox.Checked = node.MarkMarker; + PreviewUpdate(sampleLabel, color); + } + + public override bool ValidateSettings() + { + if (nameBox.Text == "") { + ValidationMessage(ResourceService.GetString("Dialog.HighlightingEditor.Marker.NameEmpty")); + return false; + } + + return true; + } + + void chgBtnClick(object sender, EventArgs e) + { + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(color)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + color = dlg.Color; + PreviewUpdate(sampleLabel, color); + } + } + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs new file mode 100644 index 0000000000..63ae1db0e4 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/MarkersNode.cs @@ -0,0 +1,116 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class MarkersNode : AbstractNode + { + public MarkersNode(XmlElement el, bool prev) + { + Text = ResNodeName(prev ? "MarkPreviousWord" : "MarkNextWord"); + + panel = new MarkersOptionPanel(this, prev); + if (el == null) return; + + XmlNodeList nodes = el.GetElementsByTagName(prev ? "MarkPrevious" : "MarkFollowing"); + + foreach (XmlElement el2 in nodes) { + Nodes.Add(new MarkerNode(el2, prev)); + } + + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + string ret = ""; + foreach (MarkerNode node in Nodes) { + ret += node.ToXml(); + } + return ret; + } + } + + class MarkersOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button addBtn; + private System.Windows.Forms.Button removeBtn; + private System.Windows.Forms.ListView listView; + + bool previous = false; + + public MarkersOptionPanel(MarkersNode parent, bool prev) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Markers.xfrm")); + + addBtn = (Button)ControlDictionary["addBtn"]; + addBtn.Click += new EventHandler(addClick); + removeBtn = (Button)ControlDictionary["removeBtn"]; + removeBtn.Click += new EventHandler(removeClick); + + listView = (ListView)ControlDictionary["listView"]; + + previous = prev; + ControlDictionary["label"].Text = ResourceService.GetString(previous ? "Dialog.HighlightingEditor.Markers.Previous" : "Dialog.HighlightingEditor.Markers.Next"); + } + + public override void StoreSettings() + { + } + + public override void LoadSettings() + { + MarkersNode node = (MarkersNode)parent; + listView.Items.Clear(); + + foreach (MarkerNode rn in node.Nodes) { + ListViewItem lv = new ListViewItem(rn.What); + lv.Tag = rn; + listView.Items.Add(lv); + } + } + + void addClick(object sender, EventArgs e) + { + using (InputBox box = new InputBox()) { + box.Label.Text = ResourceService.GetString("Dialog.HighlightingEditor.Markers.EnterName"); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + if (box.TextBox.Text == "") return; + foreach (ListViewItem item in listView.Items) { + if (item.Text == box.TextBox.Text) + return; + } + + MarkerNode rsn = new MarkerNode(box.TextBox.Text, previous); + ListViewItem lv = new ListViewItem(box.TextBox.Text); + lv.Tag = rsn; + parent.Nodes.Add(rsn); + listView.Items.Add(lv); + } + } + + void removeClick(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + ((TreeNode)listView.SelectedItems[0].Tag).Remove(); + listView.SelectedItems[0].Remove(); + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/NodeOptionPanel.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/NodeOptionPanel.cs new file mode 100644 index 0000000000..90ba04e5da --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/NodeOptionPanel.cs @@ -0,0 +1,81 @@ +// +// +// +// +// +// + +using System; +using System.Collections.Specialized; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + abstract class NodeOptionPanel : BaseSharpDevelopUserControl + { + protected AbstractNode parent; + + public AbstractNode ParentNode { + get { + return parent; + } + } + + public NodeOptionPanel(AbstractNode Parent) { + parent = Parent; + + this.Dock = DockStyle.Fill; + this.ClientSize = new Size(320, 392); + + } + + public virtual bool ValidateSettings() + { + return true; + } + + + + protected void ValidationMessage(string str) + { + MessageService.ShowWarning("${res:Dialog.HighlightingEditor.ValidationError}\n\n" + str); + } + + protected static Font ParseFont(string font) + { + string[] descr = font.Split(new char[]{',', '='}); + return new Font(descr[1], Single.Parse(descr[3])); + } + + protected static void PreviewUpdate(Label label, EditorHighlightColor color) + { + if (label == null) return; + + if (color == null) { + label.ForeColor = label.BackColor = Color.Transparent; + return; + } + if (color.NoColor) { + label.ForeColor = label.BackColor = Color.Transparent; + return; + } + + label.ForeColor = color.GetForeColor(); + label.BackColor = color.GetBackColor(); + + FontStyle fs = FontStyle.Regular; + if (color.Bold) fs |= FontStyle.Bold; + if (color.Italic) fs |= FontStyle.Italic; + + label.Font = new Font(label.Font, fs); + } + + public abstract void StoreSettings(); + public abstract void LoadSettings(); + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs new file mode 100644 index 0000000000..ceebe1bf80 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/PropertiesNode.cs @@ -0,0 +1,130 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class PropertiesNode : AbstractNode + { + public Hashtable Properties = new Hashtable(); + + public PropertiesNode(XmlElement el) + { + Text = ResNodeName("Properties"); + panel = new PropertiesOptionPanel(this); + + if (el == null) return; + + foreach (XmlElement el2 in el.ChildNodes) { + if (el2.Attributes["name"] == null || el2.Attributes["value"] == null) continue; + Properties.Add(el2.Attributes["name"].InnerText, el2.Attributes["value"].InnerText); + } + + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + string ret = "\t\n"; + foreach (DictionaryEntry de in Properties) { + ret += "\t\t\n"; + } + ret += "\t\n\n"; + return ret; + } + } + + class PropertiesOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button addBtn; + private System.Windows.Forms.Button editBtn; + private System.Windows.Forms.Button removeBtn; + private System.Windows.Forms.ListView listView; + + public PropertiesOptionPanel(PropertiesNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Properties.xfrm")); + + addBtn = (Button)ControlDictionary["addBtn"]; + addBtn.Click += new EventHandler(addClick); + editBtn = (Button)ControlDictionary["editBtn"]; + editBtn.Click += new EventHandler(editClick); + removeBtn = (Button)ControlDictionary["removeBtn"]; + removeBtn.Click += new EventHandler(removeClick); + + listView = (ListView)ControlDictionary["listView"]; + } + + public override void StoreSettings() + { + PropertiesNode node = (PropertiesNode)parent; + + node.Properties.Clear(); + foreach (ListViewItem item in listView.Items) { + node.Properties.Add(item.Text, item.SubItems[1].Text); + } + } + + public override void LoadSettings() + { + PropertiesNode node = (PropertiesNode)parent; + listView.Items.Clear(); + + foreach (DictionaryEntry de in node.Properties) { + ListViewItem lv = new ListViewItem(new string[] {(string)de.Key, (string)de.Value}); + listView.Items.Add(lv); + } + } + + void addClick(object sender, EventArgs e) + { + using (InputBox box = new InputBox()) { + box.Label.Text = ResourceService.GetString("Dialog.HighlightingEditor.Properties.EnterName"); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + foreach (ListViewItem item in listView.Items) { + if (item.Text == box.TextBox.Text) + return; + } + + listView.Items.Add(new ListViewItem(new string[] {box.TextBox.Text, ""})); + } + } + + void removeClick(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + listView.SelectedItems[0].Remove(); + } + + void editClick(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + using (InputBox box = new InputBox()) { + box.Text = ResourceService.GetString("Dialog.HighlightingEditor.EnterText"); + box.Label.Text = String.Format(ResourceService.GetString("Dialog.HighlightingEditor.Properties.EnterValue"), listView.SelectedItems[0].Text); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + listView.SelectedItems[0].SubItems[1].Text = box.TextBox.Text; + } + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs new file mode 100644 index 0000000000..a525c45a76 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetNode.cs @@ -0,0 +1,237 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class RuleSetNode : AbstractNode + { + bool noEscapeSequences = false; + bool ignoreCase = false; + bool isRoot = false; + string name = String.Empty; + string delimiters = String.Empty; + string reference = String.Empty; + + KeywordListsNode keywordNode; + SpansNode spansNode; + MarkersNode prevMarkerNode; + MarkersNode nextMarkerNode; + + public RuleSetNode(XmlElement el) + { + Text = ResNodeName("RuleSet"); + + panel = new RuleSetOptionPanel(this); + + if (el == null) return; + + if (el.Attributes["name"] != null) { + name = el.Attributes["name"].InnerText; + Text = name; + isRoot = false; + } + + if (name == "") { + Text = ResNodeName("RootRuleSet"); + isRoot = true; + } + + if (el.Attributes["noescapesequences"] != null) { + noEscapeSequences = Boolean.Parse(el.Attributes["noescapesequences"].InnerText); + } + + if (el.Attributes["reference"] != null) { + reference = el.Attributes["reference"].InnerText; + } + + if (el.Attributes["ignorecase"] != null) { + ignoreCase = Boolean.Parse(el.Attributes["ignorecase"].InnerText); + } + + if (el["Delimiters"] != null) { + delimiters = el["Delimiters"].InnerText; + } + + keywordNode = new KeywordListsNode(el); + spansNode = new SpansNode(el); + prevMarkerNode = new MarkersNode(el, true); // Previous + nextMarkerNode = new MarkersNode(el, false); // Next + Nodes.Add(keywordNode); + Nodes.Add(spansNode); + Nodes.Add(prevMarkerNode); + Nodes.Add(nextMarkerNode); + + } + + public RuleSetNode(string Name, string Delim, string Ref, bool noEsc, bool noCase) + { + name = Name; + Text = Name; + delimiters = Delim; + reference = Ref; + noEscapeSequences = noEsc; + ignoreCase = noCase; + + keywordNode = new KeywordListsNode(null); + spansNode = new SpansNode(null); + prevMarkerNode = new MarkersNode(null, true); // Previous + nextMarkerNode = new MarkersNode(null, false); // Next + Nodes.Add(keywordNode); + Nodes.Add(spansNode); + Nodes.Add(prevMarkerNode); + Nodes.Add(nextMarkerNode); + + panel = new RuleSetOptionPanel(this); + } + + public override void UpdateNodeText() + { + if (name != "" && !isRoot) { + Text = name; + } + } + + public override string ToXml() + { + if (reference != "") return "\t\t\n\n"; + + string ret = "\t\t\n\n"; + + ret += spansNode.ToXml(); + ret += prevMarkerNode.ToXml(); + ret += nextMarkerNode.ToXml(); + ret += keywordNode.ToXml(); + + ret += "\t\t\n\n"; + + return ret; + } + + public string Delimiters { + get { + return delimiters; + } + set { + delimiters = value; + } + } + + public bool NoEscapeSequences { + get { + return noEscapeSequences; + } + set { + noEscapeSequences = value; + } + } + + public bool IgnoreCase { + get { + return ignoreCase; + } + set { + ignoreCase = value; + } + } + + public string Name { + get { + return name; + } + set { + name = value; + } + } + + public string Reference { + get { + return reference; + } + set { + reference = value; + } + } + + public bool IsRoot { + get { + return isRoot; + } + } + + } + + class RuleSetOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.CheckBox igcaseBox; + private System.Windows.Forms.CheckBox noEscBox; + private System.Windows.Forms.TextBox refBox; + private System.Windows.Forms.TextBox delimBox; + private System.Windows.Forms.TextBox nameBox; + + public RuleSetOptionPanel(RuleSetNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.RuleSet.xfrm")); + + nameBox = (TextBox)ControlDictionary["nameBox"]; + refBox = (TextBox)ControlDictionary["refBox"]; + delimBox = (TextBox)ControlDictionary["delimBox"]; + + igcaseBox = (CheckBox)ControlDictionary["igcaseBox"]; + noEscBox = (CheckBox)ControlDictionary["noEscBox"]; + } + + public override void StoreSettings() + { + RuleSetNode node = (RuleSetNode)parent; + if (!node.IsRoot) node.Name = nameBox.Text; + node.Reference = refBox.Text; + node.Delimiters = delimBox.Text; + node.NoEscapeSequences = noEscBox.Checked; + node.IgnoreCase = igcaseBox.Checked; + } + + public override void LoadSettings() + { + RuleSetNode node = (RuleSetNode)parent; + + nameBox.Text = node.Name; + + if (node.IsRoot) { + nameBox.Text = ResourceService.GetString("Dialog.HighlightingEditor.TreeView.RootRuleSet"); + nameBox.Enabled = false; + } + + refBox.Text = node.Reference; + delimBox.Text = node.Delimiters; + + noEscBox.Checked = node.NoEscapeSequences; + igcaseBox.Checked = node.IgnoreCase; + } + + public override bool ValidateSettings() + { + if (nameBox.Text == "") { + ValidationMessage(ResourceService.GetString("Dialog.HighlightingEditor.RuleSet.NameEmpty")); + return false; + } + + return true; + } + + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs new file mode 100644 index 0000000000..321e1490b2 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/RuleSetsNode.cs @@ -0,0 +1,112 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class RuleSetsNode : AbstractNode + { + public RuleSetsNode(XmlElement el) + { + Text = ResNodeName("RuleSets"); + + panel = new RuleSetsOptionPanel(this); + if (el == null) return; + + XmlNodeList nodes = el.GetElementsByTagName("RuleSet"); + + foreach (XmlElement element in nodes) { + Nodes.Add(new RuleSetNode(element)); + } + + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + string ret = "\t\n"; + foreach (RuleSetNode node in Nodes) { + ret += node.ToXml(); + } + ret += "\t\n\n"; + return ret; + } + } + + class RuleSetsOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.Button addBtn; + private System.Windows.Forms.ListView listView; + private System.Windows.Forms.Button removeBtn; + + public RuleSetsOptionPanel(RuleSetsNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.RuleSets.xfrm")); + + addBtn = (Button)ControlDictionary["addBtn"]; + addBtn.Click += new EventHandler(addClick); + removeBtn = (Button)ControlDictionary["removeBtn"]; + removeBtn.Click += new EventHandler(removeClick); + + listView = (ListView)ControlDictionary["listView"]; + } + + public override void StoreSettings() + { + } + + public override void LoadSettings() + { + RuleSetsNode node = (RuleSetsNode)parent; + listView.Items.Clear(); + + foreach (RuleSetNode rn in node.Nodes) { + if (rn.Name == "") continue; + ListViewItem lv = new ListViewItem(rn.Name); + lv.Tag = rn; + listView.Items.Add(lv); + } + } + + void addClick(object sender, EventArgs e) + { + using (InputBox box = new InputBox()) { + box.Label.Text = ResourceService.GetString("Dialog.HighlightingEditor.RuleSets.EnterName"); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + if (box.TextBox.Text == "") return; + foreach (ListViewItem item in listView.Items) { + if (item.Text == box.TextBox.Text) + return; + } + + RuleSetNode rsn = new RuleSetNode(box.TextBox.Text, "&<>~!@%^*()-+=|\\#/{}[]:;\"' , .?", "", false, false); + ListViewItem lv = new ListViewItem(box.TextBox.Text); + lv.Tag = rsn; + parent.Nodes.Add(rsn); + listView.Items.Add(lv); + } + } + + void removeClick(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + ((TreeNode)listView.SelectedItems[0].Tag).Remove(); + listView.SelectedItems[0].Remove(); + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs new file mode 100644 index 0000000000..9c461e2369 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SchemeNode.cs @@ -0,0 +1,141 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Collections; +using System.Xml; +using System.Xml.Schema; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class SchemeNode : AbstractNode + { + string name; + string[] extensions; + + public string[] Extensions { + get { + return extensions; + } + set { + extensions = value; + } + } + + public string Name { + get { + return name; + } + set { + name = value; + } + } + + EnvironmentNode envNode; + DigitsNode digitsNode; + PropertiesNode propNode; + RuleSetsNode rulesetsNode; + + string content; + + public string Content { + get { + return content; + } + } + + public SchemeNode(XmlElement el, bool readChildren) + { + content = el.OuterXml; + + name = el.Attributes["name"].InnerText; + + if (el.Attributes["extensions"] != null) { + extensions = el.Attributes["extensions"].InnerText.Split('|'); + } + + UpdateNodeText(); + + panel = new SchemeOptionPanel(this); + + if (!readChildren) return; + + envNode = new EnvironmentNode(el["Environment"]); + digitsNode = new DigitsNode(el["Digits"]); + propNode = new PropertiesNode(el["Properties"]); + rulesetsNode = new RuleSetsNode(el); + + Nodes.Add(envNode); + Nodes.Add(digitsNode); + Nodes.Add(propNode); + Nodes.Add(rulesetsNode); + } + + public override void UpdateNodeText() + { + Text = name; + } + + public override string ToXml() + { + string str = + "\n" + + "\n\n" + + "\n\n"; + + str += envNode.ToXml(); + str += propNode.ToXml(); + str += digitsNode.ToXml(); + str += rulesetsNode.ToXml(); + + str += + "\n"; + + return str; + + } + } + + class SchemeOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.TextBox extBox; + private System.Windows.Forms.TextBox nameBox; + + public SchemeOptionPanel(SchemeNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Scheme.xfrm")); + nameBox = (TextBox)ControlDictionary["nameBox"]; + extBox = (TextBox)ControlDictionary["extBox"]; + } + + public override void StoreSettings() + { + SchemeNode node = (SchemeNode)parent; + node.Name = nameBox.Text; + node.Extensions = extBox.Text.Split(';'); + } + + public override void LoadSettings() + { + SchemeNode node = (SchemeNode)parent; + nameBox.Text = node.Name; + extBox.Text = String.Join(";", node.Extensions); + } + + public override bool ValidateSettings() + { + if (nameBox.Text == "") { + ValidationMessage("${res:Dialog.HighlightingEditor.Scheme.NameEmpty}"); + return false; + } + + return true; + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs new file mode 100644 index 0000000000..8c10e9c1ea --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs @@ -0,0 +1,354 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class SpanNode : AbstractNode + { + bool stopEOL; + EditorHighlightColor color; + EditorHighlightColor beginColor = null; + EditorHighlightColor endColor = null; + string begin = ""; + string end = ""; + string name = ""; + string rule = ""; + bool noEscapeSequences = false; + + public SpanNode(XmlElement el) + { + Text = ResNodeName("Span"); + + panel = new SpanOptionPanel(this); + + if (el == null) return; + + color = new EditorHighlightColor(el); + + if (el.Attributes["rule"] != null) { + rule = el.Attributes["rule"].InnerText; + } + + if (el.Attributes["noescapesequences"] != null) { + noEscapeSequences = Boolean.Parse(el.Attributes["noescapesequences"].InnerText); + } + + name = el.Attributes["name"].InnerText; + stopEOL = Boolean.Parse(el.Attributes["stopateol"].InnerText); + begin = el["Begin"].InnerText; + beginColor = new EditorHighlightColor(el["Begin"]); + + if (el["End"] != null) { + end = el["End"].InnerText; + endColor = new EditorHighlightColor(el["End"]); + } + + UpdateNodeText(); + + } + + public override string ToXml() + { + string ret = ""; + ret = "\t\t\t\n"; + + if (end != "") { + ret += "\t\t\t\t\n"; + } + ret += "\t\t\t\n\n"; + return ret; + } + + public SpanNode(string Name) + { + name = Name; + color = new EditorHighlightColor(); + UpdateNodeText(); + + panel = new SpanOptionPanel(this); + } + + public override void UpdateNodeText() + { + if (name != "") { Text = name; return; } + + if (end == "" && stopEOL) { + Text = begin + " to EOL"; + } else { + Text = begin + " to " + end; + } + } + + public bool StopEOL { + get { + return stopEOL; + } + set { + stopEOL = value; + } + } + + public EditorHighlightColor Color { + get { + return color; + } + set { + color = value; + } + } + + public EditorHighlightColor BeginColor { + get { + return beginColor; + } + set { + beginColor = value; + } + } + + public EditorHighlightColor EndColor { + get { + return endColor; + } + set { + endColor = value; + } + } + + public string Begin { + get { + return begin; + } + set { + begin = value; + } + } + + public string End { + get { + return end; + } + set { + end = value; + } + } + + public string Name { + get { + return name; + } + set { + name = value; + } + } + + public string Rule { + get { + return rule; + } + set { + rule = value; + } + } + + public bool NoEscapeSequences { + get { + return noEscapeSequences; + } + set { + noEscapeSequences = value; + } + } + + } + + class SpanOptionPanel : NodeOptionPanel { + + private System.Windows.Forms.TextBox nameBox; + private System.Windows.Forms.TextBox beginBox; + private System.Windows.Forms.TextBox endBox; + private System.Windows.Forms.ComboBox ruleBox; + private System.Windows.Forms.CheckBox useBegin; + private System.Windows.Forms.CheckBox useEnd; + private System.Windows.Forms.Button chgBegin; + private System.Windows.Forms.Button chgEnd; + private System.Windows.Forms.Button chgCont; + private System.Windows.Forms.Label samBegin; + private System.Windows.Forms.Label samEnd; + private System.Windows.Forms.Label samCont; + private System.Windows.Forms.CheckBox noEscBox; + private System.Windows.Forms.CheckBox stopEolBox; + + public SpanOptionPanel(SpanNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Span.xfrm")); + nameBox = (TextBox)ControlDictionary["nameBox"]; + beginBox = (TextBox)ControlDictionary["beginBox"]; + endBox = (TextBox)ControlDictionary["endBox"]; + ruleBox = (ComboBox)ControlDictionary["ruleBox"]; + + useBegin = (CheckBox)ControlDictionary["useBegin"]; + useEnd = (CheckBox)ControlDictionary["useEnd"]; + + chgBegin = (Button)ControlDictionary["chgBegin"]; + chgEnd = (Button)ControlDictionary["chgEnd"]; + chgCont = (Button)ControlDictionary["chgCont"]; + + samBegin = (Label)ControlDictionary["samBegin"]; + samEnd = (Label)ControlDictionary["samEnd"]; + samCont = (Label)ControlDictionary["samCont"]; + + stopEolBox = (CheckBox)ControlDictionary["stopEolBox"]; + noEscBox = (CheckBox)ControlDictionary["noEscBox"]; + + this.chgBegin.Click += new EventHandler(chgBeginClick); + this.chgCont.Click += new EventHandler(chgContClick); + this.chgEnd.Click += new EventHandler(chgEndClick); + + this.useBegin.CheckedChanged += new EventHandler(CheckedChanged); + this.useEnd.CheckedChanged += new EventHandler(CheckedChanged); + } + + EditorHighlightColor color; + EditorHighlightColor beginColor; + EditorHighlightColor endColor; + + public override void StoreSettings() + { + SpanNode node = (SpanNode)parent; + + node.Name = nameBox.Text; + node.Begin = beginBox.Text; + node.End = endBox.Text; + node.StopEOL = stopEolBox.Checked; + node.NoEscapeSequences = noEscBox.Checked; + node.Rule = ruleBox.Text; + + node.Color = color; + + if (useBegin.Checked) { + node.BeginColor = beginColor; + } else { + node.BeginColor = new EditorHighlightColor(true); + } + + if (useEnd.Checked) { + node.EndColor = endColor; + } else { + node.EndColor = new EditorHighlightColor(true); + } + } + + public override void LoadSettings() + { + SpanNode node = (SpanNode)parent; + + try { + ruleBox.Items.Clear(); + foreach(RuleSetNode rn in node.Parent.Parent.Parent.Nodes) { // list rule sets + if (!rn.IsRoot) ruleBox.Items.Add(rn.Text); + } + } catch {} + + Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); + ////samBegin.Font = samEnd.Font = samCont.Font = ParseFont(properties.Get("DefaultFont", new Font("Courier New", 10).ToString())); + samBegin.Font = samEnd.Font = samCont.Font = FontContainer.DefaultFont; + + nameBox.Text = node.Name; + ruleBox.Text = node.Rule; + beginBox.Text = node.Begin; + endBox.Text = node.End; + stopEolBox.Checked = node.StopEOL; + noEscBox.Checked = node.NoEscapeSequences; + + color = node.Color; + beginColor = node.BeginColor; + endColor = node.EndColor; + + if (beginColor != null) { + if (!beginColor.NoColor) useBegin.Checked = true; + } + if (endColor != null) { + if (!endColor.NoColor) useEnd.Checked = true; + } + + PreviewUpdate(samBegin, beginColor); + PreviewUpdate(samEnd, endColor); + PreviewUpdate(samCont, color); + CheckedChanged(null, null); + } + + public override bool ValidateSettings() + { + if (nameBox.Text == "") { + ValidationMessage(ResourceService.GetString("Dialog.HighlightingEditor.Span.NameEmpty")); + return false; + } + if (beginBox.Text == "") { + ValidationMessage(ResourceService.GetString("Dialog.HighlightingEditor.Span.BeginEmpty")); + return false; + } + + return true; + } + + void chgBeginClick(object sender, EventArgs e) + { + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(beginColor)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + beginColor = dlg.Color; + PreviewUpdate(samBegin, beginColor); + } + } + } + + void chgEndClick(object sender, EventArgs e) + { + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(endColor)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + endColor = dlg.Color; + PreviewUpdate(samEnd, endColor); + } + } + } + + void chgContClick(object sender, EventArgs e) + { + using (EditHighlightingColorDialog dlg = new EditHighlightingColorDialog(color)) { + if (dlg.ShowDialog(this) == DialogResult.OK) { + color = dlg.Color; + PreviewUpdate(samCont, color); + } + } + } + + void CheckedChanged(object sender, EventArgs e) + { + chgEnd.Enabled = useEnd.Checked; + chgBegin.Enabled = useBegin.Checked; + } + } +} diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs new file mode 100644 index 0000000000..485fb9d0e8 --- /dev/null +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpansNode.cs @@ -0,0 +1,106 @@ +// +// +// +// +// +// + +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Xml; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes +{ + class SpansNode : AbstractNode + { + public SpansNode(XmlElement el) + { + Text = ResNodeName("Spans"); + + panel = new SpansOptionPanel(this); + if (el == null) return; + + XmlNodeList nodes = el.GetElementsByTagName("Span"); + foreach (XmlElement el2 in nodes) { + Nodes.Add(new SpanNode(el2)); + } + + } + + public override void UpdateNodeText() + { + } + + public override string ToXml() + { + string ret = ""; + foreach (SpanNode node in Nodes) { + ret += node.ToXml(); + } + return ret; + } + } + + class SpansOptionPanel : NodeOptionPanel + { + private System.Windows.Forms.ListView listView; + private System.Windows.Forms.Button addBtn; + private System.Windows.Forms.Button removeBtn; + + public SpansOptionPanel(SpansNode parent) : base(parent) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.Spans.xfrm")); + + addBtn = (Button)ControlDictionary["addBtn"]; + addBtn.Click += new EventHandler(addClick); + removeBtn = (Button)ControlDictionary["removeBtn"]; + removeBtn.Click += new EventHandler(removeClick); + + listView = (ListView)ControlDictionary["listView"]; + } + + public override void StoreSettings() + { + } + + public override void LoadSettings() + { + SpansNode node = (SpansNode)parent; + listView.Items.Clear(); + + foreach (SpanNode rn in node.Nodes) { + ListViewItem lv = new ListViewItem(rn.Text); + lv.Tag = rn; + listView.Items.Add(lv); + } + } + + void addClick(object sender, EventArgs e) + { + using (InputBox box = new InputBox()) { + box.Label.Text = ResourceService.GetString("Dialog.HighlightingEditor.Spans.EnterName"); + if (box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.Cancel) return; + + if (box.TextBox.Text == "") return; + + SpanNode rsn = new SpanNode(box.TextBox.Text); + ListViewItem lv = new ListViewItem(rsn.Text); + lv.Tag = rsn; + parent.Nodes.Add(rsn); + listView.Items.Add(lv); + } + } + + void removeClick(object sender, EventArgs e) + { + if (listView.SelectedItems.Count != 1) return; + + ((TreeNode)listView.SelectedItems[0].Tag).Remove(); + listView.SelectedItems[0].Remove(); + } + } +} diff --git a/src/AddIns/Misc/NUnitPad/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/NUnitPad/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..205aa8a9ad --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/NUnitPad/Project/NUnitPad.csproj b/src/AddIns/Misc/NUnitPad/Project/NUnitPad.csproj new file mode 100644 index 0000000000..0a31704f78 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/NUnitPad.csproj @@ -0,0 +1,59 @@ + + + Debug + AnyCPU + 8.0.41115 + 2.0 + {A82F44D7-F336-4AD6-B2EE-D2C082D094EC} + ICSharpCode.NUnitPad + NUnitPad + Library + 4 + False + False + OnSuccessfulBuild + + + True + True + False + True + ..\..\..\..\..\AddIns\AddIns\Misc\NUnitPad\ + False + + + True + True + False + True + ..\..\..\..\..\AddIns\AddIns\Misc\NUnitPad\ + False + + + + + + + + + ..\..\..\..\..\bin\ICSharpCode.Core.dll + False + + + + + + + UserControl + + + + + + + {2748AD25-9C63-4E12-877B-4DCE96FBED54} + ICSharpCode.SharpDevelop + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/NUnitPad/Project/NUnitPad.csproj.user b/src/AddIns/Misc/NUnitPad/Project/NUnitPad.csproj.user new file mode 100644 index 0000000000..b895c1ffa7 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/NUnitPad.csproj.user @@ -0,0 +1,13 @@ + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + ..\..\..\..\..\bin\SharpDevelop.exe + + + 8.0.41115 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/src/AddIns/Misc/NUnitPad/Project/Resources/NUnitPad.addin b/src/AddIns/Misc/NUnitPad/Project/Resources/NUnitPad.addin new file mode 100644 index 0000000000..ddc33f4505 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/Resources/NUnitPad.addin @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AddIns/Misc/NUnitPad/Project/Src/Commands/MenuCommands.cs b/src/AddIns/Misc/NUnitPad/Project/Src/Commands/MenuCommands.cs new file mode 100644 index 0000000000..3624a7a631 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/Src/Commands/MenuCommands.cs @@ -0,0 +1,27 @@ +// +// +// +// +// +// + +using System; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop; + +namespace ICSharpCode.NUnitPad +{ + public class RunTestsInProject : AbstractMenuCommand + { + public override void Run() + { + PadDescriptor nunitPad = WorkbenchSingleton.Workbench.GetPad(typeof(NUnitPadContent)); + if (nunitPad != null) { + nunitPad.BringPadToFront(); + ((NUnitPadContent)nunitPad.PadContent).RunTests(); + } + } + } +} diff --git a/src/AddIns/Misc/NUnitPad/Project/Src/Commands/TestTreeViewContextMenuCommands.cs b/src/AddIns/Misc/NUnitPad/Project/Src/Commands/TestTreeViewContextMenuCommands.cs new file mode 100644 index 0000000000..055db89f86 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/Src/Commands/TestTreeViewContextMenuCommands.cs @@ -0,0 +1,55 @@ +// +// +// +// +// +// +using System; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; + +namespace ICSharpCode.NUnitPad +{ + /// + /// Description of RunTestsCommand + /// + public class RunTestsCommand : AbstractMenuCommand + { + /// + /// Creates a new RunTestsCommand + /// + public RunTestsCommand() + { + } + + /// + /// Starts the command + /// + public override void Run() + { + ((TestTreeView)Owner).RunTests(); + } + } + /// + /// Description of GotoDefinitionCommand + /// + public class GotoDefinitionCommand : AbstractMenuCommand + { + /// + /// Creates a new GotoDefinitionCommand + /// + public GotoDefinitionCommand() + { + } + + /// + /// Starts the command + /// + public override void Run() + { + ((TestTreeView)Owner).GotoDefinition(); + } + } +} diff --git a/src/AddIns/Misc/NUnitPad/Project/Src/Gui/NUnitPadContent.cs b/src/AddIns/Misc/NUnitPad/Project/Src/Gui/NUnitPadContent.cs new file mode 100644 index 0000000000..072c9fc114 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/Src/Gui/NUnitPadContent.cs @@ -0,0 +1,213 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Threading; +using System.Windows.Forms; + +using NUnit.Core; +using NUnit.Framework; +using NUnit.Util; + +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.NUnitPad +{ + /// + /// Description of the pad content + /// + public class NUnitPadContent : AbstractPadContent + { + TestTreeView testTreeView; + Panel contentPanel; + bool autoLoadItems = false; + ArrayList testDomains = new ArrayList(); + + #region AbstractPadContent requirements + /// + /// The representing the pad + /// + public override Control Control { + get { + return contentPanel; + } + } + + /// + /// Creates a new NUnitPadContent object + /// + public NUnitPadContent() + { + testTreeView = new TestTreeView(); + testTreeView.Dock = DockStyle.Fill; + ToolStrip toolStrip = new ToolStrip(); + toolStrip.Dock = DockStyle.Top; + toolStrip.Stretch = true; + toolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + + ToolStripButton refreshItem = new ToolStripButton(); + refreshItem.ToolTipText = StringParser.Parse("${res:NUnitPad.NUnitPadContent.RefreshItem}"); + refreshItem.Image = IconService.GetBitmap("Icons.16x16.BrowserRefresh"); + refreshItem.Click += new EventHandler(RefreshItemClick); + toolStrip.Items.Add(refreshItem); + + ToolStripButton cancelItem = new ToolStripButton(); + cancelItem.ToolTipText = StringParser.Parse("${res:NUnitPad.NUnitPadContent.CancelItem}"); + cancelItem.Image = IconService.GetBitmap("Icons.16x16.BrowserCancel"); + cancelItem.Click += new EventHandler(CancelItemClick); + + toolStrip.Items.Add(cancelItem); + + toolStrip.Items.Add(new ToolStripSeparator()); + + ToolStripButton referenceItem = new ToolStripButton(); + referenceItem.ToolTipText = StringParser.Parse("${res:NUnitPad.NUnitPadContent.ReferenceItem}"); + referenceItem.Image = IconService.GetBitmap("Icons.16x16.Reference"); + referenceItem.Click += new EventHandler(AddNUnitReference); + toolStrip.Items.Add(referenceItem); + + toolStrip.Items.Add(new ToolStripSeparator()); + + ToolStripButton runItem = new ToolStripButton(); + runItem.ToolTipText = StringParser.Parse("${res:NUnitPad.NUnitPadContent.RunItem}"); + runItem.Image = IconService.GetBitmap("Icons.16x16.RunProgramIcon"); + runItem.Click += new EventHandler(RunItemClick); + toolStrip.Items.Add(runItem); + + contentPanel = new Panel(); + contentPanel.Controls.Add(testTreeView); + contentPanel.Controls.Add(toolStrip); + + ProjectService.SolutionLoaded += new SolutionEventHandler(CombineEventHandler); + ProjectService.SolutionClosed += new EventHandler(ProjectServiceCombineClosed); + ProjectService.StartBuild += new EventHandler(ProjectServiceStartBuild); + ProjectService.EndBuild += new EventHandler(ProjectServiceEndBuild); + testTreeView.SetAutoLoadState(autoLoadItems); + } + + /// + /// Refreshes the pad + /// + public override void RedrawContent() + { + } + + /// + /// Cleans up all used resources + /// + public override void Dispose() + { + base.Dispose(); + UnloadAppDomains(); + testTreeView.Dispose(); + contentPanel.Dispose(); + ProjectService.StartBuild -= new EventHandler(ProjectServiceStartBuild); + ProjectService.EndBuild -= new EventHandler(ProjectServiceEndBuild); + } + #endregion + + void ProjectServiceStartBuild(object sender, EventArgs e) + { + } + + void CombineEventHandler(object sender, SolutionEventArgs e) + { + if (autoLoadItems) { + RefreshProjectAssemblies(); + } + } + + void ProjectServiceEndBuild(object sender, EventArgs e) + { + if (autoLoadItems) { + testTreeView.Invoke(new ThreadStart(RefreshProjectAssemblies)); + } + } + + void AddNUnitReference(object sender, EventArgs e) + { +// TODO: Add NUnit reference. +// IProject project = ProjectService.CurrentProject; +// if (project != null) { +// foreach (ProjectReference reference in project.ProjectReferences) { +// if (reference.ReferenceType == ReferenceType.Gac && reference.Reference.ToLower().StartsWith("nunit.framework")) { +// return; +// } +// } +// projectService.AddReferenceToProject(project, new ProjectReference(ReferenceType.Gac, "nunit.framework")); +// } + } + + void RunItemClick(object sender, EventArgs e) + { + RunTests(); + } + + void RefreshItemClick(object sender, EventArgs e) + { + autoLoadItems = true; + RefreshProjectAssemblies(); + } + + void CancelItemClick(object sender, EventArgs e) + { + autoLoadItems = false; + UnloadAppDomains(); + testTreeView.SetAutoLoadState(autoLoadItems); + } + + void ProjectServiceCombineClosed(object sender, EventArgs e) + { + if (testDomains.Count > 0) { + UnloadAppDomains(); + } + } + + void UnloadAppDomains() + { + foreach (TestDomain domain in testDomains) { + try { + domain.Unload(); + } catch (Exception) {} + } + testDomains.Clear(); + testTreeView.ClearTests(); + } + + public void RunTests() + { + if (!autoLoadItems) { + autoLoadItems = true; + RefreshProjectAssemblies(); + } + testTreeView.RunTests(); + } + + public void RefreshProjectAssemblies() + { + UnloadAppDomains(); + + foreach (IProject project in ProjectService.OpenSolution.Projects) { + string outputAssembly = project.OutputAssemblyFullPath; + TestDomain testDomain = new TestDomain(); + try { + Test testsFromAssembly = testDomain.Load(outputAssembly); + testTreeView.PrintTests(outputAssembly, testsFromAssembly); + testDomains.Add(testDomain); + } catch (Exception e) { + testDomain.Unload(); + Console.WriteLine(e); + testTreeView.PrintTestErrors(outputAssembly); + } + + } + } + } +} diff --git a/src/AddIns/Misc/NUnitPad/Project/Src/Gui/TestTreeView.cs b/src/AddIns/Misc/NUnitPad/Project/Src/Gui/TestTreeView.cs new file mode 100644 index 0000000000..d47623ef52 --- /dev/null +++ b/src/AddIns/Misc/NUnitPad/Project/Src/Gui/TestTreeView.cs @@ -0,0 +1,382 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Windows.Forms; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; + +using NUnit.Core; +using NUnit.Framework; + +namespace ICSharpCode.NUnitPad +{ + /// + /// Description of TestTreeView. + /// + public class TestTreeView : System.Windows.Forms.UserControl, EventListener, IOwnerState + { + const string ContextMenuAddInTreePath = "/NUnitPad/TestTreeView/ContextMenu"; + + [Flags] + public enum TestTreeViewState { + Nothing = 0, + SourceCodeItemSelected = 1, + TestItemSelected = 2, + } + + protected TestTreeViewState internalState = TestTreeViewState.Nothing; + + public System.Enum InternalState { + get { + return internalState; + } + } + + TreeView treeView; + Hashtable treeNodeHash = new Hashtable(); + MessageViewCategory testRunnerCategory; + + + bool IsSourceCodeItemSelected { + get { + if (treeView.SelectedNode == null) { + return false; + } + ITest test = treeView.SelectedNode.Tag as ITest; + if (test != null) { + + Position position = ParserService.CurrentProjectContent.GetPosition(test.FullName.Replace('+', '.')); + return position != null && position.Cu != null; + } + return false; + } + } + + bool IsTestItemSelected { + get { + if (treeView.SelectedNode == null) { + return false; + } + ITest test = treeView.SelectedNode.Tag as ITest; + return test != null; + } + } + + protected override void Dispose(bool disposing) + { + if (disposing) { + treeView.Dispose(); + } + base.Dispose(disposing); + } + + public TestTreeView() + { + + ImageList imageList = new ImageList(); + imageList.ColorDepth = ColorDepth.Depth32Bit; + imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TestRunner.Gray")); + imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TestRunner.Green")); + imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TestRunner.Yellow")); + imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TestRunner.Red")); + imageList.Images.Add(IconService.GetBitmap("Icons.16x16.AboutIcon")); + imageList.Images.Add(IconService.GetBitmap("Icons.16x16.Error")); + + this.treeView = new TreeView(); + treeView.ImageList = imageList; + treeView.Dock = DockStyle.Fill; + treeView.DoubleClick += new EventHandler(ActivateItem); + treeView.KeyPress += new KeyPressEventHandler(TestTreeViewKeyPress); + treeView.MouseDown += new MouseEventHandler(TreeViewMouseDown); + treeView.HideSelection = false; + Controls.Add(treeView); + treeView.ContextMenuStrip = MenuService.CreateContextMenu(this, ContextMenuAddInTreePath); + } + void TreeViewMouseDown(object sender, MouseEventArgs e) + { + TreeNode node = treeView.GetNodeAt(e.X, e.Y); + + treeView.SelectedNode = node; + + internalState = TestTreeViewState.Nothing; + if (IsSourceCodeItemSelected) { + internalState |= TestTreeViewState.SourceCodeItemSelected; + } + + if (IsTestItemSelected) { + internalState |= TestTreeViewState.TestItemSelected; + } + } + + public void SetAutoLoadState(bool state) + { + if (!state) { + ClearTests(); + + TreeNode noAutoLoad = new TreeNode(StringParser.Parse("${res:NUnitPad.NUnitPadContent.TestTreeView.ClickOnRunInformationNode}")); + noAutoLoad.ImageIndex = noAutoLoad.SelectedImageIndex = 4; + treeView.Nodes.Add(noAutoLoad); + } + } + public void ClearTests() + { + if (!treeView.IsDisposed) { + treeView.Nodes.Clear(); + } + } + + public void PrintTestErrors(string assembly) + { + TreeNode assemblyNode = new TreeNode(Path.GetFileName(assembly)); + + TreeNode failedNode = new TreeNode(StringParser.Parse("${res:NUnitPad.NUnitPadContent.TestTreeView.LoadingErrorNode}")); + failedNode.ImageIndex = failedNode.SelectedImageIndex = 5; + assemblyNode.Nodes.Add(failedNode); + + treeView.Nodes.Add(assemblyNode); + } + + public void PrintTests(string assembly, Test test) + { + TreeNode assemblyNode = new TreeNode(Path.GetFileName(assembly)); + assemblyNode.Tag = test; + treeView.Nodes.Add(assemblyNode); + if (test != null) { + AddTests(assemblyNode, test); + } + assemblyNode.Expand(); + } + + public void AddTests(TreeNode node, ITest test) + { + foreach (ITest childTest in test.Tests) { + TreeNode newNode = new TreeNode(childTest.Name); + treeNodeHash[childTest.UniqueName] = newNode; + newNode.ImageIndex = newNode.SelectedImageIndex = 0; + newNode.Tag = childTest; + if (childTest.IsSuite) { + AddTests(newNode, childTest); + node.Expand(); + } + node.Nodes.Add(newNode); + } + } + + public void GotoDefinition() + { + if (treeView.SelectedNode != null) { + ITest test = treeView.SelectedNode.Tag as ITest; + if (test != null) { + + Position position = ParserService.CurrentProjectContent.GetPosition(test.FullName.Replace('+', '.')); + + if (position != null && position.Cu != null) { + + FileService.JumpToFilePosition(position.Cu.FileName, Math.Max(0, position.Line - 1), Math.Max(0, position.Column - 1)); + } + } + } + } + + public void RunTests() + { + ResetNodeIcons(treeView.Nodes); + + if (testRunnerCategory == null) { + testRunnerCategory = new MessageViewCategory("NUnit"); + CompilerMessageView cmv = (CompilerMessageView)WorkbenchSingleton.Workbench.GetPad(typeof(CompilerMessageView)).PadContent; + cmv.AddCategory(testRunnerCategory); + } else { + testRunnerCategory.ClearText(); + } + + TaskService.Tasks.Clear(); + + TreeNode selectedNode = treeView.SelectedNode; + + if (selectedNode != null) { + Test test = selectedNode.Tag as Test; + if (test != null) { + test.Run(this); + } else { + selectedNode.ImageIndex = selectedNode.SelectedImageIndex = 2; + } + } else { + foreach (TreeNode node in treeView.Nodes) { + Test test = node.Tag as Test; + if (test != null) { + test.Run(this); + } else { + node.ImageIndex = node.SelectedImageIndex = 2; + } + } + } + + // If any tasks bring task view to front. + if (TaskService.Tasks.Count > 0) { + IWorkbench Workbench = ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.Workbench; + PadDescriptor padDescriptor = Workbench.GetPad(typeof(OpenTaskView)); + + if (padDescriptor != null) { + padDescriptor.BringPadToFront(); + } + } + + treeView.Focus(); + } + + void ResetNodeIcons(ICollection col) + { + foreach (TreeNode node in col) { + if (node.ImageIndex <= 3) { + node.ImageIndex = node.SelectedImageIndex = 0; + } + ResetNodeIcons(node.Nodes); + } + } + + void SetResultIcon(TestResult testResult) + { + TreeNode node = (TreeNode)treeNodeHash[testResult.Test.UniqueName]; + if (node != null) { + if (testResult.IsSuccess && testResult.Executed) { + node.ImageIndex = node.SelectedImageIndex = 1; + } else if (testResult.IsFailure) { + node.ImageIndex = node.SelectedImageIndex = 3; + } else { + node.ImageIndex = node.SelectedImageIndex = 2; + } + if (node.Parent != null || node.Parent.Parent == null) { + node.Parent.ImageIndex = node.Parent.SelectedImageIndex = node.ImageIndex; + } + } + } + + + void ActivateItem(object sender, EventArgs e) + { + GotoDefinition(); + } + + void TestTreeViewKeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\r') { + GotoDefinition(); + } else if (e.KeyChar == ' ') { + RunTests(); + } + } + + #region NUnit.Core.EventListener interface implementation + public void RunStarted(NUnit.Core.Test[] tests) + { + + } + public void RunFinished(NUnit.Core.TestResult[] tests) + { + + } + public void RunFinished(Exception exception) + { + + } + public void UnhandledException(Exception exception) + { + + } + + public void SuiteStarted(NUnit.Core.TestSuite suite) + { +// testRunnerCategory.AppendText(suite.FullName + " started.\n"); + } + + public void SuiteFinished(NUnit.Core.TestSuiteResult result) + { + SetResultIcon(result); +// testRunnerCategory.AppendText(result.Test.FullName + " finished.\n"); + } + + public void TestStarted(NUnit.Core.TestCase testCase) + { +// testRunnerCategory.AppendText(testCase.FullName + " started.\n"); + } + + public void TestFinished(NUnit.Core.TestCaseResult result) + { + + if (!result.IsSuccess) { + + string outputMessage = StringParser.Parse("${res:NUnitPad.NUnitPadContent.TestTreeView.TestFailedMessage}", new string[,] { + {"TestCase", result.Test.FullName}, + {"Message", result.Message.Replace("\t", " ").Trim()} + } + ); + + testRunnerCategory.AppendText(outputMessage + Environment.NewLine); + testRunnerCategory.AppendText(result.Description + Environment.NewLine); + testRunnerCategory.AppendText(result.StackTrace + Environment.NewLine); +// if (result.StackTrace != null ) { +// Console.WriteLine("result.StackTrace=" + result.StackTrace); +// } +// else { +// Console.WriteLine("result.StackTrace=null"); +// } + + FileLineReference LineRef = OutputTextLineParser.GetNUnitOutputFileLineReference(result.StackTrace, true); + if (LineRef != null) { +// Console.WriteLine("Adding NUnit error task."); + Task Task = new Task(Path.GetFullPath(LineRef.FileName), + outputMessage, + LineRef.Column, + LineRef.Line, + TaskType.Error); + + TaskService.Tasks.Add(Task); + TaskService.NotifyTaskChange(); + } + } else if (!result.Executed) { + + string outputMessage = StringParser.Parse("${res:NUnitPad.NUnitPadContent.TestTreeView.TestNotExecutedMessage}", new string[,] { + {"TestCase", result.Test.FullName} + } + ); + + testRunnerCategory.AppendText(outputMessage + Environment.NewLine); + testRunnerCategory.AppendText(result.Message + Environment.NewLine); + testRunnerCategory.AppendText(result.Description + Environment.NewLine); + testRunnerCategory.AppendText(result.StackTrace + Environment.NewLine); +// if (result.StackTrace != null ) { +// Console.WriteLine("result.StackTrace=" + result.StackTrace); +// } +// else { +// Console.WriteLine("result.StackTrace=null"); +// } + + FileLineReference LineRef = OutputTextLineParser.GetNUnitOutputFileLineReference(result.StackTrace, true); + if (LineRef != null) { + +// Console.WriteLine("Adding NUnit warning task."); + Task Task = new Task(Path.GetFullPath(LineRef.FileName), + outputMessage, + LineRef.Column, + LineRef.Line, + TaskType.Warning); + + TaskService.Tasks.Add(Task); + TaskService.NotifyTaskChange(); + } + } + + SetResultIcon(result); + } + #endregion + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/AssemblyInfo.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/AssemblyInfo.cs new file mode 100644 index 0000000000..8cf1fc53bd --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Security; +using System.Security.Permissions; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. +[assembly:UIPermissionAttribute(SecurityAction.RequestMinimum, Window = UIPermissionWindow.AllWindows)] + +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Commands/ExportProjectCommand.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Commands/ExportProjectCommand.cs new file mode 100644 index 0000000000..54126803e4 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Commands/ExportProjectCommand.cs @@ -0,0 +1,64 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Windows.Forms; +using System.Xml.Xsl; + +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +using MSjogren.GacTool.FusionNative; +using ICSharpCode.SharpDevelop.Commands; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Commands +{ + public class ExportProjectCommand : AbstractMenuCommand + { + public override void Run() + { + using (ExportProjectDialog exportProjectDialog = new ExportProjectDialog("Visual Studio.NET 2003 Solutions")) { + exportProjectDialog.Owner = (Form)WorkbenchSingleton.Workbench; + exportProjectDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + } + } + } + + public class ExportProjectToCSharpCommand : AbstractMenuCommand + { + public override void Run() + { + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + + using (ExportProjectDialog exportProjectDialog = new ExportProjectDialog("Convert VB.NET to C#", projectService.CurrentSelectedProject != null ? projectService.CurrentSelectedProject.Name : null)) { + exportProjectDialog.Owner = (Form)WorkbenchSingleton.Workbench; + exportProjectDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + } + } + } + + public class ExportProjectToVBNetCommand : AbstractMenuCommand + { + public override void Run() + { + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + + using (ExportProjectDialog exportProjectDialog = new ExportProjectDialog("Convert C# to VB.NET", projectService.CurrentSelectedProject != null ? projectService.CurrentSelectedProject.Name : null)) { + exportProjectDialog.Owner = (Form)WorkbenchSingleton.Workbench; + exportProjectDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + } + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Commands/ImportProjectCommand.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Commands/ImportProjectCommand.cs new file mode 100644 index 0000000000..80d4652fb6 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Commands/ImportProjectCommand.cs @@ -0,0 +1,39 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Windows.Forms; +using System.Xml.Xsl; + +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +using MSjogren.GacTool.FusionNative; +using ICSharpCode.SharpDevelop.Commands; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Commands +{ + public class ImportProjectCommand : AbstractMenuCommand + { + public override void Run() + { + using (ImportProjectDialog importProjectDialog = new ImportProjectDialog()) { + importProjectDialog.Owner = (Form)WorkbenchSingleton.Workbench; + importProjectDialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + } + } + } +} + diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/AbstractInputConverter.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/AbstractInputConverter.cs new file mode 100644 index 0000000000..c322dd9cfa --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/AbstractInputConverter.cs @@ -0,0 +1,25 @@ +// +// +// +// +// +// + +using System; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + public abstract class AbstractInputConverter + { + public abstract string FormatName { + get; + } + public abstract string OutputFile { + get; + } + + public abstract bool CanConvert(string fileName); + + public abstract bool Convert(string inputFile, string outputPath); + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/AbstractOutputConverter.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/AbstractOutputConverter.cs new file mode 100644 index 0000000000..1e3df87db7 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/AbstractOutputConverter.cs @@ -0,0 +1,22 @@ +// +// +// +// +// +// + +using System; +using ICSharpCode.SharpDevelop.Gui; +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + public abstract class AbstractOutputConverter + { + public abstract string FormatName { + get; + } + + public abstract void ConvertCombine(IProgressMonitor progressMonitor, string inputCombine, string outputPath); + + public abstract void ConvertProject(IProgressMonitor progressMonitor, string inputProject, string outputPath); + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/AbstractLanguageConverterOutput.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/AbstractLanguageConverterOutput.cs new file mode 100644 index 0000000000..46e0e43ef0 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/AbstractLanguageConverterOutput.cs @@ -0,0 +1,180 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Xsl; +using System.CodeDom.Compiler; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Templates; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + /// + /// Description of AbstractLanguageConverterOutput. + /// + public abstract class AbstractLanguageConverterOutput : AbstractOutputConverter + { + + protected abstract string Extension { + get; + } + public override void ConvertCombine(IProgressMonitor progressMonitor,string inputCombine, string outputPath) + { + string inputPath = Path.GetFullPath(Path.GetDirectoryName(inputCombine)); + + Combine combine = new Combine(); + combine.LoadCombine(inputCombine); + + Combine outputCombine = new Combine(); + ArrayList projects = Combine.GetAllProjects(combine); + if (progressMonitor != null) { + progressMonitor.BeginTask("Convert", projects.Count + 1); + } + foreach (ProjectCombineEntry project in projects) { + string projectFileName = Path.GetFullPath(Path.Combine(inputPath, project.Filename)); + string relativeFileName = projectFileName.Substring(inputPath.Length + 1); + + string output = TranslateProject(null, projectFileName, Path.Combine(outputPath, Path.GetDirectoryName(relativeFileName))); + outputCombine.AddEntry(output); + if (progressMonitor != null) { + progressMonitor.Worked(1); + } + } + + outputCombine.SaveCombine(Path.Combine(outputPath, Path.GetFileName(inputCombine))); + if (progressMonitor != null) { + progressMonitor.Done();; + } + } + + public override void ConvertProject(IProgressMonitor progressMonitor,string inputProject, string outputPath) + { + TranslateProject(progressMonitor, inputProject, outputPath); + } + + + protected virtual IProject CreateProject(string outputPath, IProject originalProject) + { + return CreateProject(outputPath, originalProject, originalProject.ProjectType); + } + + protected IProject CreateProject(string outputPath, IProject originalProject, string targetLanguage) + { + LanguageBindingService languageBindingService = (LanguageBindingService)ServiceManager.Services.GetService(typeof(LanguageBindingService)); + ILanguageBinding binding = languageBindingService.GetBindingPerLanguageName(targetLanguage); + + ProjectCreateInformation info = new ProjectCreateInformation(); + info.CombinePath = outputPath; + info.ProjectBasePath = outputPath; + info.ProjectName = originalProject.Name + " converted"; + + return binding.CreateProject(info, null); + } + + bool CopyFile(string original, string newFile) + { + try { + File.Copy(original, newFile); + } catch(IOException) { + return false; + } + return true; + } + + bool SaveFile(string fileName, string content) + { + try { + if (!Directory.Exists(Path.GetDirectoryName(fileName))) { + Directory.CreateDirectory(Path.GetDirectoryName(fileName)); + } + + StreamWriter sw = new StreamWriter(fileName); + sw.Write(content); + sw.Close(); + } catch (Exception e) { + Console.WriteLine("Error while saving file : " + e); + return false; + } + return true; + } + + + protected abstract string ConvertFile(string fileName); + + string TranslateProject(IProgressMonitor progressMonitor, string inputProject, string outputPath) + { + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + IProject inProject = projectService.LoadProject(inputProject); + int len = inProject.BaseDirectory.Length; + + IProject project = CreateProject(outputPath, inProject); + if (progressMonitor != null) { + progressMonitor.BeginTask("Convert", inProject.ProjectFiles.Count + 1); + } + + foreach (ProjectFile file in inProject.ProjectFiles) { + + if (file.BuildAction == BuildAction.EmbedAsResource) { + string outFile; + + // resource files can be outside of the project path + if(file.Name.StartsWith(outputPath)) { + // Path.GetFilename can't be used because the filename can be + // a relative path that shouldn't get lost + outFile = Path.Combine(outputPath, file.Name.Substring(len + 1)); + } else { + outFile = Path.Combine(outputPath, Path.GetFileName(file.Name)); + } + + if (CopyFile(file.Name, outFile)) { + ProjectFile pf = new ProjectFile(outFile); + pf.BuildAction = BuildAction.EmbedAsResource; + project.ProjectFiles.Add(pf); + } + } else if(file.Subtype != Subtype.Directory && File.Exists(file.Name)) { + string outPut; + try { + outPut = ConvertFile(file.Name); + } catch (Exception e) { + outPut = "Conversion Error : " + e.ToString(); + } + + // Path.GetFilename can't be used because the filename can be + // a relative path that shouldn't get lost + string outFile = Path.Combine(outputPath, file.Name.Substring(len + 1)); + outFile = Path.ChangeExtension(outFile, Extension); + + if (SaveFile(outFile, outPut)) { + project.ProjectFiles.Add(new ProjectFile(outFile)); + } + } + if (progressMonitor != null) { + progressMonitor.Worked(1); + } + + } + string output = Path.Combine(outputPath, project.Name + ".prjx"); + try { + project.SaveProject(output); + } catch (Exception e) { + Console.WriteLine("Error while saving project : " + e); + return null; + } + if (progressMonitor != null) { + progressMonitor.Done();; + } + return output; + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/CSharpToVBNetLanguageConverterOutput.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/CSharpToVBNetLanguageConverterOutput.cs new file mode 100644 index 0000000000..b4a37a5e25 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/CSharpToVBNetLanguageConverterOutput.cs @@ -0,0 +1,60 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Xsl; + +using System.CodeDom.Compiler; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Templates; + +using ICSharpCode.NRefactory.PrettyPrinter; +using ICSharpCode.NRefactory.Parser; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + /// + /// Description of CSharpToVBNetLanguageConverterOutput. + /// + public class CSharpToVBNetLanguageConverterOutput : AbstractLanguageConverterOutput + { + public override string FormatName { + get { + return "Convert C# to VB.NET"; + } + } + + protected override string Extension { + get { + return ".vb"; + } + } + + protected override IProject CreateProject(string outputPath, IProject originalProject) + { + return CreateProject(outputPath, originalProject, "VBNET"); + } + + protected override string ConvertFile(string fileName) + { + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(SupportedLanguages.CSharp, new StreamReader(fileName)); + p.Parse(); + + ICSharpCode.NRefactory.PrettyPrinter.VBNetOutputVisitor vbv = new ICSharpCode.NRefactory.PrettyPrinter.VBNetOutputVisitor(); + vbv.Visit(p.CompilationUnit, null); + + return vbv.Text; + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/VBNetToCSharpLanguageConverterOutput.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/VBNetToCSharpLanguageConverterOutput.cs new file mode 100644 index 0000000000..6639adfcdd --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/LanguageConversion/VBNetToCSharpLanguageConverterOutput.cs @@ -0,0 +1,59 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Xsl; +using System.CodeDom.Compiler; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Templates; + +using ICSharpCode.NRefactory.PrettyPrinter; +using ICSharpCode.NRefactory.Parser; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + /// + /// Description of CSharpToVBNetLanguageConverterOutput. + /// + public class VBNetToCSharpLanguageConverterOutput : AbstractLanguageConverterOutput + { + public override string FormatName { + get { + return "Convert VB.NET to C#"; + } + } + + protected override string Extension { + get { + return ".cs"; + } + } + + protected override IProject CreateProject(string outputPath, IProject originalProject) + { + return CreateProject(outputPath, originalProject, "C#"); + } + + protected override string ConvertFile(string fileName) + { + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(SupportedLanguages.CSharp, new StreamReader(fileName)); + p.Parse(); + + ICSharpCode.NRefactory.PrettyPrinter.CSharpOutputVisitor vbv = new ICSharpCode.NRefactory.PrettyPrinter.CSharpOutputVisitor(); + vbv.Visit(p.CompilationUnit, null); + + return vbv.Text; + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionConverterTool.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionConverterTool.cs new file mode 100644 index 0000000000..1a4bba08d5 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionConverterTool.cs @@ -0,0 +1,341 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Security; +using System.Security.Permissions; + +using System.Windows.Forms; + +using MSjogren.GacTool.FusionNative; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Commands; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ +// [UIPermissionAttribute(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows, Unrestricted = true)] + public class SolutionConversionTool + { + public ArrayList copiedFiles = new ArrayList(); + + Hashtable GacReferences = new Hashtable(); + string projectTitle; + string projectInputDirectory; + string projectOutputDirectory; + + void WriteLine(string str) + { + Console.WriteLine(str); +// +// TaskService.CompilerOutput += str + "\n"; +// TaskService.NotifyTaskChange(); + } + + public SolutionConversionTool(string projectTitle, string projectInputDirectory, string projectOutputDirectory) + { + GenerateGacReferences(); + this.projectTitle = projectTitle; + this.projectInputDirectory = projectInputDirectory; + this.projectOutputDirectory = projectOutputDirectory; + } + + void GenerateGacReferences() + { + IApplicationContext applicationContext = null; + IAssemblyEnum assemblyEnum = null; + IAssemblyName assemblyName = null; + + Fusion.CreateAssemblyEnum(out assemblyEnum, null, null, 2, 0); + + while (assemblyEnum.GetNextAssembly(out applicationContext, out assemblyName, 0) == 0) { + uint nChars = 0; + assemblyName.GetDisplayName(null, ref nChars, 0); + + StringBuilder sb = new StringBuilder((int)nChars); + assemblyName.GetDisplayName(sb, ref nChars, 0); + + string[] info = sb.ToString().Split(','); + + string aName = info[0]; + string aVersion = info[1].Substring(info[1].LastIndexOf('=') + 1); + GacReferences[aName] = sb.ToString(); + } + } + + static string[] commonAssemblies = new string[] { + "mscorlib", + "Accessibility", + "Microsoft.Vsa", + "System.Configuration.Install", + "System.Data", + "System.Design", + "System.DirectoryServices", + "System", + "System.Drawing.Design", + "System.Drawing", + "System.EnterpriseServices", + "System.Management", + "System.Messaging", + "System.Runtime.Remoting", + "System.Runtime.Serialization.Formatters.Soap", + "System.Security", + "System.ServiceProcess", + "System.Web", + "System.Web.RegularExpressions", + "System.Web.Services", + "System.Windows.Forms", + "System.XML" + }; + + public bool ShouldGenerateReference(bool filter, string assemblyName, string hintPath) + { + if (filter) { + foreach (string reference in commonAssemblies) { + if (reference.ToUpper() == assemblyName.ToUpper()) { + return false; + } + } + } + + if (hintPath != null && hintPath.Length > 0) { + string assemblyLocation = Path.Combine(this.projectInputDirectory, hintPath); + if (File.Exists(assemblyLocation)) { + return true; + } + } + + if (!File.Exists(Path.Combine(this.projectInputDirectory, assemblyName))) { + if (GacReferences[assemblyName] != null) { + return true; + } + } else { + return true; + } + this.WriteLine("Can't import reference " + assemblyName + " (" + hintPath + ")"); + return false; + } + + public string GenerateReferenceType(string assemblyName, string hintPath) + { + if (hintPath != null && hintPath.Length > 0) { + string assemblyLocation = Path.Combine(this.projectInputDirectory, hintPath); + if (File.Exists(assemblyLocation)) { + return "Assembly"; + } + } + + if (!File.Exists(Path.Combine(this.projectInputDirectory, assemblyName))) { + if (GacReferences[assemblyName] == null) { + this.WriteLine("Can't find Assembly reference " + assemblyName); + } else { + return "Gac"; + } + } else { + return "Assembly"; + } + + this.WriteLine("Can't determine reference type for " + assemblyName); + return "Assembly"; + } + + public string GenerateReference(string assemblyName, string hintPath) + { + if (hintPath != null && hintPath.Length > 0) { + string assemblyLocation = Path.Combine(this.projectInputDirectory, hintPath); + if (File.Exists(assemblyLocation)) { + VerifyFileLocation(hintPath); + return hintPath; + } + } + + if (!File.Exists(Path.Combine(this.projectInputDirectory, assemblyName))) { + if (GacReferences[assemblyName] == null) { + this.WriteLine("Can't find Assembly reference " + assemblyName); + } else { + return GacReferences[assemblyName].ToString(); + } + } else { + return "." + Path.DirectorySeparatorChar + assemblyName; + } + + this.WriteLine("Created illegal, empty reference (should never happen) remove manually"); + return null; + } + + public string VerifyFileLocation(string itemFile) + { + if (itemFile.Length == 0) { + return String.Empty; + } + string itemInputFile = Path.Combine(this.projectInputDirectory, itemFile); + if (itemInputFile.StartsWith("..")) { + string correctLocation = this.projectOutputDirectory + Path.DirectorySeparatorChar + + "MovedFiles" + Path.DirectorySeparatorChar + Path.GetFileName(itemFile); + try { + if (File.Exists(correctLocation)) { + File.Delete(correctLocation); + } + this.WriteLine("Copy file " + itemInputFile + " to " + correctLocation); + copiedFiles.Add(new DictionaryEntry(itemInputFile, correctLocation)); + } catch (Exception) { +// +// MessageService.ShowError(e, "Can't copy " + itemInputFile + " to " + correctLocation +"\nCheck for write permission."); + } + return "." + correctLocation.Substring(this.projectOutputDirectory.Length); + } + copiedFiles.Add(new DictionaryEntry(itemInputFile, this.projectOutputDirectory + Path.DirectorySeparatorChar + itemFile)); + return itemFile.StartsWith(".") ? itemFile : "." + Path.DirectorySeparatorChar + itemFile; + } + + public string EnsureBool(string txt) + { + if (txt.ToUpper() == "TRUE") { + return true.ToString(); + } + return false.ToString(); + } + + public string Negate(string txt) + { + if (txt.ToUpper() == "TRUE") { + return false.ToString(); + } + return true.ToString(); + } + + /// + /// Imports a resource file. + /// + /// The resource file. + /// The dependent source file. + /// The output resource file path. + public string ImportDependentResource(string resourceFile, string dependentFile, string rootNamespace) + { + WriteLine("Import resource " + resourceFile); + WriteLine("Searching namespace in " + dependentFile); + + string resourceOutputFile; + + string Namespace = null; + if (dependentFile != null && dependentFile.Length > 0) + Namespace = GetNamespaceFromFile(Path.Combine(this.projectInputDirectory, dependentFile)); + if (Namespace == null) + Namespace = rootNamespace; + WriteLine(" Namespace is '" + Namespace + "'"); + + if (Namespace != null && Namespace.Length > 0) { + resourceOutputFile = Path.Combine(Path.GetDirectoryName(resourceFile), + Namespace + "." + Path.GetFileName(resourceFile)); + } else { + resourceOutputFile = resourceFile; + } + return CopyResource(resourceFile, resourceOutputFile); + } + + #region GetNamespace + // TODO: Get namespace using the parser, not with regular expressions. + + /// Gets the class namespace from a piece of code. + /// The code to extract the namespace from. + /// The namespace of the classes in the source code. + private string GetCSharpNamespace(string code) + { + // The regular expression that extracts the text + // "namespace Name {" from a code string. + + string pattern = @"^[ \t]*namespace\s+([\w\d\.]+)\s*{"; + Regex regex = new Regex(pattern, RegexOptions.Multiline); + Match match = regex.Match(code); + if (match.Success) + return match.Groups[1].Value; + else + return null; + } + + /// Gets the class's namespace from a piece of code. + /// The code to extract the namespace from. + /// The namespace of the classes in the source code. + private string GetVBNamespace(string code) + { + string pattern = @"^[ \t]*Namespace\s+([\w\d\.]+)[ \t]*$"; + Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase); + Match match = regex.Match(code); + if (match.Success) + return match.Groups[1].Value; + else + return null; + } + + /// + /// Gets the namespace of the first class specified in a file. + /// + /// The filename to search for + /// a namespace. + private string GetNamespaceFromFile(string filename) + { + try { + using (StreamReader reader = new StreamReader(filename, true)) { + string extension = Path.GetExtension(filename).ToLower(); + if (extension == ".cs") { + return GetCSharpNamespace(reader.ReadToEnd()); + } else if (extension == ".vb") { + return GetVBNamespace(reader.ReadToEnd()); + } + return null; + } + } catch (Exception ex) { + WriteLine(ex.ToString()); + return null; + } + } + #endregion + + public string ImportResource(string resourceFile, string rootNamespace) + { + WriteLine("Import resource " + resourceFile + " (ns=" + rootNamespace + ")"); + + string resourceOutputFile = resourceFile; + + if (!Path.IsPathRooted(resourceFile) && !resourceFile.StartsWith("..")) { + resourceOutputFile = resourceOutputFile.Replace(Path.DirectorySeparatorChar, '.'); + resourceOutputFile = resourceOutputFile.Replace(Path.AltDirectorySeparatorChar, '.'); + + if (rootNamespace == null || rootNamespace.Length == 0) + resourceOutputFile = Path.Combine(Path.GetDirectoryName(resourceFile), + resourceOutputFile); + else + resourceOutputFile = Path.Combine(Path.GetDirectoryName(resourceFile), + rootNamespace + "." + resourceOutputFile); + } else { + if (rootNamespace == null || rootNamespace.Length == 0) + resourceOutputFile = Path.GetFileName(resourceFile); + else + resourceOutputFile = rootNamespace + "." + Path.GetFileName(resourceFile); + } + + return CopyResource(resourceFile, resourceOutputFile); + } + + private string CopyResource(string inputFile, string outputFile) { + inputFile = Path.Combine(this.projectInputDirectory, inputFile); + if (Path.GetExtension(outputFile).ToUpper() == ".RESX") { + outputFile = Path.ChangeExtension(outputFile, ".resources"); + } + + string outputFileFull = Path.Combine(this.projectOutputDirectory, outputFile); + + WriteLine("Needed to copy file " + inputFile + " to " + outputFileFull); + copiedFiles.Add(new DictionaryEntry(inputFile, outputFileFull)); + return (outputFile.StartsWith(".") ? "" : "." + Path.DirectorySeparatorChar) + outputFile; + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionInputConverter.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionInputConverter.cs new file mode 100644 index 0000000000..dcf346f2ff --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionInputConverter.cs @@ -0,0 +1,251 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Windows.Forms; +using System.Reflection; +using System.Security.Permissions; +using System.Resources; + +using System.Xml; +using System.Xml.Xsl; + +using ICSharpCode.Core; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +using ICSharpCode.SharpDevelop.Commands; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + public class SolutionInputConverter : AbstractInputConverter + { + string projectTitle; + string projectInputDirectory; + string projectOutputDirectory; + string combineOutputFile; + + public override string FormatName { + get { + return "Visual Studio.NET 7 / 2003 Solutions"; + } + } + + public override string OutputFile { + get { + return combineOutputFile; + } + } + + + public override bool CanConvert(string fileName) + { + string upperExtension = Path.GetExtension(fileName).ToUpper(); + return upperExtension == ".SLN"; + } + + public override bool Convert(string solutionInputFile, string outputPath) + { + projectTitle = projectInputDirectory = projectOutputDirectory = combineOutputFile = null; + + ArrayList projects = ReadSolution(solutionInputFile); + ArrayList convertedProjects = new ArrayList(); + for (int i = 0; i < projects.Count; ++i) { + DictionaryEntry entry = (DictionaryEntry)projects[i]; + this.projectTitle = entry.Key.ToString(); + + string projectFile = entry.Value.ToString(); + + string projectInputFile = Path.Combine(Path.GetDirectoryName(solutionInputFile), projectFile); + this.projectOutputDirectory = Path.Combine(outputPath, Path.GetDirectoryName(projectFile)); + + if (!File.Exists(projectFile)) { + using (ChooseProjectLocationDialog cpld = new ChooseProjectLocationDialog()) { + cpld.FileName = projectFile; + DialogResult res = cpld.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + if (res == DialogResult.OK) { + projectInputFile = projectFile = cpld.FileName; + this.projectOutputDirectory = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(projectFile)); + entry = new DictionaryEntry(entry.Key, Path.Combine(Path.GetFileNameWithoutExtension(projectFile), Path.ChangeExtension(Path.GetFileName(projectFile), ".prjx"))); + projects[i] = entry; + } else { + continue; + } + } + } + + string projectOutputFile = Path.Combine(projectOutputDirectory, Path.ChangeExtension(Path.GetFileName(projectFile), ".prjx")); + + if (!Directory.Exists(projectOutputDirectory)) { + Directory.CreateDirectory(projectOutputDirectory); + } + + this.projectInputDirectory = Path.GetDirectoryName(projectInputFile); + switch (Path.GetExtension(projectFile).ToUpper()) { + case ".VBPROJ": + ConvertProject(projectInputFile, projectOutputFile, "VBSolutionConversion.xsl"); + convertedProjects.Add(entry); + break; + case ".CSPROJ": + ConvertProject(projectInputFile, projectOutputFile, "CSSolutionConversion.xsl"); + convertedProjects.Add(entry); + break; + default: + + + StringParser.Properties["ProjectFile"] = projectFile; + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Converters.SolutionInputConverter.CantConvertProjectFileError}"); + break; + } + } + combineOutputFile = Path.Combine(outputPath, Path.ChangeExtension(Path.GetFileName(solutionInputFile), ".cmbx")); + WriteCombine(combineOutputFile, convertedProjects); + return true; + } + + void ConvertResource(string inputFile, string outputFile) + { + Hashtable resources = new Hashtable(); + + // read .resx file + try { + Stream s = File.OpenRead(inputFile); + ResXResourceReader rx = new ResXResourceReader(s); + IDictionaryEnumerator n = rx.GetEnumerator(); + while (n.MoveNext()) { + if (!resources.ContainsKey(n.Key)) { + resources.Add(n.Key, n.Value); + } + } + + rx.Close(); + s.Close(); + } catch (Exception e) { + + MessageService.ShowError(e, "Can't read resource file " + inputFile +"\nCheck file existance."); + } + + // write .resources file + try { + ResourceWriter rw = new ResourceWriter(outputFile); + foreach (DictionaryEntry entry in resources) { + rw.AddResource(entry.Key.ToString(), entry.Value); + } + rw.Generate(); + rw.Close(); + } catch (Exception e) { + + MessageService.ShowError(e, "Can't generate resource file " + outputFile +"\nCheck for write permission."); + } + } + + void ConvertProject(string inputFile, string outputFile, string resourceStreamFile) + { + SolutionConversionTool solutionConversionTool = new SolutionConversionTool(projectTitle, projectInputDirectory, projectOutputDirectory); + + XsltArgumentList xsltArgumentList = new XsltArgumentList(); + xsltArgumentList.AddParam("ProjectTitle", "", projectTitle); + xsltArgumentList.AddExtensionObject("urn:convtool", solutionConversionTool); + + + + + try { + ConvertXml.Convert(inputFile, + new XmlTextReader(new StreamReader(Assembly.GetCallingAssembly().GetManifestResourceStream(resourceStreamFile), Encoding.UTF8)), + outputFile, + xsltArgumentList); + } catch (XmlException) { + // try it again with the system encoding instead of UTF-8 + ConvertXml.Convert(inputFile, + new XmlTextReader(new StreamReader(Assembly.GetCallingAssembly().GetManifestResourceStream(resourceStreamFile), Encoding.UTF8)), + outputFile, + xsltArgumentList, + Encoding.Default); + } + + foreach (DictionaryEntry entry in solutionConversionTool.copiedFiles) { + string srcFile = entry.Key.ToString(); + string dstFile = entry.Value.ToString(); + if (File.Exists(srcFile)) { + if (!Directory.Exists(Path.GetDirectoryName(dstFile))) { + Directory.CreateDirectory(Path.GetDirectoryName(dstFile)); + } + if (Path.GetExtension(srcFile).ToUpper() == ".RESX") { + ConvertResource(srcFile, dstFile); + } else { + if (srcFile.ToLower() == dstFile.ToLower()) continue; + try { + File.Copy(srcFile, dstFile, true); + File.SetAttributes(dstFile, FileAttributes.Normal); + } catch (Exception e) { + + MessageService.ShowError(e, "Can't Copy file from " + srcFile +" to " + dstFile +". Copy it manually."); + } + } + } + } + solutionConversionTool.copiedFiles = new ArrayList(); + } + + ArrayList ReadSolution(string fileName) + { + StreamReader sr = File.OpenText(fileName); + Regex projectLinePattern = new Regex("Project\\(.*\\)\\s+=\\s+\"(?.*)\",\\s*\"(?<Location>.*)\",", RegexOptions.Compiled); + ArrayList projects = new ArrayList(); + while (true) { + string line = sr.ReadLine(); + if (line == null) { + break; + } + Match match = projectLinePattern.Match(line); + if (match.Success) { + projects.Add(new DictionaryEntry(match.Result("${Title}"), match.Result("${Location}"))); + } + } + sr.Close(); + return projects; + } + + void WriteCombine(string fileName, ArrayList projects) + { + StreamWriter sw = File.CreateText(fileName); + sw.WriteLine("<Combine fileversion=\"1.0\" name=\"" + Path.GetFileNameWithoutExtension(fileName) + "\" description=\"Converted Visual Studio.NET Solution\">"); + string firstEntry = null; + sw.WriteLine("<Entries>"); + foreach (DictionaryEntry entry in projects) { + if (firstEntry == null) { + firstEntry = entry.Key.ToString(); + } + sw.WriteLine("\t<Entry filename=\"." + Path.DirectorySeparatorChar + Path.ChangeExtension(entry.Value.ToString(), ".prjx") + "\" />"); + } + sw.WriteLine("</Entries>"); + sw.WriteLine("<StartMode startupentry=\"" + firstEntry + "\" single=\"True\"/>"); + sw.WriteLine("<Configurations active=\"Debug\">"); + sw.WriteLine("<Configuration name=\"Debug\">"); + foreach (DictionaryEntry entry in projects) { + sw.WriteLine("\t<Entry name=\"" + entry.Key + "\" configurationname=\"Debug\" build=\"False\" />"); + } + sw.WriteLine("</Configuration>"); + sw.WriteLine("<Configuration name=\"Release\">"); + foreach (DictionaryEntry entry in projects) { + sw.WriteLine("\t<Entry name=\"" + entry.Key + "\" configurationname=\"Release\" build=\"False\" />"); + } + sw.WriteLine("</Configuration>"); + sw.WriteLine("</Configurations>"); + sw.WriteLine("</Combine>"); + sw.Close(); + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionOutputConverter.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionOutputConverter.cs new file mode 100644 index 0000000000..8f2bdd92bb --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionOutputConverter.cs @@ -0,0 +1,199 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Mike Krueger" email="mike@icsharpcode.net"/> +// <version value="$version"/> +// </file> + +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Xsl; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + public class SolutionOutputConverter : AbstractOutputConverter + { + Hashtable GUIDHash = new Hashtable(); + Hashtable typeGUIDHash = new Hashtable(); + Hashtable configHash = new Hashtable(); + + static Hashtable projectTypeGUIDHash = new Hashtable(); + static Hashtable languageNameHash = new Hashtable(); + + static SolutionOutputConverter() + { + projectTypeGUIDHash[".csproj"] = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"; + projectTypeGUIDHash[".vbproj"] = "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}"; + languageNameHash[".csproj"] = "CSHARP"; + languageNameHash[".vbproj"] = "VisualBasic"; + } + + public override string FormatName { + get { + return "Visual Studio.NET 2003 Solutions"; + } + } + + string CreateGUID(string projectFileName) + { + string name = Path.GetFileNameWithoutExtension(projectFileName); + string result = (string)GUIDHash[name]; + if (result == null) { + result = String.Concat('{', Guid.NewGuid().ToString().ToUpper(), '}'); + GUIDHash[name] = result; + } + return result; + } + + + string GetVSNetProjectFileExtension(string projectFileName) + { + XmlTextReader reader = new XmlTextReader(projectFileName); + reader.MoveToContent(); + if (reader.MoveToAttribute("projecttype")) { + switch (reader.Value) { + case "C#": + return ".csproj"; + case "VBNET": + return ".vbproj"; + default: + throw new System.NotSupportedException("Project type " + reader.Value + " is currently not supported."); + } + } + return ".csproj"; + } + + public override void ConvertCombine(IProgressMonitor progressMonitor, string inputCombine, string outputPath) + { + string inputPath = Path.GetFullPath(Path.GetDirectoryName(inputCombine)); + + Combine combine = new Combine(); + combine.LoadCombine(inputCombine); + + StreamWriter streamWriter = new StreamWriter(Path.Combine(outputPath, Path.ChangeExtension(Path.GetFileName(inputCombine), ".sln"))); + streamWriter.WriteLine("Microsoft Visual Studio Solution File, Format Version 8.00"); + + ArrayList projects = Combine.GetAllProjects(combine); + if (progressMonitor != null) { + progressMonitor.BeginTask("Convert", projects.Count + 2); + } + foreach (ProjectCombineEntry project in projects) { + string projectFileName = Path.GetFullPath(Path.Combine(inputPath, project.Filename)); + string relativeFileName = projectFileName.Substring(inputPath.Length + 1); + string newExtension = GetVSNetProjectFileExtension(projectFileName); + //CreateGUID(projectFileName); + streamWriter.WriteLine("Project(\"{3}\") = \"{1}\", \"{2}\", \"{0}\"", + CreateGUID(projectFileName), + project.Name, + Path.ChangeExtension(relativeFileName, newExtension), + projectTypeGUIDHash[newExtension]); + typeGUIDHash[Path.GetFileNameWithoutExtension(projectFileName)] = projectTypeGUIDHash[newExtension]; + streamWriter.WriteLine("\tProjectSection(ProjectDependencies) = postProject"); + streamWriter.WriteLine("\tEndProjectSection"); + } + if (progressMonitor != null) { + progressMonitor.Worked(1); + } + foreach (ProjectCombineEntry project in projects) { + string projectFileName = Path.GetFullPath(Path.Combine(inputPath, project.Filename)); + string relativeFileName = projectFileName.Substring(inputPath.Length + 1); + ConvertProject(null, projectFileName, Path.Combine(outputPath, Path.GetDirectoryName(relativeFileName))); + if (progressMonitor != null) { + progressMonitor.Worked(1); + } + } + streamWriter.WriteLine("EndProject"); + streamWriter.WriteLine("Global"); + + streamWriter.WriteLine("\tGlobalSection(SolutionConfiguration) = preSolution"); + SortedList allConfigs = new SortedList(); + foreach (ProjectCombineEntry project in projects) { + string projectFileName = Path.GetFullPath(Path.Combine(inputPath, project.Filename)); + foreach (string config in (ArrayList)configHash[projectFileName]) { + allConfigs[config] = "1"; + } + } + foreach (DictionaryEntry entry in allConfigs) { + streamWriter.WriteLine("\t\t{0} = {0}", entry.Key); + } + streamWriter.WriteLine("\tEndGlobalSection"); + streamWriter.WriteLine("\tGlobalSection(ProjectConfiguration) = postSolution"); + foreach (ProjectCombineEntry project in projects) { + string projectFileName = Path.GetFullPath(Path.Combine(inputPath, project.Filename)); + foreach (string config in (ArrayList)configHash[projectFileName]) { + string name = Path.GetFileNameWithoutExtension(projectFileName); + streamWriter.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}|.NET", GUIDHash[name], config); + streamWriter.WriteLine("\t\t{0}.{1}.Build.0 = {1}|.NET", GUIDHash[name], config); + } + } + streamWriter.WriteLine("\tEndGlobalSection"); + streamWriter.WriteLine("\tGlobalSection(ExtensibilityGlobals) = postSolution"); + streamWriter.WriteLine("\tEndGlobalSection"); + streamWriter.WriteLine("\tGlobalSection(ExtensibilityAddIns) = postSolution"); + streamWriter.WriteLine("\tEndGlobalSection"); + streamWriter.WriteLine("EndGlobal"); + streamWriter.Close(); + if (progressMonitor != null) { + progressMonitor.Done(); + } + } + + public override void ConvertProject(IProgressMonitor progressMonitor, string inputProject, string outputPath) + { + if (progressMonitor != null) { + progressMonitor.BeginTask("Convert", 3); + } + + string newExtension = GetVSNetProjectFileExtension(inputProject); + string frameworkPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); + if (!frameworkPath.EndsWith(Path.DirectorySeparatorChar.ToString())) + frameworkPath += Path.DirectorySeparatorChar; + + XsltArgumentList xsltArgumentList = new XsltArgumentList(); + xsltArgumentList.AddParam("LanguageName", "", languageNameHash[newExtension]); + xsltArgumentList.AddParam("FrameworkPath", "", frameworkPath); + SolutionOutputConverterTool solutionConversionTool = new SolutionOutputConverterTool(); + solutionConversionTool.projectGUIDHash = GUIDHash; + solutionConversionTool.projectTypeGUIDHash = projectTypeGUIDHash; + xsltArgumentList.AddExtensionObject("urn:convtool", solutionConversionTool); + + string outputFile = Path.Combine(outputPath, Path.ChangeExtension(Path.GetFileName(inputProject), newExtension)); + if (!Directory.Exists(Path.GetDirectoryName(outputFile))) { + Directory.CreateDirectory(Path.GetDirectoryName(outputFile)); + } + if (progressMonitor != null) { + progressMonitor.Worked(1); + } + + ConvertXml.Convert(inputProject, + new XmlTextReader(Assembly.GetCallingAssembly().GetManifestResourceStream("ProjectToVSNetProjectConversion.xsl")), + outputFile, + xsltArgumentList); + if (progressMonitor != null) { + progressMonitor.Worked(1); + } + + foreach (string fileName in solutionConversionTool.copiedFiles) { + string srcFile = Path.Combine(Path.GetDirectoryName(inputProject), fileName); + string dstFile = Path.Combine(outputPath, fileName); + if (srcFile.ToLower() == dstFile.ToLower()) continue; + if (File.Exists(srcFile)) { + if (!Directory.Exists(Path.GetDirectoryName(dstFile))) { + Directory.CreateDirectory(Path.GetDirectoryName(dstFile)); + } + File.Copy(srcFile, dstFile, true); + File.SetAttributes(dstFile, FileAttributes.Normal); + } + } + configHash[inputProject] = solutionConversionTool.configurations; + if (progressMonitor != null) { + progressMonitor.Done(); + } + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionOutputConverterTool.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionOutputConverterTool.cs new file mode 100644 index 0000000000..d0fa28c3b8 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/SolutionOutputConverterTool.cs @@ -0,0 +1,91 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Mike Krüger" email="mike@icsharpcode.net"/> +// <version value="$version"/> +// </file> + +using System; +using System.Collections; +using System.IO; +using System.Text; +using System.Security; +using System.Security.Permissions; + +using System.Windows.Forms; + +using MSjogren.GacTool.FusionNative; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Commands; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + public class SolutionOutputConverterTool + { + public ArrayList copiedFiles = new ArrayList(); + public ArrayList configurations = new ArrayList(); + public Hashtable projectGUIDHash; + public Hashtable projectTypeGUIDHash; + + public string AddConfig(string config) + { + configurations.Add(config); + return config; + } + + public string VerifyFileLocation(string itemFile) + { + if (itemFile.Length == 0) { + return String.Empty; + } + copiedFiles.Add(itemFile); + if (itemFile.StartsWith(@".\")) { + itemFile = itemFile.Substring(2); + } + return itemFile; + } + + public string ConvertBuildAction(string buildAction) + { + switch (buildAction) { + case "EmbedAsResource": + return "EmbeddedResource"; + } + return buildAction; + } + + public string FileNameWithoutExtension(string txt) + { + return Path.GetFileNameWithoutExtension(txt); + } + + public string Negate(string txt) + { + if (txt.ToUpper() == "TRUE") { + return false.ToString(); + } + return true.ToString(); + } + + public string GetProjectGUID(string projectFileName) + { + string result = (string)projectGUIDHash[projectFileName]; + if (result == null) { + result = String.Concat('{', Guid.NewGuid().ToString().ToUpper(), '}'); + projectGUIDHash[projectFileName] = result; + } + return result; + } + + public string GetPackageGUID(string projectFileName) + { + string result = (string)projectTypeGUIDHash[projectFileName]; + if (result == null) { + result = String.Concat('{', Guid.NewGuid().ToString().ToUpper(), '}'); + projectTypeGUIDHash[projectFileName] = result; + } + return result; + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/VSProjectInputConverter.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/VSProjectInputConverter.cs new file mode 100644 index 0000000000..f824cbafa1 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Converters/VSNet/VSProjectInputConverter.cs @@ -0,0 +1,168 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Mike Krüger" email="mike@icsharpcode.net"/> +// <version value="$version"/> +// </file> + +using System; +using System.Collections; +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Windows.Forms; +using System.Reflection; +using System.Security.Permissions; +using System.Resources; + +using System.Xml; +using System.Xml.Xsl; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.SharpDevelop.Gui; + +using ICSharpCode.SharpDevelop.Commands; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Converters +{ + public class VSProjectInputConverter : AbstractInputConverter + { + string projectTitle; + string projectInputDirectory; + string combineOutputFile; + + string projectOutputDirectory; + + public override string FormatName { + get { + return "Visual Studio.NET 7 / 2003 C# and VB.NET Projects"; + } + } + + public override string OutputFile { + get { + return combineOutputFile; + } + } + + public override bool CanConvert(string fileName) + { + string upperExtension = Path.GetExtension(fileName).ToUpper(); + return upperExtension == ".VBPROJ" || upperExtension == ".CSPROJ"; + } + + public override bool Convert(string solutionInputFile, string outputPath) + { + this.projectOutputDirectory = outputPath; + string projectOutputFile = Path.Combine(projectOutputDirectory, Path.ChangeExtension(Path.GetFileName(solutionInputFile), ".prjx")); + + projectTitle = Path.GetFileNameWithoutExtension(solutionInputFile); + projectInputDirectory = Path.GetDirectoryName(solutionInputFile); + combineOutputFile = Path.Combine(outputPath, Path.ChangeExtension(Path.GetFileName(solutionInputFile), ".prjx")); + + switch (Path.GetExtension(solutionInputFile).ToUpper()) { + case ".VBPROJ": + ConvertProject(solutionInputFile, projectOutputFile, "VBSolutionConversion.xsl"); + break; + case ".CSPROJ": + ConvertProject(solutionInputFile, projectOutputFile, "CSSolutionConversion.xsl"); + break; + default: + + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Converters.SolutionInputConverter.CantConvertProjectFileError}"); + break; + } + + return true; + } + + void ConvertProject(string inputFile, string outputFile, string resourceStreamFile) + { + SolutionConversionTool solutionConversionTool = new SolutionConversionTool(projectTitle, projectInputDirectory, projectOutputDirectory); + + XsltArgumentList xsltArgumentList = new XsltArgumentList(); + xsltArgumentList.AddParam("ProjectTitle", "", projectTitle); + xsltArgumentList.AddExtensionObject("urn:convtool", solutionConversionTool); + + + + + try { + ConvertXml.Convert(inputFile, + new XmlTextReader(new StreamReader(Assembly.GetCallingAssembly().GetManifestResourceStream(resourceStreamFile), Encoding.UTF8)), + outputFile, + xsltArgumentList); + } catch (XmlException) { + // try it again with the system encoding instead of UTF-8 + ConvertXml.Convert(inputFile, + new XmlTextReader(new StreamReader(Assembly.GetCallingAssembly().GetManifestResourceStream(resourceStreamFile), Encoding.UTF8)), + outputFile, + xsltArgumentList, + Encoding.Default); + } + + foreach (DictionaryEntry entry in solutionConversionTool.copiedFiles) { + string srcFile = entry.Key.ToString(); + string dstFile = entry.Value.ToString(); + if (File.Exists(srcFile)) { + if (!Directory.Exists(Path.GetDirectoryName(dstFile))) { + Directory.CreateDirectory(Path.GetDirectoryName(dstFile)); + } + if (Path.GetExtension(srcFile).ToUpper() == ".RESX") { + ConvertResource(srcFile, dstFile); + } else { + if (srcFile.ToLower() == dstFile.ToLower()) continue; + try { + File.Copy(srcFile, dstFile, true); + File.SetAttributes(dstFile, FileAttributes.Normal); + } catch (Exception e) { + + MessageService.ShowError(e, "Can't Copy file from " + srcFile +" to " + dstFile +". Copy it manually."); + } + } + } + } + solutionConversionTool.copiedFiles = new ArrayList(); + } + + void ConvertResource(string inputFile, string outputFile) + { + Hashtable resources = new Hashtable(); + + // read .resx file + try { + Stream s = File.OpenRead(inputFile); + ResXResourceReader rx = new ResXResourceReader(s); + IDictionaryEnumerator n = rx.GetEnumerator(); + while (n.MoveNext()) { + if (!resources.ContainsKey(n.Key)) { + resources.Add(n.Key, n.Value); + } + } + + rx.Close(); + s.Close(); + } catch (Exception e) { + + MessageService.ShowError(e, "Can't read resource file " + inputFile +"\nCheck file existance."); + } + + // write .resources file + try { + ResourceWriter rw = new ResourceWriter(outputFile); + foreach (DictionaryEntry entry in resources) { + rw.AddResource(entry.Key.ToString(), entry.Value); + } + rw.Generate(); + rw.Close(); + } catch (Exception e) { + + MessageService.ShowError(e, "Can't generate resource file " + outputFile +"\nCheck for write permission."); + } + } + + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ChooseProjectLocationDialog.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ChooseProjectLocationDialog.cs new file mode 100644 index 0000000000..c1cac8f90c --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ChooseProjectLocationDialog.cs @@ -0,0 +1,66 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Mike Krueger" email="mike@icsharpcode.net"/> +// <version value="$version"/> +// </file> + +using System; +using System.Collections; +using System.Reflection; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs +{ + public class ChooseProjectLocationDialog : BaseSharpDevelopForm + { + public string FileName { + get { + return ControlDictionary["fileNameTextBox"].Text; + } + set { + ControlDictionary["fileNameTextBox"].Text = value; + } + } + + public ChooseProjectLocationDialog() + { + SetupFromXmlStream(Assembly.GetCallingAssembly().GetManifestResourceStream("ChooseProjectLocationDialog.xfrm")); + Icon = null; + ControlDictionary["okButton"].Click += new EventHandler(OkButtonClick); + ControlDictionary["browseButton"].Click += new EventHandler(BrowseProject); + + } + + void OkButtonClick(object sender, EventArgs e) + { + if (!FileUtilityService.IsValidFileName(FileName)) { + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.InputFileInvalidError}"); + return; + } + + if (FileUtilityService.TestFileExists(FileName)) { + DialogResult = DialogResult.OK; + } + } + + void BrowseProject(object sender, EventArgs e) + { + using (OpenFileDialog fdiag = new OpenFileDialog()) { + fdiag.AddExtension = true; + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + fdiag.CheckFileExists = true; + if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["fileNameTextBox"].Text = fdiag.FileName; + } + } + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ExportProjectDialog.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ExportProjectDialog.cs new file mode 100644 index 0000000000..8300365d39 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ExportProjectDialog.cs @@ -0,0 +1,179 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Mike Krueger" email="mike@icsharpcode.net"/> +// <version value="$version"/> +// </file> + +using System; +using System.Collections; +using System.Reflection; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Internal.Project; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; + + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs +{ + public class ExportProjectDialog : BaseSharpDevelopForm, IProgressMonitor + { + ArrayList outputConvertes; + + public ExportProjectDialog() : this(null, null) + { + + } + + public ExportProjectDialog(string formatName) : this(formatName, null) + { + + } + + public ExportProjectDialog(string formatName, string projectName) + { + SetupFromXmlStream(Assembly.GetCallingAssembly().GetManifestResourceStream("ExportProjectDialog.xfrm")); + Icon = null; + ControlDictionary["outputLocationBrowseButton"].Click += new EventHandler(BrowseOutputLocation); + ControlDictionary["startButton"].Click += new EventHandler(StartConversion); + + outputConvertes = RetrieveOutputConverters(); + FillOutputFormat(formatName); + FillProjectList(projectName); + ((RadioButton)ControlDictionary["singleProjectRadioButton"]).CheckedChanged += new EventHandler(RadioButtonChecked); + ((RadioButton)ControlDictionary["wholeCombineRadioButton"]).CheckedChanged += new EventHandler(RadioButtonChecked); + + RadioButtonChecked(null, null); + ControlDictionary["outputLocationTextBox"].Text = PropertyService.Get("ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ExportProjectDialog.OutputPath", "C:\\output"); + } + + void FillOutputFormat(string formatName) + { + int index = 0; + for (int i = 0; i < outputConvertes.Count; ++i) { + AbstractOutputConverter outputConverter = (AbstractOutputConverter)outputConvertes[i]; + ((ComboBox)ControlDictionary["outputFormatComboBox"]).Items.Add(StringParser.Parse(outputConverter.FormatName)); + if (formatName == outputConverter.FormatName) { + index = i; + } + } + ((ComboBox)ControlDictionary["outputFormatComboBox"]).SelectedIndex = index; + } + + void FillProjectList(string projectName) + { + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + if (projectService.CurrentOpenCombine == null) { + return; + } + + ArrayList allProjects = Combine.GetAllProjects(projectService.CurrentOpenCombine); + int index = 0; + for (int i = 0; i < allProjects.Count; ++i) { + ProjectCombineEntry entry = (ProjectCombineEntry)allProjects[i]; + ((ComboBox)ControlDictionary["projectListComboBox"]).Items.Add(entry.Project.Name); + if (entry.Project.Name == projectName) { + index = i; + ((RadioButton)ControlDictionary["singleProjectRadioButton"]).Checked = true; + } + } + if (allProjects.Count > 0) { + ((ComboBox)ControlDictionary["projectListComboBox"]).SelectedIndex = index; + } + } + + void RadioButtonChecked(object sender, EventArgs e) + { + SetEnabledStatus(((RadioButton)ControlDictionary["singleProjectRadioButton"]).Checked, "projectListComboBox"); + } + + + ArrayList RetrieveOutputConverters() + { + ArrayList converters = new ArrayList(); + Assembly asm = Assembly.GetCallingAssembly(); + foreach (Type t in asm.GetTypes()) { + if (!t.IsAbstract && t.IsSubclassOf(typeof(AbstractOutputConverter))) { + converters.Add(asm.CreateInstance(t.FullName)); + } + } + return converters; + } + void BrowseOutputLocation(object sender, EventArgs e) + { + FolderDialog fd = new FolderDialog(); + if (fd.DisplayDialog("Choose combine output location.") == DialogResult.OK) { + ControlDictionary["outputLocationTextBox"].Text = fd.Path; + } + } + + void StartConversion(object sender, EventArgs e) + { + string outputPath = ControlDictionary["outputLocationTextBox"].Text; + + if (!FileUtilityService.IsValidFileName(outputPath)) { + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.OutputFileInvalidError}"); + return; + } + + if (!FileUtilityService.IsDirectory(outputPath)) { + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.OutputPathDoesntExistError}"); + return; + } + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + AbstractOutputConverter outputConverter = (AbstractOutputConverter)outputConvertes[((ComboBox)ControlDictionary["outputFormatComboBox"]).SelectedIndex]; + if (((RadioButton)ControlDictionary["singleProjectRadioButton"]).Checked) { + ArrayList allProjects = Combine.GetAllProjects(projectService.CurrentOpenCombine); + IProject project = ((ProjectCombineEntry)allProjects[((ComboBox)ControlDictionary["projectListComboBox"]).SelectedIndex]).Project; + outputConverter.ConvertProject(this, projectService.GetFileName(project), outputPath); + } else { + outputConverter.ConvertCombine(this, projectService.GetFileName(projectService.CurrentOpenCombine), outputPath); + } + + MessageService.ShowMessage("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ExportProjectDialog.ConversionDoneMessage}"); + + PropertyService.Set("ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ExportProjectDialog.OutputPath", ControlDictionary["outputLocationTextBox"].Text); + } + + #region IProgressMonitor interface + int curWork = 0; + public void BeginTask(string name, int totalWork) + { + ((ProgressBar)ControlDictionary["progressBar"]).Minimum = 0; + ((ProgressBar)ControlDictionary["progressBar"]).Maximum = totalWork; + ((ProgressBar)ControlDictionary["progressBar"]).Value = curWork = 0; + } + public void Worked(int work) + { + curWork += work; + ((ProgressBar)ControlDictionary["progressBar"]).Value = curWork; + } + + public void Done() + { + ((ProgressBar)ControlDictionary["progressBar"]).Value = ((ProgressBar)ControlDictionary["progressBar"]).Maximum; + } + + public bool Canceled { + get { + return false; + } + set { + + } + } + + public string TaskName { + get { + return "Export"; + } + set { + + } + } + #endregion + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ImportProjectDialog.cs b/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ImportProjectDialog.cs new file mode 100644 index 0000000000..b1e37b1df7 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Dialogs/ImportProjectDialog.cs @@ -0,0 +1,123 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Mike Krger" email="mike@icsharpcode.net"/> +// <version value="$version"/> +// </file> + +using System; +using System.IO; +using System.Collections; +using System.Reflection; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.SharpDevelop.ProjectImportExporter.Converters; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs +{ + + + public class ImportProjectDialog : BaseSharpDevelopForm + { + ArrayList inputConvertes; + + public ImportProjectDialog() + { + SetupFromXmlStream(Assembly.GetCallingAssembly().GetManifestResourceStream("ImportProjectDialog.xfrm")); + Icon = null; + + ControlDictionary["startButton"].Click += new EventHandler(StartConversion); + ControlDictionary["projectBrowseButton"].Click += new EventHandler(BrowseProject); + ControlDictionary["outputLocationBrowseButton"].Click += new EventHandler(BrowseOutputLocation); + + inputConvertes = RetrieveInputConverters(); + + foreach (AbstractInputConverter converter in inputConvertes) { + ((RichTextBox)ControlDictionary["formatsRichTextBox"]).AppendText(StringParser.Parse(converter.FormatName) + Environment.NewLine); + } + } + + ArrayList RetrieveInputConverters() + { + ArrayList converters = new ArrayList(); + Assembly asm = Assembly.GetCallingAssembly(); + foreach (Type t in asm.GetTypes()) { + if (!t.IsAbstract && t.IsSubclassOf(typeof(AbstractInputConverter))) { + converters.Add(asm.CreateInstance(t.FullName)); + } + } + return converters; + } + + void BrowseProject(object sender, EventArgs e) + { + using (OpenFileDialog fdiag = new OpenFileDialog()) { + fdiag.AddExtension = true; + fdiag.Filter = StringParser.Parse("${res:SharpDevelop.FileFilter.VSNetSolutionFiles}|*.sln;*.csproj;*.vbproj|${res:SharpDevelop.FileFilter.BorlandStudioFiles}|*.bdsproj;*.bdsgroup|${res:SharpDevelop.FileFilter.AllFiles}|*.*"); + fdiag.Multiselect = false; + fdiag.CheckFileExists = true; + if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ControlDictionary["projectTextBox"].Text = fdiag.FileName; + + string projectDefaultPath = PropertyService.Get("ICSharpCode.SharpDevelop.Gui.NewProjectDialog.DefaultPath", Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "SharpDevelop Projects")); + ControlDictionary["outputLocationTextBox"].Text = Path.Combine(projectDefaultPath, Path.GetFileNameWithoutExtension(fdiag.FileName)); + } + } + } + + void BrowseOutputLocation(object sender, EventArgs e) + { + FolderDialog fd = new FolderDialog(); + if (fd.DisplayDialog("Choose combine output location.") == DialogResult.OK) { + ControlDictionary["outputLocationTextBox"].Text = fd.Path; + } + } + + void StartConversion(object sender, EventArgs e) + { + string inputFile = ControlDictionary["projectTextBox"].Text; + string outputPath = ControlDictionary["outputLocationTextBox"].Text; + + if (!FileUtilityService.IsValidFileName(inputFile)) { + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.InputFileInvalidError}"); + return; + } + + if (!FileUtilityService.IsValidFileName(outputPath)) { + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.OutputFileInvalidError}"); + return; + } + + try { + if (!Directory.Exists(outputPath)) { + Directory.CreateDirectory(outputPath); + } + } catch (Exception) {} + + if (!FileUtilityService.IsDirectory(outputPath)) { + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.OutputPathDoesntExistError}"); + return; + } + + if (FileUtilityService.TestFileExists(inputFile)) { + foreach (AbstractInputConverter converter in inputConvertes) { + if (converter.CanConvert(inputFile)) { + if (converter.Convert(inputFile, outputPath)) { + MessageService.ShowMessage("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.ConversionDoneMessage}"); + DialogResult = DialogResult.OK; + if (((CheckBox) ControlDictionary["openAfterImportCheckBox"]).Checked) { + IProjectService projectService = (IProjectService)ICSharpCode.Core.ServiceManager.Services.GetService(typeof(IProjectService)); + projectService.OpenCombine(converter.OutputFile); + } + } + return; + } + } + MessageService.ShowError("${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ImportProjectDialog.NoConverterFoundError}"); + } + } + } +} diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/CSSolutionConversion.xsl b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/CSSolutionConversion.xsl new file mode 100644 index 0000000000..ff85b78103 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/CSSolutionConversion.xsl @@ -0,0 +1,133 @@ +<?xml version="1.0"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:convtool="urn:convtool"> + <xsl:param name="ProjectTitle"/> + <xsl:template match="/VisualStudioProject/CSHARP"> + <Project name = "{$ProjectTitle}" + standardNamespace="{Build/Settings/@RootNamespace}" + description = "" + newfilesearch = "None" + enableviewstate = "True" + version = "1.1" + projecttype = "C#"> + + <!-- Transform Contents --> + <Contents> + + <xsl:for-each select="Files/Include/File[@BuildAction ='Compile']"> + <xsl:choose> + <xsl:when test="@Link"> + <File name = "{convtool:VerifyFileLocation(@Link)}" + buildaction="Compile" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:VerifyFileLocation(@RelPath)}" + buildaction="Compile" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + + <!-- convert 'resources' --> + <xsl:for-each select="Files/Include/File[@BuildAction ='EmbeddedResource']"> + <xsl:choose> + <xsl:when test="@Link"> + <xsl:choose> + <xsl:when test="@DependentUpon"> + <File name = "{convtool:ImportDependentResource(@Link,@DependentUpon,/VisualStudioProject/CSHARP/Build/Settings/@RootNamespace)}" + buildaction="EmbedAsResource" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:ImportResource(@Link,/VisualStudioProject/CSHARP/Build/Settings/@RootNamespace)}" + buildaction="EmbedAsResource" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="@DependentUpon"> + <File name = "{convtool:ImportDependentResource(@RelPath,@DependentUpon,/VisualStudioProject/CSHARP/Build/Settings/@RootNamespace)}" + buildaction="EmbedAsResource" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:ImportResource(@RelPath,/VisualStudioProject/CSHARP/Build/Settings/@RootNamespace)}" + buildaction="EmbedAsResource" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + + <!-- Non-buildable files part of the project --> + <xsl:for-each select="Files/Include/File[(@BuildAction ='None') or (@BuildAction ='Content')]"> + <xsl:choose> + <xsl:when test="@Link"> + <File name = "{convtool:VerifyFileLocation(@Link)}" + buildaction="Nothing" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:VerifyFileLocation(@RelPath)}" + buildaction="Nothing" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </Contents> + + <DeploymentInformation target="" script="" strategy="File" /> + + <!-- Transform Settings --> + <xsl:apply-templates select="Build/Settings"/> + + <!-- Transform References --> + <xsl:apply-templates select="Build/References"/> + </Project> + </xsl:template> + + <!-- Transform settings (easy) --> + <xsl:template match="Settings"> + <Configurations active="Debug"> + <xsl:for-each select="Config"> + <Configuration runwithwarnings="{convtool:Negate(@TreatWarningsAsErrors)}" name="{@Name}"> + <CodeGeneration runtime="MsNet" + compiler="Csc" + warninglevel="{@WarningLevel}" + includedebuginformation="{convtool:EnsureBool(@DebugSymbols)}" + optimize="{convtool:EnsureBool(@Optimize)}" + unsafecodeallowed="{convtool:EnsureBool(@AllowUnsafeBlocks)}" + generateoverflowchecks="{convtool:EnsureBool(@CheckForOverflowUnderflow)}" + mainclass="{../@StartupObject}" + target="{../@OutputType}" + definesymbols="{@DefineConstants}" + generatexmldocumentation="False" + win32Icon="{convtool:VerifyFileLocation(../@ApplicationIcon)}" /> + <Execution commandlineparameters="" + consolepause="True" /> + <Output directory="{convtool:VerifyFileLocation(@OutputPath)}" + assembly="{../@AssemblyName}" /> + </Configuration> + </xsl:for-each> + </Configurations> + </xsl:template> + + <!-- Transform references (a bit like frungy) --> + <xsl:template match="References"> + <References> + <xsl:for-each select="Reference[@AssemblyName]"> + <xsl:if test="convtool:ShouldGenerateReference('True', @AssemblyName, @HintPath)"> + <Reference type = "{convtool:GenerateReferenceType(@AssemblyName, @HintPath)}" + refto = "{convtool:GenerateReference(@AssemblyName, @HintPath)}"/> + </xsl:if> + </xsl:for-each> + <xsl:for-each select="Reference[@Project]"> + <Reference type = "Project" + refto = "{@Name}"/> + </xsl:for-each> + </References> + </xsl:template> +</xsl:stylesheet> diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ChooseProjectLocationDialog.xfrm b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ChooseProjectLocationDialog.xfrm new file mode 100644 index 0000000000..fc6cdcb6a8 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ChooseProjectLocationDialog.xfrm @@ -0,0 +1,57 @@ +<Components version="1.0"> + <System.Windows.Forms.Form> + <Name value="XmlForm1" /> + <ShowInTaskbar value="False" /> + <FormBorderStyle value="FixedDialog" /> + <ClientSize value="{Width=456, Height=90}" /> + <MinimizeBox value="False" /> + <DockPadding value="" /> + <Text value="${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ChooseProjectLocation.DialogName}" /> + <AcceptButton value="okButton [System.Windows.Forms.Button], Text: ${res:Global.OKButtonText}" /> + <CancelButton value="cancelButton [System.Windows.Forms.Button], Text: ${res:Global.CancelButtonText}" /> + <Controls> + <System.Windows.Forms.Button> + <Name value="cancelButton" /> + <Location value="{X=376,Y=64}" /> + <Size value="{Width=72, Height=23}" /> + <Text value="${res:Global.CancelButtonText}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="4" /> + <DialogResult value="Cancel" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.Button> + <Name value="okButton" /> + <Location value="{X=296,Y=64}" /> + <Size value="{Width=72, Height=23}" /> + <Text value="${res:Global.OKButtonText}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="1" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.Button> + <Name value="browseButton" /> + <Location value="{X=416,Y=32}" /> + <Size value="{Width=32, Height=23}" /> + <Text value="..." /> + <Anchor value="Top, Right" /> + <TabIndex value="3" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.TextBox> + <Name value="fileNameTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="2" /> + <Location value="{X=0,Y=32}" /> + <Size value="{Width=408, Height=20}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="label1" /> + <Text value="${res:ICSharpCode.SharpDevelop.ProjectImportExporter.Dialogs.ChooseProjectLocation.DescriptionLabel}" /> + <TextAlign value="BottomLeft" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="0" /> + <Size value="{Width=448, Height=24}" /> + <Location value="{X=0,Y=8}" /> + </System.Windows.Forms.Label> + </Controls> + </System.Windows.Forms.Form> +</Components> \ No newline at end of file diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ExportProjectDialog.xfrm b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ExportProjectDialog.xfrm new file mode 100644 index 0000000000..9c0ad486af --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ExportProjectDialog.xfrm @@ -0,0 +1,139 @@ +<Components version="1.0"> + <System.Windows.Forms.Form> + <Name value="MyForm" /> + <ShowInTaskbar value="False" /> + <FormBorderStyle value="FixedDialog" /> + <StartPosition value="CenterParent" /> + <ClientSize value="{Width=570, Height=288}" /> + <MinimizeBox value="False" /> + <DockPadding value="" /> + <Text value="${res:AddIns.ProjectImportExporter.ExportProjectDialog.DialogName}" /> + <AcceptButton value="startButton [System.Windows.Forms.Button], Text: ${res:Global.StartButtonText}" /> + <CancelButton value="cancelButton [System.Windows.Forms.Button], Text: ${res:Global.CancelButtonText}" /> + <MaximizeBox value="False" /> + <Controls> + <System.Windows.Forms.Button> + <Name value="button1" /> + <Location value="{X=16,Y=240}" /> + <Size value="{Width=16, Height=16}" /> + <Text value="+" /> + <TabIndex value="8" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.Label> + <Name value="label2" /> + <Text value="Export progress:" /> + <TextAlign value="BottomLeft" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="6" /> + <Size value="{Width=544, Height=16}" /> + <Location value="{X=16,Y=192}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.GroupBox> + <Name value="groupBox" /> + <TabIndex value="5" /> + <Location value="{X=16,Y=72}" /> + <Anchor value="Top, Left, Right" /> + <Size value="{Width=544, Height=112}" /> + <Text value="${res:AddIns.ProjectImportExporter.ExportProjectDialog.ExportGroupBox}" /> + <Controls> + <System.Windows.Forms.ComboBox> + <Name value="projectListComboBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="2" /> + <Location value="{X=24,Y=83}" /> + <Size value="{Width=516, Height=21}" /> + <DropDownStyle value="DropDownList" /> + </System.Windows.Forms.ComboBox> + <System.Windows.Forms.RadioButton> + <Name value="singleProjectRadioButton" /> + <Location value="{X=8,Y=54}" /> + <Size value="{Width=528, Height=24}" /> + <Text value="${res:AddIns.ProjectImportExporter.ExportProjectDialog.SingleProjectComboBox}" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="1" /> + </System.Windows.Forms.RadioButton> + <System.Windows.Forms.RadioButton> + <Name value="wholeCombineRadioButton" /> + <Location value="{X=8,Y=30}" /> + <Checked value="True" /> + <Size value="{Width=528, Height=24}" /> + <Text value="${res:AddIns.ProjectImportExporter.ExportProjectDialog.WholeCombineComboBox}" /> + <TabStop value="True" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="0" /> + </System.Windows.Forms.RadioButton> + </Controls> + </System.Windows.Forms.GroupBox> + <System.Windows.Forms.ComboBox> + <Name value="outputFormatComboBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="4" /> + <Location value="{X=152,Y=40}" /> + <Size value="{Width=408, Height=21}" /> + <DropDownStyle value="DropDownList" /> + </System.Windows.Forms.ComboBox> + <System.Windows.Forms.Label> + <Name value="label" /> + <Text value="${res:AddIns.ProjectImportExporter.ExportProjectDialog.OutputFormatLabel}" /> + <TextAlign value="MiddleRight" /> + <TabIndex value="3" /> + <Size value="{Width=144, Height=23}" /> + <Location value="{X=8,Y=40}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Button> + <Name value="outputLocationBrowseButton" /> + <Location value="{X=530,Y=8}" /> + <Size value="{Width=32, Height=21}" /> + <Text value="..." /> + <Anchor value="Top, Right" /> + <TabIndex value="2" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.TextBox> + <Name value="outputLocationTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="1" /> + <Location value="{X=152,Y=8}" /> + <Size value="{Width=370, Height=21}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="label" /> + <Text value="${res:AddIns.ProjectImportExporter.ExportProjectDialog.OutputLocationLabel}" /> + <TextAlign value="MiddleRight" /> + <TabIndex value="0" /> + <Size value="{Width=144, Height=23}" /> + <Location value="{X=8,Y=8}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Button> + <Name value="cancelButton" /> + <Location value="{X=490,Y=258}" /> + <Text value="${res:Global.CancelButtonText}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="11" /> + <DialogResult value="Cancel" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.Button> + <Name value="startButton" /> + <Location value="{X=410,Y=258}" /> + <Text value="${res:Global.StartButtonText}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="10" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.ProgressBar> + <Name value="progressBar" /> + <Size value="{Width=544, Height=23}" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="7" /> + <Location value="{X=16,Y=208}" /> + </System.Windows.Forms.ProgressBar> + <System.Windows.Forms.GroupBox> + <Name value="groupBox1" /> + <TabIndex value="19" /> + <Location value="{X=24,Y=240}" /> + <Anchor value="Top, Left, Right" /> + <Size value="{Width=536, Height=16}" /> + <Text value="Additional options" /> + </System.Windows.Forms.GroupBox> + </Controls> + </System.Windows.Forms.Form> +</Components> \ No newline at end of file diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ImportProjectDialog.xfrm b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ImportProjectDialog.xfrm new file mode 100644 index 0000000000..d219d9ed46 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ImportProjectDialog.xfrm @@ -0,0 +1,108 @@ +<Components version="1.0"> + <System.Windows.Forms.Form> + <Name value="MyForm" /> + <ShowInTaskbar value="False" /> + <FormBorderStyle value="FixedDialog" /> + <StartPosition value="CenterParent" /> + <ClientSize value="{Width=442, Height=255}" /> + <MinimizeBox value="False" /> + <DockPadding value="" /> + <Text value="${res:AddIns.ProjectImportExporter.ImportProjectDialog.DialogName}" /> + <AcceptButton value="startButton [System.Windows.Forms.Button], Text: ${res:Global.StartButtonText}" /> + <CancelButton value="cancelButton [System.Windows.Forms.Button], Text: ${res:Global.CancelButtonText}" /> + <MaximizeBox value="False" /> + <Controls> + <System.Windows.Forms.CheckBox> + <Name value="openAfterImportCheckBox" /> + <Location value="{X=152,Y=64}" /> + <Checked value="True" /> + <Size value="{Width=280, Height=24}" /> + <Text value="${res:AddIns.ProjectImportExporter.ImportProjectDialog.OpenAfterInputCheckBox}" /> + <CheckState value="Checked" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="10" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.RichTextBox> + <Name value="formatsRichTextBox" /> + <Anchor value="Top, Bottom, Left, Right" /> + <ReadOnly value="True" /> + <Size value="{Width=426, Height=88}" /> + <Location value="{X=8,Y=128}" /> + <Text value="" /> + <TabIndex value="7" /> + </System.Windows.Forms.RichTextBox> + <System.Windows.Forms.Label> + <Name value="label4" /> + <Text value="${res:AddIns.ProjectImportExporter.ImportProjectDialog.SupportedFormatsLabel}" /> + <TextAlign value="BottomLeft" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="6" /> + <Size value="{Width=426, Height=23}" /> + <Location value="{X=8,Y=104}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Button> + <Name value="outputLocationBrowseButton" /> + <Location value="{X=402,Y=40}" /> + <Size value="{Width=32, Height=21}" /> + <Text value="..." /> + <Anchor value="Top, Right" /> + <TabIndex value="5" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.TextBox> + <Name value="outputLocationTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="4" /> + <Location value="{X=152,Y=40}" /> + <Size value="{Width=242, Height=21}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="label2" /> + <Text value="${res:AddIns.ProjectImportExporter.ImportProjectDialog.OutputLocationLabel}" /> + <TextAlign value="MiddleRight" /> + <TabIndex value="3" /> + <Size value="{Width=152, Height=23}" /> + <Location value="{X=0,Y=40}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Button> + <Name value="projectBrowseButton" /> + <Location value="{X=402,Y=8}" /> + <Size value="{Width=32, Height=21}" /> + <Text value="..." /> + <Anchor value="Top, Right" /> + <TabIndex value="2" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.TextBox> + <Name value="projectTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="1" /> + <Location value="{X=152,Y=8}" /> + <Size value="{Width=242, Height=21}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="label" /> + <Text value="${res:AddIns.ProjectImportExporter.ImportProjectDialog.ProjectInputLabel}" /> + <TextAlign value="MiddleRight" /> + <TabIndex value="0" /> + <Size value="{Width=144, Height=23}" /> + <Location value="{X=8,Y=8}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Button> + <Name value="cancelButton" /> + <Location value="{X=362,Y=225}" /> + <Text value="${res:Global.CancelButtonText}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="9" /> + <DialogResult value="Cancel" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.Button> + <Name value="startButton" /> + <Location value="{X=282,Y=225}" /> + <Text value="${res:Global.StartButtonText}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="8" /> + </System.Windows.Forms.Button> + </Controls> + </System.Windows.Forms.Form> +</Components> \ No newline at end of file diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ProjectImporterExporter.addin b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ProjectImporterExporter.addin new file mode 100644 index 0000000000..55b39ed9bf --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ProjectImporterExporter.addin @@ -0,0 +1,48 @@ +<AddIn name = "Project Importer/Exporter" + author = "Mike Krueger" + copyright = "GPL" + url = "unknown" + description = "imports/exports forgein project files" + version = "1.0.0"> + + <Runtime> + <Import assembly="ProjectImporterExporter.dll"/> + </Runtime> + <Path name = "/SharpDevelop/Workbench/MainMenu/File"> + <MenuItem id = "ImportSeparator" insertafter="SaveAll" insertbefore="PrintSeparator" type = "Separator" /> + <MenuItem id = "ImportProject" + label = "${res:XML.MainMenu.FileMenu.ImportSolution}" + description = "${res:XML.MainMenu.FileMenu.ImportSolution.Description}" + class = "ICSharpCode.SharpDevelop.ProjectImportExporter.Commands.ImportProjectCommand" /> + <Condition iscombineopen="True" action="Disable"> + <MenuItem id = "ExportProject" + label = "${res:XML.MainMenu.FileMenu.ExportSolution}" + description = "${res:XML.MainMenu.FileMenu.ExportSolution.Description}" + class = "ICSharpCode.SharpDevelop.ProjectImportExporter.Commands.ExportProjectCommand" /> + </Condition> + </Path> + + <Path name = "/SharpDevelop/Views/ProjectBrowser/ContextMenu/ProjectBrowserNode"> + <MenuItem id = "Convert" insertafter="SetAsStartupProject" label = "${res:ICSharpCode.SharpDevelop.Commands.Convert}"> + <MenuItem id = "Convert to C#" + label = "${res:ICSharpCode.SharpDevelop.Commands.VBConvertProjectToCSharp}" + class = "ICSharpCode.SharpDevelop.ProjectImportExporter.Commands.ExportProjectToCSharpCommand"/> + <MenuItem id = "Convert to VB.NET" + label = "${res:ICSharpCode.SharpDevelop.Commands.CharpConvertProjectToVB}" + class = "ICSharpCode.SharpDevelop.ProjectImportExporter.Commands.ExportProjectToVBNetCommand"/> + </MenuItem> + </Path> + + + <Path name = "/SharpDevelop/Workbench/MainMenu/Project"> + <MenuItem id = "Convert" insertafter="SetAsStartupProject" label = "${res:ICSharpCode.SharpDevelop.Commands.Convert}"> + <MenuItem id = "Convert to C#" + label = "${res:ICSharpCode.SharpDevelop.Commands.VBConvertProjectToCSharp}" + class = "ICSharpCode.SharpDevelop.ProjectImportExporter.Commands.ExportProjectToCSharpCommand"/> + <MenuItem id = "Convert to VB.NET" + label = "${res:ICSharpCode.SharpDevelop.Commands.CharpConvertProjectToVB}" + class = "ICSharpCode.SharpDevelop.ProjectImportExporter.Commands.ExportProjectToVBNetCommand"/> + </MenuItem> + </Path> + +</AddIn> diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ProjectToVSNetProjectConversion.xsl b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ProjectToVSNetProjectConversion.xsl new file mode 100644 index 0000000000..ef576e96df --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/ProjectToVSNetProjectConversion.xsl @@ -0,0 +1,110 @@ +<?xml version="1.0"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:convtool="urn:convtool"> + <xsl:param name="ProjectGUID"/> + <xsl:param name="LanguageName"/> + <xsl:param name="FrameworkPath"/> + <xsl:template match="/Project"> + <VisualStudioProject> + <xsl:element name = "{$LanguageName}"> + + <xsl:attribute name = "ProjectType">Local</xsl:attribute> + <xsl:attribute name = "ProductVersion">7.10.3077</xsl:attribute> + <xsl:attribute name = "SchemaVersion">2.0</xsl:attribute> + <xsl:attribute name = "ProjectGuid"><xsl:value-of select = "$ProjectGUID"/></xsl:attribute> + + <Build> + <Settings + ApplicationIcon = "{Configuration/CodeGeneration/@win32icon}" + AssemblyKeyContainerName = "" + AssemblyName = "{Configuration/Output/@assembly}" + AssemblyOriginatorKeyFile = "" + DefaultClientScript = "JScript" + DefaultHTMLPageLayout = "Grid" + DefaultTargetSchema = "IE50" + DelaySign = "false" + OutputType = "{Configuration/CodeGeneration/@target}" + PreBuildEvent = "" + PostBuildEvent = "" + RootNamespace = "{@standardNamespace}" + RunPostBuildEvent = "OnBuildSuccess" + StartupObject = "{Configuration/CodeGeneration/@mainclass}" + > + <xsl:for-each select="Configurations/Configuration"> + <Config + Name = "{convtool:AddConfig(@name)}" + AllowUnsafeBlocks = "{CodeGeneration/@unsafecodeallowed}" + BaseAddress = "285212672" + CheckForOverflowUnderflow = "{CodeGeneration/@generateoverflowchecks}" + ConfigurationOverrideFile = "" + DefineConstants = "{CodeGeneration/@definesymbols}" + DocumentationFile = "" + DebugSymbols = "{CodeGeneration/@includedebuginformation}" + FileAlignment = "4096" + IncrementalBuild = "false" + NoStdLib = "{CodeGeneration/@nostdlib}" + NoWarn = "{CodeGeneration/@nowarn}" + Optimize = "{CodeGeneration/@optimize}" + OutputPath = "{Output/@directory}" + RegisterForComInterop = "false" + RemoveIntegerChecks = "false" + TreatWarningsAsErrors = "{convtool:Negate(@runwithwarnings)}" + WarningLevel = "{CodeGeneration/@warninglevel}" + /> + </xsl:for-each> + </Settings> + <References> + <Reference + Name = "System" + AssemblyName = "System" + HintPath = "{$FrameworkPath}System.dll" + /> + <Reference + Name = "System.Data" + AssemblyName = "System.Data" + HintPath = "{$FrameworkPath}System.Data.dll" + /> + <Reference + Name = "System.XML" + AssemblyName = "System.Xml" + HintPath = "{$FrameworkPath}System.XML.dll" + /> + <Reference + Name = "System.Drawing" + AssemblyName = "System.Drawing" + HintPath = "{$FrameworkPath}System.Drawing.dll" + /> + <Reference + Name = "System.Windows.Forms" + AssemblyName = "System.Windows.Forms" + HintPath = "{$FrameworkPath}System.Windows.Forms.dll" + /> + <xsl:for-each select="References/Reference[@type='Assembly']"> + <Reference + Name = "{convtool:FileNameWithoutExtension(@refto)}" + AssemblyName = "{convtool:FileNameWithoutExtension(@refto)}" + HintPath = "{convtool:VerifyFileLocation(@refto)}" + /> + </xsl:for-each> + <xsl:for-each select="References/Reference[@type='Project']"> + <Reference + Name = "{@refto}" + Project = "{convtool:GetProjectGUID(@refto)}" + Package = "{convtool:GetPackageGUID(@refto)}" + /> + </xsl:for-each> + </References> + </Build> + <Files> + <Include> + <xsl:for-each select="Contents/File[@buildaction!='Exclude' and @subtype!='Directory']"> + <File + RelPath = "{convtool:VerifyFileLocation(@name)}" + BuildAction = "{convtool:ConvertBuildAction(@buildaction)}" + /> + </xsl:for-each> + </Include> + </Files> + </xsl:element> + </VisualStudioProject> + </xsl:template> +</xsl:stylesheet> diff --git a/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/VBSolutionConversion.xsl b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/VBSolutionConversion.xsl new file mode 100644 index 0000000000..4ea204dd43 --- /dev/null +++ b/src/AddIns/Misc/ProjectImporterExporter/Project/Resources/VBSolutionConversion.xsl @@ -0,0 +1,121 @@ +<?xml version="1.0"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:convtool="urn:convtool"> + <xsl:param name="ProjectTitle"/> + <xsl:template match="/VisualStudioProject/VisualBasic"> + <Project name = "{$ProjectTitle}" + standardNamespace="{Build/Settings/@RootNamespace}" + description = "" + newfilesearch = "None" + enableviewstate = "True" + version = "1.1" + projecttype = "VBNET"> + + <!-- Transform Contents --> + <Contents> + + <xsl:for-each select="Files/Include/File[@BuildAction ='Compile']"> + <xsl:choose> + <xsl:when test="@Link"> + <File name = "{convtool:VerifyFileLocation(@Link)}" + buildaction="Compile" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:VerifyFileLocation(@RelPath)}" + buildaction="Compile" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + + <!-- convert 'resources' --> + <xsl:for-each select="Files/Include/File[@BuildAction ='EmbeddedResource']"> + <xsl:choose> + <!-- VB.NET in VS has a different resource management than C# --> + <xsl:when test="@Link"> + <File name = "{convtool:ImportDependentResource(@Link,@DependentUpon,/VisualStudioProject/VisualBasic/Build/Settings/@RootNamespace)}" + buildaction="EmbedAsResource" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:ImportDependentResource(@RelPath,@DependentUpon,/VisualStudioProject/VisualBasic/Build/Settings/@RootNamespace)}" + buildaction="EmbedAsResource" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + + <!-- Non-buildable files part of the project --> + <xsl:for-each select="Files/Include/File[(@BuildAction ='None') or (@BuildAction ='Content')]"> + <xsl:choose> + <xsl:when test="@Link"> + <File name = "{convtool:VerifyFileLocation(@Link)}" + buildaction="Nothing" + subtype = "Code"/> + </xsl:when> + <xsl:otherwise> + <File name = "{convtool:VerifyFileLocation(@RelPath)}" + buildaction="Nothing" + subtype = "Code"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </Contents> + + <DeploymentInformation target="" script="" strategy="File" /> + + <!-- Transform Settings --> + + <xsl:for-each select="Build/Settings"> + <Configurations active="Debug"> + <xsl:for-each select="Config"> + + <Configuration runwithwarnings="{convtool:Negate(@TreatWarningsAsErrors)}" name="{@Name}"> + + <xsl:element name = "CodeGeneration" > + <xsl:attribute name = "includedebuginformation"><xsl:value-of select = "convtool:EnsureBool(@DebugSymbols)"/></xsl:attribute> + <xsl:attribute name = "optimize"><xsl:value-of select = "convtool:EnsureBool(@Optimize)"/></xsl:attribute> + <xsl:attribute name = "generateoverflowchecks"><xsl:value-of select = "convtool:EnsureBool(@CheckForOverflowUnderflow)"/></xsl:attribute> + <xsl:attribute name = "rootnamespace"><xsl:value-of select = "../@RootNamespace"/></xsl:attribute> + <xsl:attribute name = "mainclass"><xsl:value-of select = "../@StartupObject"/></xsl:attribute> + <xsl:attribute name = "target"><xsl:value-of select = "../@OutputType"/></xsl:attribute> + <xsl:attribute name = "definesymbols"><xsl:value-of select = "@DefineConstants"/></xsl:attribute> + <xsl:attribute name = "generatexmldocumentation">False</xsl:attribute> + <xsl:attribute name = "win32Icon"><xsl:value-of select = "convtool:VerifyFileLocation(../@ApplicationIcon)"/></xsl:attribute> + <xsl:attribute name = "imports"><xsl:for-each select="/VisualStudioProject/VisualBasic/Build/Imports/Import"><xsl:value-of select = "@Namespace"/>,</xsl:for-each></xsl:attribute> + </xsl:element> + + <VBDOC outputfile="" + enablevbdoc="False" + filestoparse="" + commentprefix="" /> + <Execution consolepause="True" + commandlineparameters="" /> + <Output directory="{@OutputPath}" + assembly="{../@AssemblyName}" /> + </Configuration> + </xsl:for-each> + </Configurations> + </xsl:for-each> + + <!-- Transform References --> + <xsl:apply-templates select="Build/References"/> + </Project> + </xsl:template> + + <!-- Transform references (a bit like frungy) --> + <xsl:template match="References"> + <References> + <xsl:for-each select="Reference[@AssemblyName]"> + <xsl:if test="convtool:ShouldGenerateReference('True', @AssemblyName, @HintPath)"> + <Reference type = "{convtool:GenerateReferenceType(@AssemblyName, @HintPath)}" + refto = "{convtool:GenerateReference(@AssemblyName, @HintPath)}"/> + </xsl:if> + </xsl:for-each> + <xsl:for-each select="Reference[@Project]"> + <Reference type = "Project" + refto = "{@Name}"/> + </xsl:for-each> + </References> + </xsl:template> +</xsl:stylesheet> diff --git a/src/AddIns/Misc/RegExpTk/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/RegExpTk/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..c3205b582f --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("RegExpTk")] +[assembly: AssemblyDescription("Regular expression toolkit")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("www.icsharpcode.net")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 Markus Palme")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin new file mode 100644 index 0000000000..cbc9166722 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.addin @@ -0,0 +1,20 @@ +<AddIn name = "Regular expressions toolkit addin" + author = "Markus Palme" + copyright = "GPL" + url = "unknown" + description = "Testing toolkit for regular expressions" + version = "1.0.0"> + + <Runtime> + <Import assembly="RegExpTk.dll" /> + </Runtime> + + <Path name = "/SharpDevelop/Workbench/MainMenu/Tools"> + <MenuItem id = "RegExpTk" + insertafter = "ShowObjectBrowser" insertbefore = "Separator4" + label = "${res:XML.MainMenu.ToolsMenu.RegularExpressionToolkit}" + description = "${res:XML.MainMenu.ToolsMenu.RegularExpressionToolkit.Description}" + class = "Plugins.RegExpTk.RegExpTkCommand" + /> + </Path> +</AddIn> diff --git a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj new file mode 100644 index 0000000000..74b1bc52f6 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj @@ -0,0 +1,68 @@ +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>8.0.41115</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{64A3E5E6-90BF-47F6-94DF-68C94B62C817}</ProjectGuid> + <AssemblyName>RegExpTk</AssemblyName> + <OutputTarget>Library</OutputTarget> + <WarningLevel>4</WarningLevel> + <NoStdLib>False</NoStdLib> + <NoConfig>False</NoConfig> + <RunPostBuildEvent>OnSuccessfulBuild</RunPostBuildEvent> + <OutputType>Library</OutputType> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>True</DebugSymbols> + <Optimize>True</Optimize> + <AllowUnsafeBlocks>False</AllowUnsafeBlocks> + <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow> + <OutputPath>..\..\..\..\..\AddIns\AddIns\Misc\RegExpTk\</OutputPath> + <TreatWarningsAsErrors>False</TreatWarningsAsErrors> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugSymbols>True</DebugSymbols> + <Optimize>True</Optimize> + <AllowUnsafeBlocks>False</AllowUnsafeBlocks> + <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow> + <OutputPath>..\..\..\AddIns\Misc\RegExpTk\</OutputPath> + <TreatWarningsAsErrors>False</TreatWarningsAsErrors> + </PropertyGroup> + <ItemGroup> + <Compile Include="Src\Commands\MenuCommand.cs" /> + <Compile Include="Src\Dialogs\MainWindow.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Src\Dialogs\GroupForm.cs"> + <SubType>Form</SubType> + </Compile> + <EmbeddedResource Include="Resources\RegExpTkGroupForm.xfrm" /> + <EmbeddedResource Include="Resources\RegExpTkMainForm.xfrm" /> + <Compile Include="Configuration\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj"> + <Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project> + <Name>ICSharpCode.SharpDevelop</Name> + <Private>False</Private> + </ProjectReference> + <ProjectReference Include="..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj"> + <Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project> + <Name>ICSharpCode.Core</Name> + <Private>False</Private> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <None Include="RegExpTk.addin"> + <CopyToOutputDirectory>True</CopyToOutputDirectory> + </None> + </ItemGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.XML" /> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" /> +</Project> \ No newline at end of file diff --git a/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj.user b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj.user new file mode 100644 index 0000000000..96135953c3 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/RegExpTk.csproj.user @@ -0,0 +1,13 @@ +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <StartProgram>..\..\..\..\..\bin\SharpDevelop.exe</StartProgram> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <StartProgram>..\..\..\..\..\bin\SharpDevelop.exe</StartProgram> + </PropertyGroup> + <PropertyGroup> + <LastOpenVersion>8.0.41115</LastOpenVersion> + <ProjectView>ShowAllFiles</ProjectView> + <ProjectTrust>0</ProjectTrust> + </PropertyGroup> +</Project> \ No newline at end of file diff --git a/src/AddIns/Misc/RegExpTk/Project/Resources/RegExpTkGroupForm.xfrm b/src/AddIns/Misc/RegExpTk/Project/Resources/RegExpTkGroupForm.xfrm new file mode 100644 index 0000000000..3c8376b180 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/Resources/RegExpTkGroupForm.xfrm @@ -0,0 +1,125 @@ +<Components version="1.0"> + <System.Windows.Forms.Form> + <Name value="GroupsForm" /> + <FormBorderStyle value="FixedToolWindow" /> + <ClientSize value="{Width=328, Height=218}" /> + <DockPadding value="" /> + <Text value="Groups" /> + <Controls> + <System.Windows.Forms.Button> + <Name value="CloseButton" /> + <Location value="{X=208,Y=184}" /> + <ClientSize value="{Width=112, Height=24}" /> + <Text value="${res:Global.OKButtonText}" /> + <TabIndex value="4" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.ListView> + <Name value="GroupsListView" /> + <GridLines value="True" /> + <TabIndex value="2" /> + <View value="Details" /> + <FullRowSelect value="True" /> + <Location value="{X=8,Y=8}" /> + <ClientSize value="{Width=308, Height=164}" /> + <Columns> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader2" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader3" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader4" /> + <Text value="Länge" /> + </System.Windows.Forms.ColumnHeader> + </Columns> + </System.Windows.Forms.ListView> + </Controls> + </System.Windows.Forms.Form> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader3" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader2" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader7" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader6" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader5" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader4" /> + <Text value="Länge" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader9" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader8" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader20" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader12" /> + <Text value="Länge" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader13" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader10" /> + <Text value="Länge" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader11" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader16" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader17" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader14" /> + <Text value="Länge" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader15" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader18" /> + <Text value="Länge" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader19" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> +</Components> \ No newline at end of file diff --git a/src/AddIns/Misc/RegExpTk/Project/Resources/RegExpTkMainForm.xfrm b/src/AddIns/Misc/RegExpTk/Project/Resources/RegExpTkMainForm.xfrm new file mode 100644 index 0000000000..1923f5d030 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/Resources/RegExpTkMainForm.xfrm @@ -0,0 +1,650 @@ +<Components version="1.0"> + <System.Windows.Forms.Form> + <Name value="MainForm" /> + <ShowInTaskbar value="False" /> + <ClientSize value="{Width=456, Height=526}" /> + <Font value="[Font: Name=Tahoma, Size=11, Units=3, GdiCharSet=1, GdiVerticalFont=False]" /> + <DockPadding value="" /> + <Text value="Regular expression toolkit" /> + <Controls> + <System.Windows.Forms.StatusBar> + <Name value="StatusBar" /> + <TabIndex value="1" /> + <ClientSize value="{Width=456, Height=16}" /> + <Location value="{X=0,Y=510}" /> + </System.Windows.Forms.StatusBar> + <System.Windows.Forms.TabControl> + <Name value="ModesTabControl" /> + <Anchor value="Top, Bottom, Left, Right" /> + <TabIndex value="0" /> + <Font value="[Font: Name=Microsoft Sans Serif, Size=8, Units=3, GdiCharSet=1, GdiVerticalFont=False]" /> + <ClientSize value="{Width=440, Height=496}" /> + <Location value="{X=8,Y=8}" /> + <TabPages> + <System.Windows.Forms.TabPage> + <Name value="TestingTabPage" /> + <DockPadding value="" /> + <Text value="${res:RegExpTk.MainDialog.TestTab}" /> + <ClientSize value="{Width=432, Height=470}" /> + <Location value="{X=4,Y=22}" /> + <Controls> + <System.Windows.Forms.GroupBox> + <Name value="groupBox2" /> + <TabIndex value="6" /> + <Location value="{X=8,Y=160}" /> + <Anchor value="Top, Left, Right" /> + <ClientSize value="{Width=416, Height=120}" /> + <Controls> + <System.Windows.Forms.CheckBox> + <Name value="ReplaceCheckBox" /> + <Location value="{X=8,Y=0}" /> + <ClientSize value="{Width=208, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.Replace}" /> + <TabIndex value="6" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.Label> + <Name value="ReplacementStringLabel" /> + <Text value="${res:RegExpTk.MainDialog.Replacement}" /> + <TabIndex value="7" /> + <ClientSize value="{Width=232, Height=16}" /> + <Location value="{X=16,Y=24}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.TextBox> + <Name value="ReplacementStringTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="8" /> + <Location value="{X=16,Y=40}" /> + <ClientSize value="{Width=380, Height=16}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="ReplaceResultLabel" /> + <Text value="${res:RegExpTk.MainDialog.ReplaceResult}" /> + <TabIndex value="9" /> + <ClientSize value="{Width=224, Height=16}" /> + <Location value="{X=16,Y=69}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.TextBox> + <Name value="ReplaceResultTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="10" /> + <Location value="{X=16,Y=88}" /> + <ClientSize value="{Width=380, Height=16}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + </Controls> + </System.Windows.Forms.GroupBox> + <System.Windows.Forms.TextBox> + <Name value="RegularExpressionTextBox" /> + <Anchor value="Top, Left, Right" /> + <ClientSize value="{Width=380, Height=18}" /> + <Font value="[Font: Name=Courier New, Size=10, Units=3, GdiCharSet=1, GdiVerticalFont=False]" /> + <Location value="{X=8,Y=24}" /> + <Text value="" /> + <TabIndex value="2" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Button> + <Name value="quickInsertButton" /> + <Location value="{X=400,Y=24}" /> + <ClientSize value="{Width=24, Height=22}" /> + <Text value=">" /> + <Anchor value="Top, Right" /> + <TabIndex value="3" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.RichTextBox> + <Name value="InputTextBox" /> + <HideSelection value="False" /> + <Anchor value="Top, Left, Right" /> + <ClientSize value="{Width=363, Height=68}" /> + <ScrollBars value="ForcedVertical" /> + <Location value="{X=8,Y=80}" /> + <Text value="" /> + <TabIndex value="5" /> + </System.Windows.Forms.RichTextBox> + <System.Windows.Forms.ListView> + <Name value="GroupListView" /> + <GridLines value="True" /> + <Anchor value="Top, Bottom, Left, Right" /> + <TabIndex value="14" /> + <View value="Details" /> + <FullRowSelect value="True" /> + <Location value="{X=8,Y=320}" /> + <ClientSize value="{Width=412, Height=132}" /> + <HideSelection value="False" /> + <Columns> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader2" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader3" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader4" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader49" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + </Columns> + </System.Windows.Forms.ListView> + <System.Windows.Forms.Button> + <Name value="OkButton" /> + <Location value="{X=348,Y=288}" /> + <ClientSize value="{Width=75, Height=24}" /> + <Text value="${res:Global.OKButtonText}" /> + <Anchor value="Top, Right" /> + <TabIndex value="13" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.CheckBox> + <Name value="IgnoreCaseCheckBox" /> + <Location value="{X=128,Y=292}" /> + <ClientSize value="{Width=200, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.IgnoreCase}" /> + <TabIndex value="12" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="MultilineCheckBox" /> + <Location value="{X=8,Y=292}" /> + <ClientSize value="{Width=112, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.Multiline}" /> + <TabIndex value="11" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.Label> + <Name value="InputLabel" /> + <Text value="${res:RegExpTk.MainDialog.Input}" /> + <TabIndex value="4" /> + <ClientSize value="{Width=200, Height=16}" /> + <Location value="{X=8,Y=64}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Label> + <Name value="RegularExpressionLabel" /> + <Text value="${res:RegExpTk.MainDialog.Regex}" /> + <TabIndex value="1" /> + <ClientSize value="{Width=184, Height=16}" /> + <Location value="{X=8,Y=8}" /> + </System.Windows.Forms.Label> + </Controls> + </System.Windows.Forms.TabPage> + <System.Windows.Forms.TabPage> + <Name value="CompileTabPage" /> + <DockPadding value="" /> + <Text value="${res:RegExpTk.MainDialog.CompileTab}" /> + <ClientSize value="{Width=432, Height=470}" /> + <Location value="{X=4,Y=22}" /> + <Controls> + <System.Windows.Forms.GroupBox> + <Name value="groupBox" /> + <TabIndex value="20" /> + <Location value="{X=8,Y=176}" /> + <Anchor value="Top, Left, Right" /> + <ClientSize value="{Width=416, Height=8}" /> + </System.Windows.Forms.GroupBox> + <System.Windows.Forms.Splitter> + <Name value="splitter" /> + <TabIndex value="19" /> + <ClientSize value="{Width=3, Height=470}" /> + <Location value="{X=0,Y=0}" /> + </System.Windows.Forms.Splitter> + <System.Windows.Forms.CheckBox> + <Name value="PublibVisibleCompileCheckBox" /> + <Location value="{X=8,Y=152}" /> + <ClientSize value="{Width=248, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.PublicVisible}" /> + <TabIndex value="24" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.Button> + <Name value="CreateAssemblyFileCompileButton" /> + <Location value="{X=312,Y=432}" /> + <ClientSize value="{Width=112, Height=24}" /> + <Text value="${res:RegExpTk.MainDialog.CreateAssembly}" /> + <Anchor value="Bottom, Right" /> + <TabIndex value="32" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.Label> + <Name value="ClassNameCompileLabel" /> + <Text value="${res:RegExpTk.MainDialog.Classname}" /> + <Anchor value="Top" /> + <TabIndex value="22" /> + <ClientSize value="{Width=216, Height=16}" /> + <Location value="{X=200,Y=104}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.Label> + <Name value="NamespaceCompileLabel" /> + <Text value="${res:RegExpTk.MainDialog.Namespace}" /> + <TabIndex value="20" /> + <ClientSize value="{Width=176, Height=16}" /> + <Location value="{X=8,Y=104}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.TextBox> + <Name value="ClassNameCompileTextBox" /> + <Anchor value="Top, Right" /> + <TabIndex value="23" /> + <Location value="{X=200,Y=120}" /> + <ClientSize value="{Width=212, Height=16}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.TextBox> + <Name value="NamespaceCompileTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="21" /> + <Location value="{X=8,Y=120}" /> + <ClientSize value="{Width=180, Height=16}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.CheckBox> + <Name value="MultilineCompileCheckBox" /> + <Location value="{X=224,Y=232}" /> + <ClientSize value="{Width=152, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.Multiline}" /> + <TabIndex value="30" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="RightToLeftCompileCheckBox" /> + <Location value="{X=224,Y=264}" /> + <ClientSize value="{Width=160, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.RightToLeft}" /> + <TabIndex value="31" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="EcmaScriptCompileCheckBox" /> + <Location value="{X=224,Y=200}" /> + <ClientSize value="{Width=168, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.ECMA}" /> + <TabIndex value="29" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="SingleLineCompileCheckBox" /> + <Location value="{X=8,Y=232}" /> + <ClientSize value="{Width=160, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.Singleline}" /> + <TabIndex value="26" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="ExplicitCaptureCompileCheckBox" /> + <Location value="{X=8,Y=296}" /> + <ClientSize value="{Width=160, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.ExplicitCapture}" /> + <TabIndex value="28" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="IgnoreWhitespaceCompileCheckBox" /> + <Location value="{X=8,Y=264}" /> + <ClientSize value="{Width=160, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.IgnoreWhitespace}" /> + <TabIndex value="27" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.CheckBox> + <Name value="IgnoreCaseCompileCheckBox" /> + <Location value="{X=8,Y=200}" /> + <ClientSize value="{Width=208, Height=16}" /> + <Text value="${res:RegExpTk.MainDialog.IgnoreCase}" /> + <TabIndex value="25" /> + </System.Windows.Forms.CheckBox> + <System.Windows.Forms.Button> + <Name value="ChooseAssemblyFileCompileButton" /> + <Location value="{X=392,Y=72}" /> + <ClientSize value="{Width=24, Height=20}" /> + <Text value="..." /> + <Anchor value="Top, Right" /> + <TabIndex value="19" /> + </System.Windows.Forms.Button> + <System.Windows.Forms.TextBox> + <Name value="AssemblyFileCompileFileTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="18" /> + <Location value="{X=8,Y=72}" /> + <ClientSize value="{Width=364, Height=16}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="AssemblyFileCompileLabel" /> + <Text value="${res:RegExpTk.MainDialog.Assembly}" /> + <TabIndex value="17" /> + <ClientSize value="{Width=208, Height=16}" /> + <Location value="{X=8,Y=56}" /> + </System.Windows.Forms.Label> + <System.Windows.Forms.TextBox> + <Name value="RegularExpressionCompileTextBox" /> + <Anchor value="Top, Left, Right" /> + <TabIndex value="16" /> + <Location value="{X=8,Y=24}" /> + <ClientSize value="{Width=404, Height=16}" /> + <Text value="" /> + </System.Windows.Forms.TextBox> + <System.Windows.Forms.Label> + <Name value="RegularExpressionCompileLabel" /> + <Text value="${res:RegExpTk.MainDialog.Regex}" /> + <TabIndex value="15" /> + <ClientSize value="{Width=176, Height=16}" /> + <Location value="{X=8,Y=8}" /> + </System.Windows.Forms.Label> + </Controls> + </System.Windows.Forms.TabPage> + </TabPages> + </System.Windows.Forms.TabControl> + </Controls> + </System.Windows.Forms.Form> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader39" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader12" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader13" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader10" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader11" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader16" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader17" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader14" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader15" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader18" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader19" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader65" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader64" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader67" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader66" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader61" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader63" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader62" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader69" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader68" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader7" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader78" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader52" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader74" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader75" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader76" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader77" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader70" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader71" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader72" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader79" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader60" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader47" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader46" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader45" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader44" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader43" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader3" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader2" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader40" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader6" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader5" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader4" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader49" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader9" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader8" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader73" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader56" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader57" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader54" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader55" /> + <Text value="String" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader50" /> + <Text value="Length" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader51" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader58" /> + <Text value="Start" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader21" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader20" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader23" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader22" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader25" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader24" /> + <Text value="${res:RegExpTk.MainDialog.StartColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader27" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader26" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader29" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader28" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader42" /> + <Text value="End" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader48" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader31" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader32" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader33" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader34" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader35" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader36" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader37" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader38" /> + <Text value="${res:RegExpTk.MainDialog.EndColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader41" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader53" /> + <Text value="${res:RegExpTk.MainDialog.LengthColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader59" /> + <Text value="${res:RegExpTk.MainDialog.GroupsColumn}" /> + </System.Windows.Forms.ColumnHeader> + <System.Windows.Forms.ColumnHeader> + <Name value="columnHeader30" /> + <Text value="${res:RegExpTk.MainDialog.StringColumn}" /> + </System.Windows.Forms.ColumnHeader> +</Components> \ No newline at end of file diff --git a/src/AddIns/Misc/RegExpTk/Project/Src/Commands/MenuCommand.cs b/src/AddIns/Misc/RegExpTk/Project/Src/Commands/MenuCommand.cs new file mode 100644 index 0000000000..6863abba2d --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/Src/Commands/MenuCommand.cs @@ -0,0 +1,23 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Markus Palme" email="MarkusPalme@gmx.de"/> +// <version value="$version"/> +// </file> + +using System; +using ICSharpCode.SharpDevelop; + +namespace Plugins.RegExpTk { + + public class RegExpTkCommand : AbstractMenuCommand + { + + public override void Run() + { + using (RegExpTkDialog dialog = new RegExpTkDialog()) { + dialog.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + } + } + } +} diff --git a/src/AddIns/Misc/RegExpTk/Project/Src/Dialogs/GroupForm.cs b/src/AddIns/Misc/RegExpTk/Project/Src/Dialogs/GroupForm.cs new file mode 100644 index 0000000000..e35a9c6a97 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/Src/Dialogs/GroupForm.cs @@ -0,0 +1,47 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Markus Palme" email="MarkusPalme@gmx.de"/> +// <version value="$version"/> +// </file> + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Text.RegularExpressions; + +using ICSharpCode.SharpDevelop.Gui.XmlForms; + +namespace Plugins.RegExpTk { + + public class GroupForm : BaseSharpDevelopForm + { + public GroupForm(Match match) + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.RegExpTkGroupForm.xfrm")); + + ListView groupsListView = (ListView)ControlDictionary["GroupsListView"]; + ((Button)ControlDictionary["CloseButton"]).Click += new EventHandler(CloseButton_Click); + foreach(Group group in match.Groups) + { + ListViewItem groupItem = groupsListView.Items.Add(group.Value); + groupItem.SubItems.Add(group.Index.ToString()); + groupItem.SubItems.Add((group.Index + group.Length).ToString()); + groupItem.SubItems.Add(group.Length.ToString()); + } + } + + protected override void SetupXmlLoader() + { + xmlLoader.StringValueFilter = new SharpDevelopStringValueFilter(); + xmlLoader.PropertyValueCreator = new SharpDevelopPropertyValueCreator(); + xmlLoader.ObjectCreator = new SharpDevelopObjectCreator(); + } + + void CloseButton_Click(object sender, EventArgs e) + { + Close(); + } + } + +} diff --git a/src/AddIns/Misc/RegExpTk/Project/Src/Dialogs/MainWindow.cs b/src/AddIns/Misc/RegExpTk/Project/Src/Dialogs/MainWindow.cs new file mode 100644 index 0000000000..c926b6e89e --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/Project/Src/Dialogs/MainWindow.cs @@ -0,0 +1,342 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Markus Palme" email="MarkusPalme@gmx.de"/> +// <version value="$version"/> +// </file> + +// thanks to Chris Wille who contributed +// the compile stuff + +using System; +using System.Collections; +using System.Windows.Forms; +using System.Text.RegularExpressions; +using System.Drawing; +using System.Reflection; +using System.IO; + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Gui.XmlForms; +using ICSharpCode.Core; + +namespace Plugins.RegExpTk { + + public class RegExpTkDialog : BaseSharpDevelopForm + { + + class QuickInsert + { + string name; + string text; + + public QuickInsert(string name, string text) + { + Name = name; + Text = text; + } + + public string Name + { + get { + return name; + } + set { + name = value; + } + } + + public string Text + { + get { + return text; + } + set { + text = value; + } + } + } + + + private ErrorProvider compileErrorProvider; + private ContextMenuStrip quickInsertMenu = new ContextMenuStrip(); + private ContextMenuStrip matchListViewContextMenu = new ContextMenuStrip(); + + public RegExpTkDialog() + { + SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.RegExpTkMainForm.xfrm")); + + ArrayList quickies = new ArrayList(); + quickies.Add(new QuickInsert("Ungreedy star", "*?")); + quickies.Add(new QuickInsert("Word character value", "\\w")); + quickies.Add(new QuickInsert("Non-word character value", "\\W")); + quickies.Add(new QuickInsert("Whitespace character", "\\s")); + quickies.Add(new QuickInsert("Non-whitespace character", "\\S")); + quickies.Add(new QuickInsert("Digit character", "\\d")); + quickies.Add(new QuickInsert("Non-digit character", "\\D")); + + foreach (QuickInsert insert in quickies) { + MenuCommand cmd = new MenuCommand(insert.Name, new EventHandler(quickInsert)); + cmd.Tag = insert.Text; + quickInsertMenu.Items.Add(cmd); + } + + matchListViewContextMenu.Items.Add(new MenuCommand("Show groups", new EventHandler(MatchListViewContextMenu_Clicked))); + + ((Button)ControlDictionary["OkButton"]).Click += new EventHandler(OkButton_Click); + ((CheckBox)ControlDictionary["ReplaceCheckBox"]).CheckedChanged += new EventHandler(ReplaceCheckBox_CheckedChanged); + ((ListView)ControlDictionary["GroupListView"]).SelectedIndexChanged += new EventHandler(GroupListView_SelectedIndexChanged); + ((ListView)ControlDictionary["GroupListView"]).DoubleClick += new EventHandler(GroupListView_DoubleClick); + ((ListView)ControlDictionary["GroupListView"]).MouseUp += new MouseEventHandler(GroupListView_MouseUp); + ((Button)ControlDictionary["ChooseAssemblyFileCompileButton"]).Click += new EventHandler(ChooseAssemblyFileCompileButton_Click); + ((Button)ControlDictionary["CreateAssemblyFileCompileButton"]).Click += new EventHandler(CreateAssemblyFile); + ((Button)ControlDictionary["quickInsertButton"]).MouseDown += new MouseEventHandler(showQuickInsertMenu); + ((Button)ControlDictionary["quickInsertButton"]).Image = ResourceService.GetBitmap("Icons.16x16.PasteIcon"); + + ReplaceCheckBox_CheckedChanged((CheckBox)ControlDictionary["ReplaceCheckBox"], null); + + this.AcceptButton=(Button)ControlDictionary["OkButton"]; + + this.StartPosition=FormStartPosition.CenterScreen; + this.Width=Screen.PrimaryScreen.WorkingArea.Width / 2; + + ((TextBox)ControlDictionary["RegularExpressionTextBox"]).TextChanged+=new EventHandler(SetRegEx); + + } + + + private void SetRegEx(object sender, EventArgs ea) { + ((TextBox)ControlDictionary["RegularExpressionCompileTextBox"]).Text=((TextBox)ControlDictionary["RegularExpressionTextBox"]).Text; + } + + + void GroupListView_DoubleClick(object sender, EventArgs e) + { + if(((ListView)ControlDictionary["GroupListView"]).SelectedItems.Count > 0) { + Match match = (Match)((ListView)ControlDictionary["GroupListView"]).SelectedItems[0].Tag; + showGroupForm(match); + } + } + + void MatchListViewContextMenu_Clicked(object sender, EventArgs e) + { + Match match = (Match)((ListView)ControlDictionary["GroupListView"]).SelectedItems[0].Tag; + showGroupForm(match); + + } + + void showGroupForm(Match match) + { + GroupForm groupform = new GroupForm(match); + groupform.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); + } + + void GroupListView_MouseUp(object sender, MouseEventArgs e) + { + if(e.Button == MouseButtons.Right && ((ListView)ControlDictionary["GroupListView"]).SelectedItems.Count > 0) { + Point cords = new Point(((ListView)ControlDictionary["GroupListView"]).Left + e.X, ((ListView)ControlDictionary["GroupListView"]).Top + e.Y + 30); + matchListViewContextMenu.Show(this, cords); + } + } + + protected override void SetupXmlLoader() + { + xmlLoader.StringValueFilter = new SharpDevelopStringValueFilter(); + xmlLoader.PropertyValueCreator = new SharpDevelopPropertyValueCreator(); + xmlLoader.ObjectCreator = new SharpDevelopObjectCreator(); + } + + private void quickInsert(object sender, EventArgs e) + { +//// Alex: changed to text box + ((TextBox)ControlDictionary["RegularExpressionTextBox"]).SelectedText += (string)((MenuCommand)sender).Tag; + } + + private void showQuickInsertMenu(object sender, MouseEventArgs e) + { + ((TextBox)ControlDictionary["RegularExpressionTextBox"]).Select(); + Point cords = new Point(((Button)ControlDictionary["quickInsertButton"]).Left + e.X, ((Button)ControlDictionary["quickInsertButton"]).Top + e.Y + 30); + quickInsertMenu.Show(this, cords); + } + + private void CreateAssemblyFile(object sender, EventArgs e) + { + RegexOptions options = RegexOptions.Compiled; + + if(compileErrorProvider != null) { + compileErrorProvider.Dispose(); + compileErrorProvider = null; + } + compileErrorProvider = new ErrorProvider(); + + // validate input + + bool error = false; + + if(((TextBox)ControlDictionary["ClassNameCompileTextBox"]).Text == "") { + compileErrorProvider.SetError((TextBox)ControlDictionary["ClassNameCompileTextBox"], ResourceService.GetString("RegExpTk.Messages.ClassNameMissing")); + error = true; + } + + if(ControlDictionary["RegularExpressionCompileTextBox"].Text == "") { + compileErrorProvider.SetError((TextBox)ControlDictionary["RegularExpressionCompileTextBox"], ResourceService.GetString("RegExpTk.Messages.RegexMissing")); + error = true; + } + + if(((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"]).Text == "") { + compileErrorProvider.SetError((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"], ResourceService.GetString("RegExpTk.Messages.FilenameMissing")); + error = true; + } + + + + string file_ = ((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"]).Text; + + if(! FileUtility.IsValidFileName(((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"]).Text)) { + compileErrorProvider.SetError((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"], ResourceService.GetString("RegExpTk.Messages.FilenameInvalid")); + error = true; + } + + if(error) return; + + // set options + if(((CheckBox)ControlDictionary["IgnoreCaseCompileCheckBox"]).Checked) + options = options | RegexOptions.IgnoreCase; + + if(((CheckBox)ControlDictionary["SingleLineCompileCheckBox"]).Checked) + options = options | RegexOptions.Singleline; + + if(((CheckBox)ControlDictionary["IgnoreWhitespaceCompileCheckBox"]).Checked) + options = options | RegexOptions.IgnorePatternWhitespace; + + if(((CheckBox)ControlDictionary["ExplicitCaptureCompileCheckBox"]).Checked) + options = options | RegexOptions.ExplicitCapture; + + if(((CheckBox)ControlDictionary["EcmaScriptCompileCheckBox"]).Checked) + options = options | RegexOptions.ECMAScript; + + if(((CheckBox)ControlDictionary["MultilineCompileCheckBox"]).Checked) + options = options | RegexOptions.Multiline; + + if(((CheckBox)ControlDictionary["RightToLeftCompileCheckBox"]).Checked) + options = options | RegexOptions.RightToLeft; + + try { + Regex re = new Regex(((TextBox)ControlDictionary["RegularExpressionCompileTextBox"]).Text, options); + } catch (ArgumentException ae) { + MessageBox.Show(ResourceService.GetString("RegExpTk.Messages.CreationError") + " " + ae.Message); + return; + } + + RegexCompilationInfo rci = new RegexCompilationInfo(((TextBox)ControlDictionary["RegularExpressionCompileTextBox"]).Text, + options, + ((TextBox)ControlDictionary["ClassNameCompileTextBox"]).Text, + ((TextBox)ControlDictionary["NamespaceCompileTextBox"]).Text, + ((CheckBox)ControlDictionary["PublibVisibleCompileCheckBox"]).Checked); + + AssemblyName asmName = new AssemblyName(); + asmName.Name = Path.GetFileNameWithoutExtension(((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"]).Text); + + RegexCompilationInfo[] rciArray = new RegexCompilationInfo[] { rci }; + + try { + Regex.CompileToAssembly(rciArray, asmName); + } catch (ArgumentException ae) { + MessageBox.Show(ResourceService.GetString("RegExpTk.Messages.CompilationError") + " " + ae.Message); + } + + string aboluteFileName = Path.GetFullPath(((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"]).Text); + ((StatusBar)ControlDictionary["StatusBar"]).Text = ResourceService.GetString("RegExpTk.Messages.FileCreated") + " " + aboluteFileName; + } + + private void ChooseAssemblyFileCompileButton_Click(object sender, EventArgs e) + { + SaveFileDialog sfd = new SaveFileDialog(); + + sfd.InitialDirectory = "c:\\"; + sfd.Filter = "Assemblies (*.dll)|*.dll"; + sfd.DefaultExt = "dll"; + sfd.CheckPathExists = true; + + if (sfd.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { + ((TextBox)ControlDictionary["AssemblyFileCompileFileTextBox"]).Text = sfd.FileName; + } + } + + private void OkButton_Click(object sender, System.EventArgs e) + { + MatchCollection matches = null; + RegexOptions options = new RegexOptions(); + + ((TextBox)ControlDictionary["RegularExpressionTextBox"]).ForeColor = System.Drawing.Color.Black; + + if(((CheckBox)(ControlDictionary["IgnoreCaseCheckBox"])).Checked) { + options = options | RegexOptions.IgnoreCase; + } + + if(((CheckBox)(ControlDictionary["MultilineCheckBox"])).Checked) { + options = options | RegexOptions.Multiline; + } + + ((ListView)ControlDictionary["GroupListView"]).Items.Clear(); + + try { + matches = Regex.Matches(((RichTextBox)ControlDictionary["InputTextBox"]).Text, ((TextBox)ControlDictionary["RegularExpressionTextBox"]).Text, options); + if(((CheckBox)ControlDictionary["ReplaceCheckBox"]).Checked) { + ((TextBox)ControlDictionary["ReplaceResultTextBox"]).Text = Regex.Replace(((RichTextBox)ControlDictionary["InputTextBox"]).Text, ((TextBox)ControlDictionary["RegularExpressionTextBox"]).Text, ((TextBox)ControlDictionary["ReplacementStringTextBox"]).Text, options); + } + } + catch(Exception exception) { + ((TextBox)ControlDictionary["RegularExpressionTextBox"]).ForeColor = System.Drawing.Color.Red; + ((StatusBar)ControlDictionary["StatusBar"]).Text = exception.Message; + return; + } + + if(matches.Count != 1) { + ((StatusBar)ControlDictionary["StatusBar"]).Text = matches.Count.ToString() + " " + ResourceService.GetString("RegExpTk.Messages.Match"); + } else { + ((StatusBar)ControlDictionary["StatusBar"]).Text = matches.Count.ToString() + " " + ResourceService.GetString("RegExpTk.Messages.Matches"); + } + + RichTextBox inputBox = (RichTextBox)ControlDictionary["InputTextBox"]; + + TextBox dummy = new TextBox(); + dummy.Text = inputBox.Text; + inputBox.Text = dummy.Text; + + inputBox.Select(0, inputBox.Text.Length); + inputBox.SelectionColor = Color.Black; + inputBox.SelectionFont = dummy.Font; + + foreach (Match match in matches) { + inputBox.Select(match.Index, match.Length); + inputBox.SelectionColor = Color.Blue; + + ListViewItem lvwitem = ((ListView)ControlDictionary["GroupListView"]).Items.Add(match.ToString()); + lvwitem.Tag = match; + lvwitem.SubItems.Add(match.Index.ToString()); + lvwitem.SubItems.Add((match.Index + match.Length).ToString()); + lvwitem.SubItems.Add(match.Length.ToString()); + lvwitem.SubItems.Add(match.Groups.Count.ToString()); + } + inputBox.Select(0, 0); + } + + private void GroupListView_SelectedIndexChanged(object sender, System.EventArgs e) + { + try + { + ((RichTextBox)ControlDictionary["InputTextBox"]).Select(System.Convert.ToInt32(((ListView)ControlDictionary["GroupListView"]).SelectedItems[0].SubItems[1].Text), + System.Convert.ToInt32(((ListView)ControlDictionary["GroupListView"]).SelectedItems[0].SubItems[3].Text)); + } catch { + } + } + + private void ReplaceCheckBox_CheckedChanged(object sender, System.EventArgs e) + { + ((TextBox)ControlDictionary["ReplaceResultTextBox"]).Enabled = ((CheckBox)ControlDictionary["ReplaceCheckBox"]).Checked; + ((TextBox)ControlDictionary["ReplacementStringTextBox"]).Enabled = ((CheckBox)ControlDictionary["ReplaceCheckBox"]).Checked; + } + + } +} diff --git a/src/AddIns/Misc/RegExpTk/RegExpTkPad.cs.old b/src/AddIns/Misc/RegExpTk/RegExpTkPad.cs.old new file mode 100644 index 0000000000..2af1ae14f5 --- /dev/null +++ b/src/AddIns/Misc/RegExpTk/RegExpTkPad.cs.old @@ -0,0 +1,37 @@ +// <file> +// <copyright see="prj:///doc/copyright.txt"/> +// <license see="prj:///doc/license.txt"/> +// <owner name="Markus Palme" email="MarkusPalme@gmx.de"/> +// <version value="$version"/> +// </file> +using System; +using System.Drawing; +using System.Collections; +using System.Diagnostics; +using System.ComponentModel; +using System.Windows.Forms; + +using ICSharpCode.SharpDevelop.Gui.Dialogs; +using ICSharpCode.SharpDevelop.Gui; + +using ICSharpCode.Core.AddIns; +using ICSharpCode.Core.AddIns.Codons; +using ICSharpCode.Core.Properties; + +namespace Plugins.RegExpTk { + + public class RegExpTkCommand : AbstractMenuCommand + { + + public override void Run() + { + RegExpTkDialog dialog = new RegExpTkDialog(); + dialog.ShowDialog(); + } + } + + public class RegExpTkDialog : Form + { + + } +} diff --git a/src/AddIns/Misc/StartPage/Project/Configuration/AssemblyInfo.cs b/src/AddIns/Misc/StartPage/Project/Configuration/AssemblyInfo.cs new file mode 100644 index 0000000000..f762b257af --- /dev/null +++ b/src/AddIns/Misc/StartPage/Project/Configuration/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("StartPage")] +[assembly: AssemblyDescription("VS style Start Page for #develop")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Georg Brandl")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(C) 2002")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("2.0.0.1")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs b/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs new file mode 100644 index 0000000000..564c3c0332 --- /dev/null +++ b/src/AddIns/Misc/StartPage/Project/Src/ICSharpCodePage.cs @@ -0,0 +1,668 @@ +using System; +using System.IO; +using System.Collections; +using System.Text; +using System.Windows.Forms; +using System.Xml; + + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.StartPage +{ + public enum ColorScheme + { + blue, + red, + green, + brown, + orange + } + + public class MenuItem + { + public string Caption, URL; + + public MenuItem(string strCaption, string strUrl) + { + Caption = strCaption; + URL = strUrl; + } + } + + public class ICSharpCodePage + { + ColorScheme _ColorScheme; + + string startPageLocation; + + string m_strMainColColor, m_strSubColColor; + int m_nLeftTopImageWidth, m_nRightTopImageWidth; + bool m_bShowMilestoneContentImage; + + private int nTotalColumns = 0; + + string m_strTitle, m_strMetaDescription, m_strMetaKeywords, m_strMetaAuthor, m_strMetaCopyright; + string m_strStaticStyleSheet, m_strRightBoxHtml; + + bool m_bShowLeftMenu, m_bShowRightBox, m_bShowContentBar; + string m_strContentBarText, m_strTopMenuSelectedItem, m_strLeftMenuSelectedItem; + string m_strVersionText, m_strVersionStatus; + + public string PrimaryColor + { + get { return m_strMainColColor; } + } + + public string SecondaryColor + { + get { return m_strSubColColor; } + } + + public string Title + { + get { return m_strTitle; } + set { m_strTitle = value; } + } + + public bool ShowMilestoneContentImage + { + get { return m_bShowMilestoneContentImage; } + set { m_bShowMilestoneContentImage = value; } + } + + public string MetaDescription + { + get { return m_strMetaDescription; } + set { m_strMetaDescription = value; } + } + + public string MetaKeywords + { + get { return m_strMetaKeywords; } + set { m_strMetaKeywords = value; } + } + + public string MetaAuthor + { + get { return m_strMetaAuthor; } + set { m_strMetaAuthor = value; } + } + + public string MetaCopyright + { + get { return m_strMetaCopyright; } + set { m_strMetaCopyright = value; } + } + + public string StaticStyleSheet + { + get { return m_strStaticStyleSheet; } + set { m_strStaticStyleSheet = value; } + } + + public string ContentBarText + { + get { return m_strContentBarText; } + set { m_strContentBarText = value; } + } + + public bool ShowLeftMenu + { + get { return m_bShowLeftMenu; } + set { m_bShowLeftMenu = value; } + } + + public bool ShowRightBox + { + get { return m_bShowRightBox; } + set { m_bShowRightBox = value; } + } + + public bool ShowContentBar + { + get { return m_bShowContentBar; } + set { m_bShowContentBar = value; } + } + + private ArrayList TopMenu; + private ArrayList LeftMenu; + + public virtual void PopulateTopMenu() + { + + + TopMenu.Add(new MenuItem(StringParser.Parse("${res:StartPage.StartMenu.Name}"), "/Start/opensection")); + TopMenu.Add(new MenuItem(StringParser.Parse("${res:StartPage.ChangeLogMenu.Name}"), "/ChangeLog/opensection")); + TopMenu.Add(new MenuItem(StringParser.Parse("${res:StartPage.AuthorsMenu.Name}"), "/Authors/opensection")); + TopMenu.Add(new MenuItem(StringParser.Parse("${res:StartPage.HelpWantedMenu.Name}"), "/HelpWanted/opensection")); + } + + public virtual void PopulateLeftMenu() + { +// LeftMenu.Add(new MenuItem("Start", "/OpenSource/SD/AnnouncementList.asp")); +// LeftMenu.Add(new MenuItem("ChangeLog", "/OpenSource/SD/WhatsNew.asp")); +// LeftMenu.Add(new MenuItem("Authors", "/OpenSource/SD/NewsHistory.asp")); +// LeftMenu.Add(new MenuItem("Readme", "/OpenSource/SD/NewsHistory.asp")); +// LeftMenu.Add(new MenuItem("Help Wanted", "/pub/relations/")); + } + + public string TopMenuSelectedItem + { + get { return m_strTopMenuSelectedItem; } + set { m_strTopMenuSelectedItem = value; } + } + + public string LeftMenuSelectedItem + { + get { return m_strLeftMenuSelectedItem; } + set { m_strLeftMenuSelectedItem = value; } + } + + public string VersionText + { + get { return m_strVersionText; } + set { m_strVersionText = value; } + } + + public string VersionStatus + { + get { return m_strVersionStatus; } + set { m_strVersionStatus = value; } + } + + public string RightBoxHtml + { + get { return m_strRightBoxHtml; } + set { m_strRightBoxHtml = value; } + } + + public virtual void RenderRightBoxHtml(StringBuilder builder) + { + builder.Append(m_strRightBoxHtml); + } + + public ICSharpCodePage() + { + ColorScheme = ICSharpCode.StartPage.ColorScheme.blue; + + TopMenu = new ArrayList(); + PopulateTopMenu(); + TopMenuSelectedItem = "Home"; + + LeftMenu = new ArrayList(); + PopulateLeftMenu(); + LeftMenuSelectedItem = ""; + + Version v = System.Reflection.Assembly.GetEntryAssembly().GetName().Version; + VersionText = "milestone " + v.Major + "." + v.Minor; + VersionStatus = "Beta"; + + RightBoxHtml = ""; + + StaticStyleSheet = startPageLocation + "/Layout/default.css"; + MetaAuthor = "Christoph Wille - christophw@alphasierrapapa.com"; + MetaCopyright = "(c) 2001-2002 AlphaSierraPapa"; + + ShowLeftMenu = false; + ShowRightBox = false; + ShowContentBar = true; + } + + public ColorScheme ColorScheme + { + get { return _ColorScheme; } + set + { + _ColorScheme = value; + m_bShowMilestoneContentImage = false; + + switch (_ColorScheme) + { + case ColorScheme.blue: + m_nLeftTopImageWidth = 292;//412; + m_nRightTopImageWidth = 363; + m_strSubColColor = "#C2E0FB"; + m_strMainColColor = "#A8C6E3"; + m_bShowMilestoneContentImage = true; + break; + case ColorScheme.red: + m_nLeftTopImageWidth = 214;//334; + m_nRightTopImageWidth = 438; + m_strSubColColor = "#a7a9ac"; + m_strMainColColor = "#d7797d"; + break; + case ColorScheme.brown: + m_nLeftTopImageWidth = 294;//415; + m_nRightTopImageWidth = 359; + m_strSubColColor = "#EEE9E2"; + m_strMainColColor = "#D5D0C9"; + break; + case ColorScheme.green: + m_nLeftTopImageWidth = 259;//450; + m_nRightTopImageWidth = 325; + m_strSubColColor = "#E7EDBB"; + m_strMainColColor = "#CED4A2"; + break; + case ColorScheme.orange: + m_nLeftTopImageWidth = 191;//311; + m_nRightTopImageWidth = 460; + m_strSubColColor = "#F4D97B"; + m_strMainColColor = "#E7CD6F"; + break; + } + } + } + + public virtual void RenderHeaderSection(StringBuilder builder) + { + builder.Append("<html><head><title>"); + builder.Append(Title); + builder.Append("\r\n"); + builder.Append("\r\n"); + + + + + builder.Append("\r\n"); + builder.Append("\r\n"); + builder.Append("\r\n\r\n\r\n\r\n\r\n\r\n\r\n"); + } + + public virtual void RenderPageEndSection(StringBuilder builder) + { + builder.Append("\r\n\r\n"); + } + + public virtual void RenderPageTopSection(StringBuilder builder) + { + builder.Append("
"); + builder.Append("\r\n"); + builder.Append("\r\n"); + builder.Append("\r\n"); + builder.Append("\r\n
 
\r\n"); + builder.Append(""); + builder.Append("
"); + builder.Append("\r\n"); + builder.Append("\r\n"); + + int nTopMenuElements = TopMenu.Count; + foreach (MenuItem de in TopMenu) + { + --nTopMenuElements; + + builder.Append("\r\n"); + } + else + { + builder.Append("\">"); + builder.Append(de.Caption); + builder.Append("\r\n"); + } + + if (0 != nTopMenuElements) + { + builder.Append("\r\n"); + } + } + + builder.Append("
"); + builder.Append(de.Caption); + builder.Append("
\r\n"); + } + + public virtual void RenderLeftMenu(StringBuilder builder) + { + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append(""); + + int nLeftMenuElements = LeftMenu.Count; + foreach (MenuItem de in LeftMenu) + { + --nLeftMenuElements; + builder.Append(""); + + if (0 == String.Compare(de.Caption, m_strLeftMenuSelectedItem, true)) + { + builder.Append("\r\n"); + builder.Append("\r\n"); + } + else + { + builder.Append("\r\n"); + builder.Append("\r\n"); + } + + if (0 != nLeftMenuElements) + { + builder.Append("\r\n"); + } + } + + builder.Append("
"); + builder.Append(de.Caption); + builder.Append("
"); + builder.Append(de.Caption); + builder.Append("
"); + builder.Append(""); + } + + public virtual void RenderFirstPageBodySection(StringBuilder builder) + { + builder.Append("
\r\n"); + + if (ShowContentBar) + { + nTotalColumns = 1; + builder.Append(""); + + if (ShowLeftMenu) + { + builder.Append(""); + builder.Append(""); + nTotalColumns += 2; + } + + builder.Append("\r\n"); + + if (ShowRightBox) + { + builder.Append(""); + if (ShowMilestoneContentImage) + { + builder.Append(""); + } + else + { + builder.Append(""); + } + nTotalColumns += 2; + } + + builder.Append(""); + } + + builder.Append(""); + if (ShowLeftMenu) + { + RenderLeftMenu(builder); + } + + builder.Append("\r\n"); + if (ShowRightBox) + { + RenderRightBox(builder); + } + + builder.Append("\r\n"); + + string strSubColor2Use = "#ffffff"; + if (ShowLeftMenu) + { + builder.Append(""); + builder.Append("\r\n"); + } + + builder.Append( "\r\n"); + + if (ShowRightBox) + { + builder.Append(""); + builder.Append("\r\n"); + } + builder.Append("\r\n"); + builder.Append("
"); + builder.Append(ContentBarText); // TODO for virtual + builder.Append("
\r\n"); + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append("
\r\n"); + + + } + + public virtual void RenderFinalPageBodySection(StringBuilder builder) + { + builder.Append("
"); + builder.Append(""); + builder.Append("Copyright ©2000-2004 IC#SharpCode. Released under the terms of the GNU General Public License.
\r\n"); + } + + public virtual void RenderRightBox(StringBuilder builder) + { + builder.Append("\r\n"); + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append("
"); + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append("
"); + builder.Append(VersionText); + builder.Append("
"); + builder.Append(VersionStatus); + builder.Append("
"); + builder.Append(""); + builder.Append(""); + builder.Append(""); + builder.Append("
"); + RenderRightBoxHtml(builder); + builder.Append("
"); + } + public string[] projectFiles; + + StringBuilder projectSection = null; + public void RenderSectionStartBody(StringBuilder builder) + { + + if (projectSection == null) { + projectSection = new StringBuilder(); + projectSection.Append("
\n"); + projectSection.Append(String.Format("\n", + StringParser.Parse("${res:StartPage.StartMenu.NameTable}"), + StringParser.Parse("${res:StartPage.StartMenu.ModifiedTable}"), + StringParser.Parse("${res:StartPage.StartMenu.LocationTable}") + )); + + try { + // Get the recent projects + projectFiles = new string[FileService.RecentOpen.RecentProject.Count]; + for (int i = 0; i < FileService.RecentOpen.RecentProject.Count; ++i) { + string fileName = FileService.RecentOpen.RecentProject[i].ToString(); + // if the file does not exist, goto next one + if (!System.IO.File.Exists(fileName)) { + continue; + } + projectFiles[i] = fileName; + projectSection.Append("\n"); + } + } catch {} + projectSection.Append("
{0}{1}{2}
"); + projectSection.Append(""); + projectSection.Append(Path.GetFileNameWithoutExtension(fileName)); + projectSection.Append(""); + projectSection.Append(""); + System.IO.FileInfo fInfo = new System.IO.FileInfo(fileName); + projectSection.Append(fInfo.LastWriteTime.ToShortDateString()); + projectSection.Append(""); + projectSection.Append(fileName); + projectSection.Append("


"); + projectSection.Append(String.Format("\n", + StringParser.Parse("${res:StartPage.StartMenu.OpenCombineButton}") + )); + projectSection.Append(String.Format("\n", + StringParser.Parse("${res:StartPage.StartMenu.NewCombineButton}") + )); + projectSection.Append("


"); + } + builder.Append(projectSection.ToString()); + } + + public void RenderSectionAuthorBody(StringBuilder builder) + { + try { + builder.Append("