Index: anches/HeuristicLab.Hive-3.4/CopyAssembly.cmd
===================================================================
--- /branches/HeuristicLab.Hive-3.4/CopyAssembly.cmd (revision 5049)
+++ (revision )
@@ -1,5 +1,0 @@
-set target=C:\Program Files\HeuristicLab 3.3
-
-echo Copying %ProjectName%
-copy "%TargetPath%" "%target%"
-echo ---------------------------
Index: anches/HeuristicLab.Hive-3.4/HeuristicLab 3.3.exe.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/HeuristicLab 3.3.exe.config (revision 5049)
+++ (revision )
@@ -1,132 +1,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- http://services.heuristiclab.com/Deployment-3.3/Update.svc
-
-
- anonymous
-
-
- GetTheLab!
-
-
- http://services.heuristiclab.com/Deployment-3.3/Admin.svc
-
-
- False
-
-
-
-
- True
-
-
- False
-
-
- True
-
-
- True
-
-
- True
-
-
- False
-
-
-
-
-
-
-
-
-
-
-
-
Index: anches/HeuristicLab.Hive-3.4/HeuristicLab.Hive-3.3.dll.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/HeuristicLab.Hive-3.3.dll.config (revision 5049)
+++ (revision )
@@ -1,12 +1,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
Index: anches/HeuristicLab.Hive-3.4/HeuristicLab.Hive.sln
===================================================================
--- /branches/HeuristicLab.Hive-3.4/HeuristicLab.Hive.sln (revision 5049)
+++ (revision )
@@ -1,155 +1,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Hive-3.4", "HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj", "{F98A1740-9AC9-4D36-A582-6A2D0D06978D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Slave-3.4", "HeuristicLab.Clients.Hive.Slave\3.4\HeuristicLab.Clients.Hive.Slave-3.4.csproj", "{989FE92B-484E-41EE-87E2-6A24AF0381D8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Hive.Common-3.4", "HeuristicLab.Services.Hive.Common\3.4\HeuristicLab.Services.Hive.Common-3.4.csproj", "{14424A16-48D4-445E-80BF-DDF617548BBB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Hive.DataAccess-3.4", "HeuristicLab.Services.Hive.DataAccess\3.4\HeuristicLab.Services.Hive.DataAccess-3.4.csproj", "{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{EE1E22D1-0141-4C16-ADC6-333120BD21DE}"
- ProjectSection(SolutionItems) = preProject
- ConfigMerger.exe = ConfigMerger.exe
- CopyAssembly.cmd = CopyAssembly.cmd
- HeuristicLab 3.3.exe.config = HeuristicLab 3.3.exe.config
- HeuristicLab.Hive-3.3.dll.config = HeuristicLab.Hive-3.3.dll.config
- MergeConfigs.cmd = MergeConfigs.cmd
- PreBuildEvent.cmd = PreBuildEvent.cmd
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive-3.4", "HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj", "{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Views-3.4", "HeuristicLab.Clients.Hive.Views\3.4\HeuristicLab.Clients.Hive.Views-3.4.csproj", "{E1D6C801-892A-406A-B606-F158E36DD3C3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Slave.Views-3.4", "HeuristicLab.Clients.Hive.Slave.Views\3.4\HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj", "{8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Hive-3.4", "HeuristicLab.Services.Hive\3.4\HeuristicLab.Services.Hive-3.4.csproj", "{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}"
-EndProject
-Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "3.4", "HeuristicLab.Services.Hive.Web\3.4\", "{0CA6706D-A569-45DE-A85C-4158891CC1BC}"
- ProjectSection(WebsiteProperties) = preProject
- TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
- Debug.AspNetCompiler.VirtualPath = "/3.4"
- Debug.AspNetCompiler.PhysicalPath = "HeuristicLab.Services.Hive.Web\3.4\"
- Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\3.4\"
- Debug.AspNetCompiler.Updateable = "true"
- Debug.AspNetCompiler.ForceOverwrite = "true"
- Debug.AspNetCompiler.FixedNames = "false"
- Debug.AspNetCompiler.Debug = "True"
- Release.AspNetCompiler.VirtualPath = "/3.4"
- Release.AspNetCompiler.PhysicalPath = "HeuristicLab.Services.Hive.Web\3.4\"
- Release.AspNetCompiler.TargetPath = "PrecompiledWeb\3.4\"
- Release.AspNetCompiler.Updateable = "true"
- Release.AspNetCompiler.ForceOverwrite = "true"
- Release.AspNetCompiler.FixedNames = "false"
- Release.AspNetCompiler.Debug = "False"
- VWDPort = "1649"
- DefaultWebSiteLanguage = "Visual C#"
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|Mixed Platforms = Debug|Mixed Platforms
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|Mixed Platforms = Release|Mixed Platforms
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Any CPU.Build.0 = Release|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|x86.ActiveCfg = Release|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Any CPU.Build.0 = Release|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|x86.ActiveCfg = Release|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Any CPU.Build.0 = Release|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|x86.ActiveCfg = Release|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Any CPU.Build.0 = Release|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|x86.ActiveCfg = Release|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Any CPU.Build.0 = Release|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|x86.ActiveCfg = Release|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Any CPU.Build.0 = Release|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|x86.ActiveCfg = Release|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Any CPU.Build.0 = Release|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|x86.ActiveCfg = Release|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Any CPU.Build.0 = Release|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|x86.ActiveCfg = Release|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Any CPU.ActiveCfg = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Any CPU.Build.0 = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Mixed Platforms.Build.0 = Debug|Any CPU
- {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|x86.ActiveCfg = Debug|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
Index: anches/HeuristicLab.Hive-3.4/MergeConfigs.cmd
===================================================================
--- /branches/HeuristicLab.Hive-3.4/MergeConfigs.cmd (revision 5049)
+++ (revision )
@@ -1,11 +1,0 @@
-copy "%SolutionDir%HeuristicLab.Hive-3.3.dll.config" "%TargetDir%"
-
-%SolutionDir%ConfigMerger "%SolutionDir%HeuristicLab.Services.Hive\3.3\app.config" "%TargetDir%HeuristicLab.Hive-3.3.dll.config"
-%SolutionDir%ConfigMerger "%SolutionDir%HeuristicLab.Services.Hive.DataAccess\3.3\app.config" "%TargetDir%HeuristicLab.Hive-3.3.dll.config"
-%SolutionDir%ConfigMerger "%SolutionDir%HeuristicLab.Clients.Hive\3.3\app.config" "%TargetDir%HeuristicLab.Hive-3.3.dll.config"
-
-copy "%SolutionDir%HeuristicLab 3.3.exe.config" "%TargetDir%"
-
-%SolutionDir%ConfigMerger "%TargetDir%HeuristicLab.Hive-3.3.dll.config" "%TargetDir%HeuristicLab 3.3.exe.config"
-copy "%TargetDir%HeuristicLab 3.3.exe.config" "asdf.config"
-copy "%TargetDir%HeuristicLab 3.3.exe.config" "%target%"
Index: anches/HeuristicLab.Hive-3.4/PreBuildEvent.cmd
===================================================================
--- /branches/HeuristicLab.Hive-3.4/PreBuildEvent.cmd (revision 5049)
+++ (revision )
@@ -1,2 +1,0 @@
-cd %ProjectDir%
-for /r %%i in (*.cs.frame) do SubWCRev . %%i %%~dpi%%~ni
Index: /branches/HeuristicLab.Hive-3.4/sources/CopyAssembly.cmd
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/CopyAssembly.cmd (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/CopyAssembly.cmd (revision 5050)
@@ -0,0 +1,5 @@
+set target=C:\Program Files\HeuristicLab 3.3
+
+echo Copying %ProjectName%
+copy "%TargetPath%" "%target%"
+echo ---------------------------
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab 3.3.exe.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab 3.3.exe.config (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab 3.3.exe.config (revision 5050)
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ http://services.heuristiclab.com/Deployment-3.3/Update.svc
+
+
+ anonymous
+
+
+ GetTheLab!
+
+
+ http://services.heuristiclab.com/Deployment-3.3/Admin.svc
+
+
+ False
+
+
+
+
+ True
+
+
+ False
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj (revision 5050)
@@ -0,0 +1,90 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}
+ Library
+ Properties
+ HeuristicLab.Clients.Hive.Slave.Views
+ HeuristicLab.Clients.Hive.Slave.Views-3.4
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLabClientsHiveSlaveViewsPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLabClientsHiveSlaveViewsPlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/HeuristicLabClientsHiveSlaveViewsPlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Slave.Views {
+ [Plugin("HeuristicLab.Clients.Hive.Slave.Views", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Clients.Hive.Slave.Views-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabClientsHiveSlaveViewsPlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave.Views/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Clients.Hive.Slave.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("a5114d90-9d18-4504-bcb7-1e24734f428d")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLab.Clients.Hive.Slave-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLab.Clients.Hive.Slave-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLab.Clients.Hive.Slave-3.4.csproj (revision 5050)
@@ -0,0 +1,89 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}
+ Library
+ Properties
+ HeuristicLab.Clients.Hive.Slave
+ HeuristicLab.Clients.Hive.Slave-3.4
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLabClientsHiveSlavePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLabClientsHiveSlavePlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/HeuristicLabClientsHiveSlavePlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Slave {
+ [Plugin("HeuristicLab.Clients.Hive.Slave", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Clients.Hive.Slave-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabClientsHiveSlavePlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Clients.Hive.Slave")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("360abd06-33ae-41f5-a5b1-ca9e89b167f7")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.Designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.Designer.cs (revision 5050)
@@ -0,0 +1,172 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class ConnectionSetupView {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConnectionSetupView));
+ this.userLabel = new System.Windows.Forms.Label();
+ this.userTextBox = new System.Windows.Forms.TextBox();
+ this.passwordLabel = new System.Windows.Forms.Label();
+ this.passwordTextBox = new System.Windows.Forms.TextBox();
+ this.applyButton = new System.Windows.Forms.Button();
+ this.savePasswordCheckbox = new System.Windows.Forms.CheckBox();
+ this.cancelButton = new System.Windows.Forms.Button();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.SuspendLayout();
+ //
+ // userLabel
+ //
+ this.userLabel.AutoSize = true;
+ this.userLabel.Location = new System.Drawing.Point(3, 6);
+ this.userLabel.Name = "userLabel";
+ this.userLabel.Size = new System.Drawing.Size(58, 13);
+ this.userLabel.TabIndex = 3;
+ this.userLabel.Text = "&Username:";
+ //
+ // userTextBox
+ //
+ this.userTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.userTextBox.Location = new System.Drawing.Point(91, 3);
+ this.userTextBox.Name = "userTextBox";
+ this.userTextBox.Size = new System.Drawing.Size(189, 20);
+ this.userTextBox.TabIndex = 0;
+ this.toolTip.SetToolTip(this.userTextBox, "Username used to connect to the HeuristicLab plugin deployment service");
+ //
+ // passwordLabel
+ //
+ this.passwordLabel.AutoSize = true;
+ this.passwordLabel.Location = new System.Drawing.Point(3, 32);
+ this.passwordLabel.Name = "passwordLabel";
+ this.passwordLabel.Size = new System.Drawing.Size(56, 13);
+ this.passwordLabel.TabIndex = 5;
+ this.passwordLabel.Text = "&Password:";
+ //
+ // passwordTextBox
+ //
+ this.passwordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.passwordTextBox.Location = new System.Drawing.Point(91, 29);
+ this.passwordTextBox.Name = "passwordTextBox";
+ this.passwordTextBox.Size = new System.Drawing.Size(189, 20);
+ this.passwordTextBox.TabIndex = 1;
+ this.toolTip.SetToolTip(this.passwordTextBox, "Passwort used to connect to the HeuristicLab plugin deployment service");
+ this.passwordTextBox.UseSystemPasswordChar = true;
+ //
+ // applyButton
+ //
+ this.applyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.applyButton.Location = new System.Drawing.Point(124, 79);
+ this.applyButton.Name = "applyButton";
+ this.applyButton.Size = new System.Drawing.Size(75, 23);
+ this.applyButton.TabIndex = 2;
+ this.applyButton.Text = "&OK";
+ this.toolTip.SetToolTip(this.applyButton, "Apply and save changes");
+ this.applyButton.UseVisualStyleBackColor = true;
+ this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
+ //
+ // savePasswordCheckbox
+ //
+ this.savePasswordCheckbox.AutoSize = true;
+ this.savePasswordCheckbox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.savePasswordCheckbox.Location = new System.Drawing.Point(3, 55);
+ this.savePasswordCheckbox.Name = "savePasswordCheckbox";
+ this.savePasswordCheckbox.Size = new System.Drawing.Size(103, 17);
+ this.savePasswordCheckbox.TabIndex = 2;
+ this.savePasswordCheckbox.Text = "&Save Password:";
+ this.toolTip.SetToolTip(this.savePasswordCheckbox, "Check to save the user credentials to disk");
+ this.savePasswordCheckbox.UseVisualStyleBackColor = true;
+ //
+ // cancelButton
+ //
+ this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.cancelButton.Location = new System.Drawing.Point(205, 79);
+ this.cancelButton.Name = "cancelButton";
+ this.cancelButton.Size = new System.Drawing.Size(75, 23);
+ this.cancelButton.TabIndex = 3;
+ this.cancelButton.Text = "&Cancel";
+ this.toolTip.SetToolTip(this.cancelButton, "Cancel and revert changes");
+ this.cancelButton.UseVisualStyleBackColor = true;
+ this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+ //
+ // ConnectionSetupView
+ //
+ this.AcceptButton = this.applyButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.cancelButton;
+ this.ClientSize = new System.Drawing.Size(292, 114);
+ this.Controls.Add(this.userTextBox);
+ this.Controls.Add(this.userLabel);
+ this.Controls.Add(this.cancelButton);
+ this.Controls.Add(this.savePasswordCheckbox);
+ this.Controls.Add(this.passwordTextBox);
+ this.Controls.Add(this.applyButton);
+ this.Controls.Add(this.passwordLabel);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "ConnectionSetupView";
+ this.ShowInTaskbar = false;
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Edit Hive Connection Settings";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label userLabel;
+ private System.Windows.Forms.TextBox userTextBox;
+ private System.Windows.Forms.Label passwordLabel;
+ private System.Windows.Forms.TextBox passwordTextBox;
+ private System.Windows.Forms.Button applyButton;
+ private System.Windows.Forms.CheckBox savePasswordCheckbox;
+ private System.Windows.Forms.Button cancelButton;
+ private System.Windows.Forms.ToolTip toolTip;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.cs (revision 5050)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ internal partial class ConnectionSetupView : Form {
+ public ConnectionSetupView() {
+ InitializeComponent();
+
+ userTextBox.Text = HeuristicLab.Clients.Hive.Properties.Settings.Default.HiveUsername;
+ passwordTextBox.Text = HeuristicLab.Clients.Hive.Properties.Settings.Default.HivePassword;
+ savePasswordCheckbox.Checked = !string.IsNullOrEmpty(passwordTextBox.Text);
+ }
+
+ private void applyButton_Click(object sender, EventArgs e) {
+ if (!savePasswordCheckbox.Checked) {
+ // make sure we don't save username or password
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.HiveUsername = string.Empty;
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.HivePassword = string.Empty;
+ // save
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.Save();
+ // set user name and password for current process
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.HiveUsername = userTextBox.Text;
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.HivePassword = passwordTextBox.Text;
+ } else {
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.HiveUsername = userTextBox.Text;
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.HivePassword = passwordTextBox.Text;
+ HeuristicLab.Clients.Hive.Properties.Settings.Default.Save();
+ }
+ Close();
+ }
+
+ private void cancelButton_Click(object sender, EventArgs e) {
+ Close();
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.resx (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/ConnectionSetupView.resx (revision 5050)
@@ -0,0 +1,1790 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ AAABAAUAEBAAAAEAIABoBAAAVgAAACAgAAABACAAqBAAAL4EAAAwMAAAAQAgAKglAABmFQAAQEAAAAEA
+ IAAoQgAADjsAAICAAAABACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR/gAbk/YAAAAAABuS9gAAAAAAGpD2AAAAAAAAAAAAAAAAABuQ
+ 9QAAAAAAAAAAAByS9QAAAAAAAAAAAAAAAAAakfUAAAAAABuR9QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHJD2QAAAAAAAAAAAGo/4CBuR9f8akPVCAAAAABuT9gAAAAAAG5H1/xuR9YEbkPYUG5H1/xqR
+ 9v8bkfX/G5H1/xuS9P8bkfX/GpH1QwAAAAAbkfX/G5H1eQAAAAAAAAAAAAAAABuR9cgbkPSjAAAAABuR
+ 9f8dkfWZG5H1QRyR9kAbkfWrG5L1TwAAAAAAAAAAHJH1zhuR9p4AAAAAAAAAAAAAAAAckvaHG5H15QAA
+ AAAbkfXkHJH2hgAAAAAAAAAAAAAAAAAAAAAbkvUAAAAAABuS9YwbkfXiGpHzJhuS9TQbkfQwG5H1fhuR
+ 9f8AAAAAG5L1qhuR9cUAAAAAHJD2AAAAAAAbkfYAAAAAAAAAAAAbkfVqG5H1/xuR9f8akfX/G5H1/xuR
+ 9f8bkfX/GpLzFhuQ9n0bkfX/AAAAABiQ9gAAAAAAAAAAAAAAAAAAAAAAG5H2KRuR9f8ckfYcI5D3Ax+U
+ /AUAAAAAG5H1/xyR9VEckvVBG5H1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckfX/GpH1TgAA
+ AAAAAAAAAAAAABuR9esakfWBGI7xBhyR9f8akfQwAAAAAAAAAAAAAAAAAAAAABuS9QAAAAAAG5L1+huR
+ 9YAAAAAAGpH1AAAAAAAbkfalG5H0ugAAAAAbkfX/HJL1bwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR
+ 9ccbkfXIAAAAAAAAAAAAAAAAG5L17BuR9f8dkvMXG5H17BqR9Z0AAAAAAAAAAAAAAAAAAAAAAAAAABuR
+ 9QEAAAAAAAAAABuR9QEbkfQAAAAAAB6P9w8akfXwAAAAAAAAAAAAAAAAG5H1AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR9gAAAAAAAAAAABqR9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5L1AAAAAAAckvQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//AAD//wAA//8AALyBAAC8mwAAnJ8AAJ6fAADA3wAA3t8AAN5fAADOXwAAzk8AAP9/
+ AAD//wAA//8AAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqQ
+ 9gAAAAAAAAAAABuT9wAAAAAAAAAAAAAAAAAckvYAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAByS9gAAAAAAG5H26xuS9lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvUVAAAAABqR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2AAAAAAAbkfYAJZTtAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//////////////////////////////78fxwAPH8cABx/HAB8f5x+/H+Mf/5/jH/+f4
+ 5//j+OP/4ADj/+AA4//j/GP/8/xj//H8c//x/HH/8f5x//H+cf/5/BH/+f4x///+P////3//////////
+ ////////////////////////KAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL1AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByS9gAbkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJH2AByS9gIAAAAAHJH1TRuS
+ 9v8bkfb/G5H1TgAAAAAAAAAAHJH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByS9gAAAAAAHJL2AByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAek/YAAAAAABuR9ocbkvXlGpL2DgAAAAAakPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAckvUAAAAAABuR9hEbkvUuAAAAAByR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAakfgAHJL1AQAAAAAAAAAAHZH2ABuS9QAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR9gAckvUBAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAD///////8AAP//
+ /////wAA////////AAD///////8AAP///////wAA////////AAD//////x8AAMH/w8AADwAA4f/D4AAD
+ AADh/8HgAAMAAOH/4eAADwAA4f/h4f8fAADg/+Hh//8AAPD/4eD//wAA8P/h8P//AADw//Dw//8AAPD/
+ 8PD//wAA8P/w8P//AADwAADw//8AAPgAAPD//wAA+AAAeH//AAD4AAB4f/8AAPg/+Hh//wAA+D/4eH//
+ AAD8P/h4f/8AAPw/+Hg//wAA/D/8PD//AAD8P/w8P/8AAPw//Dw//wAA/B/8PD//AAD+H/w8P/8AAP4f
+ +Awf/wAA/h/4Dh//AAD+H/weH/8AAP///h///wAA////P///AAD///8///8AAP///////wAA////////
+ AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AACgA
+ AABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAdk/YAAAAAAB2T9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAbkvcAAAAAAAAAAAAbk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqQ9gQbk/cUAAAAAEac7AAckvYAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAckvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AByS
+ 9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2U9wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAHZP2AAAAAAAAAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2/xyR
+ 9oEAAAAAAAAAAByS9gAfkPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9ikdk/crG5P3LhyS
+ 9zEck/c0HJL3LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZb3ARyS9hQckvcSHZP3Eh2R9hIbkfcTIJX0BAAAAAAck/cAAAAAAAAAAAAAAAAAHJL2ExyQ
+ 9hIckvUSHZP3EhyS9hIdkvYSHJL2Eh2T9xIdkfYSHZP3EhyU9xIck/YSHZH2EhyT9xIck/cSG5D2EhyT
+ 9xIckfYSG5r9AhyS9/8ckvb/HJL2+hyS9kAAAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAHZP2AAAA
+ AAAckvbSHJL2/xyS9v8ckvb/HZP2/xyS9v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvb/HJL2/xyS9v8ck/f/HZL2/xuS9ooAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByS9u4ck/b/HJL2/x2S9/8ck/f/HJP3/xyS9/8ckvb/HJP3/xyS9v8ckff/HJL2/xyT
+ 9/8ckvb/HJL2/x2T9/8ckfb/HJL2/xyS9v8ckvb9HJL2/xyS9v0ckvb/HJL2xR+R+AcAAAAAAAAAAByS
+ 9wAAAAAAAAAAAByS9gAAAAAAG5H3hh2T9v8ckvb+HJL2/hyS9v4ckvb/IZ3/AQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9gAAAAAAHJL2zRyS9v8ckvb+HJL2/hyS
+ 9v8ckfbAAAAAAAAAAAAAAAAAG5H1AAAAAAAckvevHJL1/xyS9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS
+ 9v4ckvb+HJL2/hyS9v4ckvf+HJL2/hyS9v4ck/b9HJL2/hyS9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyT
+ 9v8ckvb/HJP1ggAAAAAAAAAAHZL2AAAAAAAAAAAAAAAAAB2S91Yckvb/HJL2/hyS9v4ckvb/HJL2/xyS
+ 9ikAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdlPQAAAAAAByS
+ 9pYckvb/HJL3/hyS9/4ckvf/HJL29AAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2fByS9v8ckvb+HJL2/hyS
+ 9v8ckvf/HJL2/hyS9/4ckvf+HJL2/xyR9v8ckvb/HJL3/hyS9v8ckvf/HJP2/hyR9/8ckvb/HJL2/hyS
+ 9v4ckvb/HJL3/xyS9v4ckvf+HZL2/hyS9/8ckvb/HZH1IQAAAAAAAAAAHJL2AAAAAAAakvQYHJL2/xyS
+ 9v8ckvb+HJL2/xyS9v8bkvZXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAckvZhHJL2/xyS9v4ckvb+HJL2/hyS9v8dk/cJAAAAAAAAAAAAAAAAAAAAAB2S
+ 9kwckvb/HJL2/hyS9v4ckvb/HJL2/xyS9v4ckvb+HJL2/hyS9v8ckfb/HJL2/xyS9/4ckvb/HJL2/xyT
+ 9/4ckvb/HJL2/xyS9v4ckvb+HJL2/xyS9v8ckvb+HJL2/hyS9v8ckvb+HJL2RgAAAAAckvUAAAAAAAAA
+ AAAAAAAAAAAAAByS9v8dkvb+HJP2/hyS9f8ckvb/HZP2kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6U9QAAAAAAHJP2IxyS9v8dkvb+HJP2/hyS9v8dkvb/G5L2NAAA
+ AAAAAAAAG5L2AAAAAAAbkvUVHJL2/x2S9v4ck/b+HJL1/x2S9v4dkvb/HZL3/x2T9/8ckvb/HJH2/xyS
+ 9v8dk/b/HJL2/xyS9v8dk/b/HZL2/xyS9v8ckvb/HJL2/RyS9f8dk/b/HJL2/xyS9v8ckvWRAAAAAAAA
+ AAAckvYAH5L4AAAAAAAAAAAAHZP2AAAAAAAckvbXHJL2/xyS9v4ckvb/HJL2/xyS9sIAAAAAHJP2AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvb/HZL2/hyS
+ 9v4ckvb/HJH2/xyT9m8AAAAAAAAAAAAAAAAAAAAAAAAAAByS9v8dkvb+HJL2/hyS9v8dkvb/HJL2rxyT
+ 9SsdkvY0HJL1NB2R9zEckvcxHZP3MR2T9jAckfcsG5P3LRyT9y0dk/csHJL2GxyS9/8dkvb/HJL2/xyS
+ 9uQbk/gZAAAAAAAAAAAbkvcAAAAAAAAAAAAAAAAAAAAAABuS9wAAAAAAHJL2qhyR9v8ckvb+HJL2/xyS
+ 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
+ 9kUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvYAAAAAAByS9q0ckvb/HJL2/hyS
+ 9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS9/4ckvb+HJL2/hyT9v0ckvb+HJL2/hyS9v4ckvb+HJL2/hyS
+ 9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS9v4ck/f/HJL2pwAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2/xyS
+ 9v4ckvb+HJL2/hyS9v8ckvdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAckvZ+HJL2/xyS9/8ckvb+HJL3/hyS9/4ckvb/HJH2/xyS9v8ckvf+HJL2/xyS9/8ck/b+HJH3/xyS
+ 9v8ckvb+HJL2/hyS9v8ckvf/HJL2/hyS9/4ckvf+HJL2/xyR9v8ckvb/HJL3/xyS9tIAAAAAHJL2AAAA
+ AAAAAAAAAAAAAByS9uYckvb/HJL3/xyS9v4ck/b/HJL1qAAAAAAdkvYAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAG5L2QByS9v8ckvb/HJL2/hyS9v4dk/b+HJL2/xyR9v8ckvb/HJP2/xyS
+ 9v8ckvb/HJP2/xyS9v8ckvb/HJL2/xyS9v8ck/b/HJP2/xyS9v8ckvb/HJP3/xyS9v0ckfb/HJL2/xyS
+ 9/8ckvb/AAAAAAAAAAAdk/YAHJP3AAAAAAAckvesHJL2/xyS9v8ckvb+HJL2/xyS9tMAAAAAHJL2AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9hUckvb/HJL1/xyS9v4dkvb+HJL2/x2S
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAII34AAAA
+ AAAAAAAAHJL2/xyS9v8ckvbyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAdkvcAAAAAABqR+CIckvb/G5L2agAAAAAck/cAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL2ABqS+AAAAAAAHJL2cCWU7gEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YAHJL2AAAA
+ AAAAAAAAHJL2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////8//////////x/4H//A+AAAB/gf/8D4AAAB/B//wPwAAAD8H//g/AAAAfwP/+D8AAAD/A/
+ /4PwP/w/8D//gfA//P/4P/+B8D/9//g//8HwP///+D//wfg////4H//B+D////gf/8D4P///+B//wPgf
+ ///8H//A+B////wf/+D4H////AAAAPwf///8AAAA/B////wAAAB8H////gAAAHwP///+AAAAfA////4H
+ /+B+D////gf/8H4P///+B//wfg////4H//A+B////wf/8D4H////B//4Pgf///8H//g/B////wP/+D8H
+ ////A//4Hwf///8D//gfA////4P/+B8D////g//8HwP///+D//AHg////4H/8AeD////gf/4B4P////B
+ //wPg////////A/////////+H/////////8f/////////7//////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////8oAAAAgAAAAAABAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAIJX1AB2T9gIclvsAHYvvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOY9AAAAAAAAAAAAAAAAAAAAAAAHZL3AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAABuS9xgck/d9HZT4BwAAAAAAAAAAHJH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5P2ExyT9v8dkvfnHJP2VQAA
+ AAAAAAAAHZP2ARqR9gAdkvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAbkvYSHJL39R2T9v8dkvf/HZL3shyS9yQAAAAAAAAAAB2S9wAdk/YAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHI3xAB2T
+ 9wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cBAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZT2AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR9wAdk/YAAID/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByV9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeT9wYck/f2HZL3/x2T
+ 9/8dk/b/HJL3/xyT9oEck/UKAAAAAB+R9wEbk/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9kQdk/d5HZP3bh2T93Ick/d0HJP3dx2T
+ 93kckvd8HZP3fhyT94AckveLHZP4RQAAAAAckvgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAHZT3Cx2T90AckvZHHJP3RR2S90Udk/dFHZP3RR2S90Udk/dFHZP3RRyS
+ 90cdk/Y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByn7QAck/Y0HZL3SRyS
+ 9kUdkvdFHJL2RR2T9kUdk/dFHZP3RR2T90Uck/dFHZP3RR2T90Uck/dFHZL3RR2T90Udk/dFHZL3RR2T
+ 90Udk/dFHZP3RRyT90Udk/dFHJP2RR2T90UdkvdFHZP3RRyT90Udk/dFHJP3RR2T90UdkvdFHJL3RR2S
+ 90Uck/dFHJL2RR2S90Udk/dCHJP3UxyT9/kdk/f/HZP2/hyS9/8dk/b/HZL3/x2S990ck/ZWAAAAAAAA
+ AAAAAAAAHJL2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHJL2jR2T9/8dk/f/HZP2/x2T9v8dkvb/HZP3/x2T9/8dk/b/HZP3/xyS9/8dk/e0AAAAAByS
+ 9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/YXHJP21h2S
+ 9/8ckvb6HZP3+h2T9/ockvb6HZP3+hyT9/odk/f6HZP3/RyS9u8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9qsckvf/HJP2+h2T9/odk/f6HJL2+h2S9/odk/f6HZP3+hyT
+ 9/odk/f6HJP3+hyS9/odk/f6HZP3+hyS9vodk/f6HJP3+h2T9/ockvb6HJL3+h2S9/ock/b6HZL3+h2T
+ 9/ock/f6HJL2+h2T9/ockvb6HZP3+h2T9/odk/f6HZL2+hyS9/ockvb6HZP3+hyT9/odkvb7HZP3/hyT
+ 9/8dk/f/HJL2/x2S9/4ck/b6HZL2/xyT9/8ck/ezHJL2IgAAAAAAAAAAHpL3ABuT9wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHI3xAAAAAAAdk/dZHJP2/xyS9/8dk/b/HJP3/xyS
+ 9v8dkvf/HJP2/x2T9v8dk/b/HZP3/xyS9tMAAAAAHpT3AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvbBHZP3/x2S9/8dk/f/HZP3/x2S9v8dk/f/HZP3/x2T
+ 9/8dkvb/HJP3/xyT9yMAAAAAHJP3AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACue8QAAAAAAHJL3jh2T
+ 9v8dk/f/HZP3/x2T9/8dkvb/HZL3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZL2/x2T
+ 9/8dk/f/HZP3/xyS9v8dkvf/HZL3/x2T9/8dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9v8dk/f/HZP3/x2T
+ 9/8dkvb/HZL3/x2S9/8dk/f/HJP2/xyS9v8dkvf/HZP2/h2S9v8dkvb/HZL2/xyT9/8ck/f+HZL2/x2S
+ 9v8ckvf/HZL3gBuT9ggAAAAAAAAAAAAAAAAckvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByS9y4ckvf8HZP2/x2T9/8dk/f+HJL2/x2T9/4ckvb/HJL2/xyS9v8dkvb/HJP34xyU
+ +BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+ 95wck/b/HJL2/x2T9/4dk/f+HJL2/x2T9/4ckvb/HJL3/xyT9v8dkvf/HZL3VAAAAAAdkvcCAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/ZlHJL3/x2T9v8ckvb/HZP3/hyS9v8dk/f+HJL2/xyS
+ 9v8ckvb/HJL2/xyS9v8ckvb/HZP3/h2T9/4ckvb/HZP3/hyS9v8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS
+ 9/8dk/f+HJL3/xyS9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8ckvb/HJL3/xyS9v8dk/f+HJL2/x2T
+ 9/4ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8dk/f/HZP3/RyT9v8dk/b/HJL32xyT9lMAAAAAAAAAAAAA
+ AAAck/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxmNYAAH7/AByS9/Adk/b/HZP2/xyT
+ 9v4dk/f/HZP3/h2T9v4dk/b+HZP3/hyS9v8dk/f2HZP3PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9QAAAAAAHZP3ax2T9v8dkvf/HJP3/h2T9/4dk/f/HZP3/h2T
+ 9/4dk/f+HZP3/xyS9v8dk/aIAAAAAByT9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T
+ 9zsdk/f/HJL2/xyS9v4ck/b+HZP3/x2T9/4dk/b+HZP2/h2T9/4dk/f+HZP3/h2T9v4ck/f+HZP3/h2T
+ 9/8dk/f+HZP3/h2T9/4dk/b/HJP3/h2T9v4ck/b+HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT
+ 9/4ck/b+HZP3/x2T9/4dk/f/HZP2/hyT9v4dk/f/HZP3/h2T9v4dk/b+HZP3/h2T9/4dk/f+HZP2/hyT
+ 9/4dk/f+HZP2/hyS9v8dkvf/HZP2/x2T9rYdkvcrAAAAAAAAAAAek/cAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByS9gIAAAAAHZP30RyS9v8dkvf+HZP2/x2S9/8dkvf/HZP2/x2T9v8dk/f/HZP3/x2S
+ 9v8ck/ZdAAAAAB2S9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAdkvZAHZL2/xyT9/8dk/f/HZP3/x2S9/8dk/f/HZP3/x2T9/8dk/f/HZP2/xyT97YAAAAAHZP2BQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2FRyS9vYdk/f/HZL2/x2T9v8dkvf/HZL3/x2T
+ 9v8dk/b/HZP3/x2T9/8dk/f/HZL2/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyS9v8dkvf/HZL2/x2T
+ 9v8dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HZL3/x2S9/8dk/b/HZP2/x2S
+ 9/8dkvf/HZP2/x2T9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9/8dkvf/HZP3/x2T9v4ckvf/HZP3/xyS
+ 9vwdk/eEH5L2EAAAAAAWmP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3AQAAAAAdkvefHJP2/x2S
+ 9/0ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvb/HJP2/x2S938AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9xIck/f8HZL2/xyT9/8dk/f+HJL3/x2T
+ 9/4ckvf/HJL3/xyT9/4dkvb/HJP30gqT+AAgkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR
+ 9QEAAAAAHZP36RyS9v8ckvb+HJP3/hyS9/8dk/f+HJL2/xyT9v8ckvf/HJL3/xyT9/8ckvb/HJP3/h2T
+ 9/4ckvf/HZP3/hyS9/8ckvf/HJL2/xyS9/8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS
+ 9/8ck/f+HJP3/hyS9/8ckvf/HJL3/xyS9v8ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvf/HJP3/xyS
+ 9v8ck/f+HZP3/hyS9/8dk/f+HZL3/x2T9/8ckvf7HJP3/x2T9v8dkvaOAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAck/YAAAAAAByT9modkvf/HJP2/ByT9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyT
+ 9v4dkvf/HJP2pgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAelPUBAAAAAByS9+Mdk/b/HJL3/h2T9/8dk/f/HZP3/x2T9/8dk/f/HZP3/h2S9/8ck/bpHJL2JgAA
+ AAAAqv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3AgAAAAAdkva+HJP3/x2T9v0ck/f/HZP3/x2S
+ 9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2S9/8ck/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL3/x2S
+ 9/8ck/f/HZL3/x2T9/8dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8ck/f/HZP3/x2S9/8dk/f/HZP3/xyT
+ 9/8dk/f/HZL3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL3/xyT9/8dk/f/HZP3/x2T9v4dk/f+HZL2/xyT
+ 9/8dk/fkHJL2VQAAAAAolP8AHZH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuS9gAAAAAAHJL2Ox2T
+ 9/8ckvb6HZP3/hyS9v8dk/f+HJL2/xyT9v8ckvb/HJL2/x2T9v8ckvfJHJL3CwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP2sxyS9/8dk/f9HZP3/hyS
+ 9v8dk/f+HJL2/xyS9/8ckvb/HJP3/x2S9v8dk/dIAAAAAByR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAckvYBAAAAAB2T95Mckvb/HZL3/B2T9/4ckvb/HZP3/hyS9v8ck/b/HJL2/xyS9v8ck/b/HJL2/x2T
+ 9/4dk/f+HJL2/x2T9/4ckvb/HJL3/xyS9v8ckvb/HJL2/xyS9v8ckvb/HZP3/hyS9/8ckvb/HJL2/xyS
+ 9v8ckvb/HZP3/h2T9/4ckvb/HJL2/xyS9v8ckvb/HZP3/hyS9v8dk/f+HJL2/xyT9v8ckvb/HJL2/xyT
+ 9v8ckvb/HZP3/h2T9/8ckvb+HJL3/x2T9/8ck/f/HZL2kR2S9hIAAAAAH5L4AQBVuAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvcbHJL2+x2T9/4dk/f+HZL2/x2T9/4dk/b/HZP2/x2T
+ 9v8dk/b/HJP3/x2T9vEdk/ccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZP2AAAAAAAdk/Z9HJL3/x2T9vsdk/f+HZL2/x2T9/4dk/b/HZP3/xyS9v8dk/f/HZL2/xyT
+ 924AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHJL2Yx2T9/8ckvb7HZP3/h2S
+ 9v8dk/f+HZP2/x2T9v8dk/b/HZP2/x2T9/4dkvf/HZP3/R2T9/0dk/f9HZP3/R2T9/0dk/f9HZP3/R2S
+ 9/0dkvf9HJP2/R2S9/0dk/f9HZP2/RyS9/0dk/b9HZL3/R2T9/0dk/f9HZP3/R2S9/0dkvf9HZP3/R2T
+ 9/0dk/b9HZP2/R2S9/4dk/b/HZP2/x2T9v8dk/b/HZP2/x2S9/8ck/b/HZP3/RyS9/8dkvb/HJL2yRyS
+ 9zcAAAAAAAAAAB+V9gAakfcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2U
+ 9g4dk/bUHJL3/x2T9/4dk/b/HZP3/hyT9v8dkvb/HJP2/x2T9v8ckvb6HZP3/xyT9i4AAAAAGpP2AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cAAAAAAByT904dkvb/HJP3+h2T
+ 9/4dk/b/HZP3/hyT9v8dk/f/HJP2/x2S9v4dk/f/HJL2lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZT3AAAAAAAdk/c4HJL3/x2T9vodk/f+HZP2/x2T9/4ck/b/HZL2/xyT9v8dk/b/HZL3/x2T
+ 9v0dkvf/HZL3/x2S9/8dk/f/HZP3/x2T9/8ckvb/HJL2/x2S9v8dk/b/HJL3/x2T9/8dk/f/HJP2/xyT
+ 9/8ck/b/HJP2/x2T9v8dk/b/HZP2/x2S9v8ck/b/HZL2/xyT9/8dkvb/HZP3/xyT9v4dkvb/HJP2/x2T
+ 9v8dk/f/HJP3/h2S9/8dkvb/HJP3+hyT928AAAAAAAAAAB+V+gAAAAAAHpH2AAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAckvYDAAAAAByT9ngckvf/HJP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyS
+ 9v8dk/f/HJL3kQAAAAAdk/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAdkPgBAAAAAByT9tsckvf/HZL2/x2T9/4dk/f+HZP3/hyS9v8dk/f+HZL3/xyT9v8dkvf1HZH3HAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR9g4dkvbeHZP3/x2S9v8dk/f+HZP3/h2T
+ 9/4dk/f+HZP3/h2T9/4dk/b/HJL3+xyR9yYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAekPkAAAAAAByT
+ 9wIdkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wEAAAAAHJL3QxyS
+ 9/8ckvf+HZL3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HJL3/hyT9v8dkve2AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wQAAAAAHJL2thyT9/8ckvb+HZP3/h2T
+ 9/4dk/f+HJL2/x2S9/4dkvf+HJP3/xyS9v8dkvZLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAdk/cEAAAAAB2S9sgdk/f/HZL2/h2S9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyS9/8dk/b/HZP2TQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAHZP2AAAAAAAdk/YVHZP3/x2T9/4dkvf/HZP2/x2T9v8dk/f/HZP3/x2T
+ 9/8dkvb/HJL2/x2T99Adk/kOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZL3AgAAAAAdk/aFHZL3/x2S9v4dk/f/HZP3/x2T9/8dk/b+HZL3/x2S9v8dk/b/HJP3/x2S
+ 9nQAAAAAHJT3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9gQAAAAAHJP3pR2S9v8dk/f+HZL3/x2T
+ 9v8dk/b/HZP3/x2T9/8dk/f/HZP2/xyS9v8ckvdxAAAAAB2T9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAdk/bmHZP3/x2S9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2S9/8dkvb/HJP37hyS9yoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cBAAAAAByT91Ack/f/HJP3/R2T
+ 9/8dk/f/HZP3/xyT9v8ckvf/HZL3/xyT9v4ckvb/HZP3nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHJL2AwAAAAAckvZzHJL2/xyS9v4dkvf/HZP3/x2T9/8dk/f/HZP3/x2T9/8ckvb/HJP3/x2T
+ 9poAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS97gckvb/HZL3/h2T9v8dk/b/HZP2/x2T
+ 9v8dk/b/HZL2/x2T9/8ckvb/HZP3QQAAAAAZkfYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAByS9gAAAAAAHJL2IByS9v8ckvb9HZP3/h2T9v8dk/b/HZP2/x2S9v8dkvb/HZP2/h2S
+ 9v8ck/e/HJb6AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cBAAAAAB2T90cdk/f/HZP3/h2S
+ 9/4dk/b/HZP2/x2T9v8dk/b/HZP2/xyS9v4ckvb/HJL3tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZL2jByT9/8dk/f+HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL2/hyS9v8dk/dhAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAdlfkGHZP3yByS9v8dk/b+HZP2/xyT9v8dk/b/HJP2/xyS9v8ck/f+HJL3/hyS
+ 9/8bkvcSAAAAABqR9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL3AAAA
+ AAAck/ZHHZL3/x2T9/8ck/b/HZP2/xyS9v8ckvb/HZL2/xyT9v8ckvb/HZP2/xyS97QAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3ah2T9v8dk/f+HJP2/x2T9v8ck/b/HZP2/xyT
+ 9v8ckvb/HJP3/h2S9v8ck/eDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/asHZL3/x2S
+ 9v4dk/f+HZP3/h2T9/4dk/f+HZL3/hyT9/4ck/b+HJP2/xyT9j8AAAAAHJP2AQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9ysdk/btHJL3/x2T9/4dk/f+HJL2/xyS
+ 9/4dkvf+HJP3/h2S9/8ck/f/HZL25QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAck/ZHHZL3/x2S9/8dk/f+HZP3/h2T9/4dk/f+HZP3/h2S9/4ck/f/HZP2/xyS96sAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAdk/gAAAAAAByS9oEdk/f/HZP2/x2T9v8dk/b/HZP2/x2T9v8dkvb/HJP2/x2T
+ 9/4dk/f/HZL3cQAAAAAdk/cDHZP3AByT9wAdk/YAHJL3AB+V8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAGpn2BxyT9s8dkvf/HZP2/x2T9/8dk/b/HJL2/x2S9v8ck/b/HZL3/xyS9v8dk/f/HpP3EgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAakvgAAAAAAB2T9iwckvfxHZL3/x2T9v8dk/b/HZP2/x2T
+ 9v8dk/b/HZL2/xyT9v8ckvf/HZL22QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2Vh2S
+ 9/8dk/f/HZP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/h2T9/8dk/ecAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfmPkEH5v5BB+a+QQfmvkEH5r5BCCd
+ +gQdkfcIHo/zCx6P8wsej/MLHo/zCx6P8woekPQLHpL4EB6Q+A84hP8AHZP3uxyS9v8dk/f+HZP3/hyS
+ 9v8dk/f+HZP3/h2T9/4ckvf/HZP2/xyS9/8ckvdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZP2FByT9tYdkvf/HZP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyT9/8ck/f/GpT3BgAA
+ AAAPmvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YnHZP2/ByS9/8dk/f/HZP3/x2T9/8dk/f/HZP3/xyT
+ 9/8dk/f/HZP3/x2T9/4dk/fxHZP3+B2T9/kckvf4HZL2+B2T9vgckvf4HJL2+R2T9vkdk/b5HZP2+R2T
+ 9vkdk/b5HZP2+R2T9/odk/f6HZP3+h2T9/odk/f6HZP3+h2S9/sdkvb7HZL2+x2S9vsdkvb7HZL2+x2S
+ 9vsdkvf8HZL3/B2S9/odkvf8HJP2/x2T9/8dk/f/HJL2/xyT9/8dk/f/HJP3/x2S9/8ck/f/HZL2/xyS
+ 9nUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3uB2S9v8dk/f+HZP3/x2T
+ 9/8dk/f/HZP3/x2T9/8ck/f/HJP3/hyT9/8ck/YtAAAAAByT9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZHvAAAA
+ AAAck/fyHZL2/x2T9v8ckvf/HZL3/xyT9/8ckvb/HJL3/x2S9/8dkvf+HZP3/xyS9/8ckvb/HZP3/xyS
+ 9/8dkvb/HJL3/x2T9v8dk/f/HJL3/xyS9/8ckvf/HJL3/xyS9/8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS
+ 9v8ckvb/HJP2/xyT9/8ck/f/HJP3/xyT9/8ck/f/HJP3/xyT9v8ck/b/HJP2/xyS9v8dkvf+HJL3/x2S
+ 9/8ckvb/HJL3/x2S9v8ckvb/HZL3/x2S9/8ckvb/HZP3pQAAAAAbjfMAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAdk/eaHZL2/x2S9v8dk/b/HJL3/x2S9/8ck/f/HJL2/xyS9/8dkvf+HZL3/x2S
+ 91kAAAAAHZL3AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YBAAAAAByS980dk/b/HZP3/h2S9/8dkvf/HZP3/x2S
+ 9/8dk/f+HZP3/hyS9v8dk/f+HZL3/h2S9/4ckvb/HZL3/x2S9/8dkvf/HJL3/x2T9/4dkvf/HJL2/x2S
+ 9/8ckvb/HZL3/x2T9/4dk/f+HJL2/x2S9/8ckvf/HZL3/x2T9/4ckvb/HZP3/h2S9/8dk/f/HZL3/x2S
+ 9/8dk/f/HZL3/x2T9/4dk/f+HJL2/x2T9/4dkvf/HZL3/xyS9v8dkvf/HZL3/x2S9/8ckvf/HZP3/hyT
+ 9/8dkvbHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm/8AAAAAAByS9nMdk/f/HJP2/x2T
+ 9/8dkvf/HZL3/x2T9/8dkvf/HZP3/h2T9v4ck/b/HZL3gwAAAAAck/YDAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+ 9wEAAAAAHZP2mByS9/8dk/f8HZL2/x2S9v8dkvb/HZL2/xyS9v8dkvb/HJL2/x2S9v8dkvb/HZL3/xyS
+ 9v8ckvb/HZL2/xyS9v8ckvf/HZL2/x2S9/8ckvb/HZL2/xyS9v8dkvb/HJL2/xyS9v8ckvb/HZL2/xyS
+ 9v8dkvb/HJL2/xyS9v8dkvb/HZL2/x2S9v8dkvb/HZL2/x2S9v8dkvb/HJL2/x2S9v8ckvb/HZL2/x2S
+ 9v8dkvf/HJL2/xyS9v8dkvb/HJL2/xyS9/8dk/f+HZP3/xyS9t8ckvYYAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAHZL2Rh2S9v8ck/f/HZL2/x2S9v8dkvb/HZL2/x2S9v8ckvb/HZP3/h2S
+ 9/8ck/a0AAAAAB2S9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2AAAAAAAckvZpHZP3/xyS9vsckvb/HJL2/xyS
+ 9v8ckvb/HZP3/h2T9/4ckvb/HZP3/hyS9v8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS
+ 9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8ckvb/HJL3/xyS9v8dk/f+HJL2/x2T9/4ckvb/HJL2/xyS
+ 9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8dk/f+HJL2/xyS9/8ckvb/HJL2/xyS9v8ckvb/HJL3/x2T
+ 9/4dk/f/HJP29B2S9zYAAAAAHJf2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cdHJP3+x2S
+ 9v8ck/b/HJL2/xyS9v8ckvb/HJL2/x2T9/4dk/b/HZL2/xyT99AAAAAAHZL2AgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAaj/UAAAAAAByS9jYdk/f/HJL2+h2T9/4dk/f+HZP3/h2T9v4ck/f+HZP3/h2T9/8dk/f+HZP3/h2T
+ 9/4dk/b/HJP3/h2T9v4ck/b+HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT9/4ck/b+HZP3/x2T
+ 9/4dk/f/HZP2/hyT9v4dk/f/HZP3/h2T9v4dk/b+HZP3/h2T9/4dk/f+HZP2/hyT9/4dk/f+HZP3/x2T
+ 9/4dk/f+HZP3/h2T9v8ck/f+HZP2/hyT9v4dkvf/HZP3/hyT9/8ckvf/HZP2WAAAAAAbjPcAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAH5H1AQAAAAAck/fsHZL2/x2T9v4dk/f+HZP3/h2T9/4dk/b+HJP3/h2T
+ 9/8ck/b/HZL35B2S9xsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3HhyS9vgdk/f/HZP3/x2T
+ 9/8dk/f/HZL2/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyS9v8dkvf/HZL2/x2T9v8dkvf/HZP3/x2T
+ 9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HZL3/x2S9/8dk/b/HZP2/x2S9/8dkvf/HZP2/x2T
+ 9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9/8dkvf/HZP3/x2T9/8dk/f/HJL2/x2S9/8dkvb/HZP2/x2S
+ 9/8dk/f/HJL3/h2S9/8ck/Z6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cBAAAAAB2S
+ 9sQck/f/HZP2/R2T9/8dk/f/HZP3/x2S9v8dk/f/HZP3/x2T9/8ck/b1HZL2OgAAAAAVlf8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAGo/2AAAAAAAdkvYPHZP30RyS9v8ckvf/HJL3/xyT9/8ckvb/HJP3/h2T9/4ckvf/HZP3/hyS
+ 9/8ckvf/HJL2/xyS9/8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS9/8ck/f+HJP3/hyS
+ 9/8ckvf/HJL3/xyS9v8ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvf/HJP3/xyS9v8ck/f+HZP3/hyS
+ 9/8dk/f+HJL3/xyS9/8ckvb/HJL3/xyS9v8ckvb/HJL3/x2T9/4dk/f/HZP2/xyS96IAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9gAAAAAAHJL3lR2T9v8ckvb8HJL3/xyS9/8ck/f/HJL2/xyT
+ 9/4dk/f+HJP2/x2S9v8ck/dZAAAAAB+S9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckveoHZP2/xyT
+ 9/4dk/f/HZP3/x2S9/8ck/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL3/x2S9/8ck/f/HZL3/x2T
+ 9/8dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8ck/f/HZP3/x2S9/8dk/f/HZP3/xyT9/8dk/f/HZL3/x2T
+ 9/8dk/f/HZP3/x2T9/8dk/f/HZL3/xyT9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8ckvf/HZL3/xyT
+ 9/8dkvf/HZP3/x2T9/8ckvf/HZP2zh2S9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3AAAA
+ AAAdk/dkHJL3/x2T9/sdk/f/HZP3/x2T9/8dkvf/HJP3/x2T9/8dk/f/HJL3/x2T9n0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9oQdkvf/HJP3/hyS9v8ck/b/HJL2/x2T9/4dk/f+HJL2/x2T
+ 9/4dk/b+HZP3/xyS9v8ckvb/HZL2/xyT9v8ckvb/HZP3/xyT9v8ckvb/HJP2/xyS9v8ck/b/HZP3/x2T
+ 9v8ckvb/HJL2/xyS9v8dk/b/HZP2/xyS9v8dkvf/HJP2/x2T9v8ck/b/HZP2/xyT9v8ckvb/HZP3/x2T
+ 9/8ckvb/HZP3/xyT9/8dkvf+HJP2/hyS9v8ckvb/HJL2/xyS9v8dk/f+HJL3/xyS9v8dk/f2HJL2DQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbk/cAAAAAAByT9jgdkvf/HJP2+hyS9v8ckvb/HJP2/xyS
+ 9v8dk/f+HZP3/hyS9v4ck/f/HZL2nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP3XByT
+ 9/8dkvb/HZP2/x2T9v8dkvb/HZP3/h2T9/4dkvb/HZP3/h2T9/8dkvb8HZL22x2T990dkvfdHZP33R2S
+ 990dk/fdHZP33RyT9t0dk/fdHZP33R2T990dk/fdHZP33R2T990dkvfdHZP23R2T990dk/fdHZP33R2S
+ 990dk/fdHZP33R2T990dk/fdHZP33R2S990dk/fdHZP33R2T9t0dkvfaHZL38R2T9v8dk/f+HJL2/x2S
+ 9v8ck/b/HZL3/x2T9/4dk/f/HZP3+xyS9v8dk/cpAAAAAB2U9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHJL2Hh2T9/gckvb/HZP2/x2T9v8dk/b/HZL2/x2T9/4dk/f+HZL2/x2S9v8ck/fGHJL3CQAA
+ AAAkkv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAHJf2AAAAAAAdkvY5HZL29RyT9/8dk/b/HJL2/xyS9v8dk/f+HZP3/h2T
+ 9v8dk/f+HJL2/x2T9/Mck/ceHJL2FRyT9xYckvcWHJP2Fh2T9xYck/YWHZP3FhyT9hYckvYWHJL2Fh2S
+ 9hYckvYWHJP3FhyS9hYck/cWHJL2Fh2T9hYdk/YWHJP2Fh2T9xYckvYWHJP2FhyT9xYckvcWHZP3FhyS
+ 9hYckvYWHJP2Fh2O9wMdkveEHZP3/x2T9/8ckvb/HZL2/xyT9v8dkvf/HZP3/hyT9/8dk/f8HJL2/x2T
+ 91gAAAAAHZP3AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YQHJL21B2T9/8ck/b/HZP2/xyS
+ 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
+ 9v8dkvd6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpTyAAAAAAAdkveOHJL2/xyT9/8dk/f+HZP3/h2T
+ 9/8dk/f+HJP3/x2T9/8dkvf/HZP2/x2T9m0AAAAAHZP2AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9hQck/baHZL3/x2T9/4dkvf/HZP3/hyT9/8ck/b/HJP3/xyT
+ 9v4ckvb/HZP39wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/dYHZL2/x2T
+ 9/8ckvb/HZP3/h2T9/4dk/f/HZP3/hyT9/8dk/f/HJP2/x2S96IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAkkv8AAAAAAB2T918dk/f/HJL2/x2T9/4dk/f+HJL2/x2T9/4dk/b/HZP3/x2T9/8ck/f/HZL2nAAA
+ AAAck/cEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+ 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
+ 9v8ckvb/HZP3/h2T9/8ckvb/HZL3/xyT9kMAAAAAHZH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR
+ 9gYckveCHZP3rhyT96gdk/eoHZP3qB2T9qgdk/eoHJP3qByT9qgckvanHJP3qR2T9hIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAdlPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAGpr3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AAAA
+ AAAAAAAAHJL3cx2S9/8ck/b/HZL3/xyS9v8dk/b/HJL2/x2T9v8dk/f+HJP3/hyS9v8dk/fCAAAAAByS
+ 9wMamfIAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACua/gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfivYAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAglfQAHJL2ABuS0QAAAAAAHJP3rB2S9v8ck/f9HJP2/hyT
+ 9v8ck/b/HJP2/x2T9/4dkvb8HZP3/xyT9kwAAAAAHZP2AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+ 9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHZL4AAAAAAAgjfgEHJP32x2T9v8ckvb+HJP3/xyS9/8ckvf/HJP3/h2T9/8ckvbVAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL1AAAAAAAdkvcvHJL2+xyT
+ 9v8dk/b+HJP2/xyT9/4dkvb/HJP3/xyS9mwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAACuA/wAAAAAAHZX2AAAAAAAdkvdhHZP2/xyT9/8ckvb+HZL3/hyT9/8dkvbmHZP3GAAA
+ AAAdkfUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvYAAAAAAAAA
+ AAAck/eZHZL2/xyT9/4ck/b/HJP3/x2S9owAAAAAG5T6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvYAAAAAABWU/AIckvfMHZP2/x2S9v8ck/f/HJP2GgAA
+ AAAekPIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuU
+ +AAdkvYBAAAAAByT9xockvbuHZL3/xyS9qIAAAAAHpL3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuS9wAdk/YBAAAAAB2T904ck/f/HZP2NgAA
+ AAAZlPoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9kYckvYOAAAAAByS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wAAAAAAAAAAAAAA
+ AAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2S/wAdkvYAHJL1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////P////////////////////w
+ ////////////////////8D////5///////////////Af//wAP////wAf/AAAAAAAB//+AD////8AH/wA
+ AAAAAAH//gA/////AB/+AAAAAAAA//4AP////4AP/gAAAAAAAD/+AD////+AD/4AAAAAAAAP/gA/////
+ gA/+AAAAAAAAB/8AH////4AP/gAAAAAAAB//AB////+AD/4AAAAAAAA//wAf////wA//AAAAAAAA//8A
+ H////8AH/wAAAAAAA///AB/////AB/8ACD//8Af//wAP////wAf/AB////Af//+AD////8AH/wAf///w
+ P///gA/////AB/8AD///8P///4AP////4AP/gA////P///+AD////+AD/4AP///3////gA/////gA/+A
+ D////////8AH////4AP/gA/////////AB////+AD/4AP////////wAf////gA/+AD////////8AH////
+ 8AH/wAf////////AB/////AB/8AH////////wAf////wAf/AB////////+AD////8AH/wAf////////g
+ A/////AB/8AH////////4AP////4AP/AB////////+AD////+AD/4AP////////gA/////gA/+AD////
+ ////4AP////4AP/gA/////////AB////+AD/4AP////////wAAAAAAAA/+AD////////8AAAAAAAAH/g
+ A/////////AAAAAAAAB/8AH////////wAAAAAAAAf/AB////////+AAAAAAAAH/wAf////////gAAAAA
+ AAB/8AH////////4AAAAAAAAf/AB////////+AAAAAAAAD/wAf////////gAAAAAAAA/+AH////////4
+ AAAAAAAAP/gA/////////AAAAAAAAD/4AP////////wAf////gA/+AD////////8AH////8AH/gA////
+ /////AB/////AB/4AP////////wAf////wAf/AB////////+AD////8AH/wAf////////gA/////AB/8
+ AH////////4AP////4Af/AB////////+AD////+AD/wAf////////gA/////gA/8AD////////4AP///
+ /4AP/gA/////////AB////+AD/4AP////////wAf////gA/+AD////////8AH////8AP/gA/////////
+ AB/////AB/4AP////////wAf////wAf/AD////////8AH////8AH/wAf////////gA/////AB/8AH///
+ /////4AP////wAf/AB////////+AD////+AD/wAf////////gA/////gA/8AH////////4AP////4AP/
+ AB/////////AD////+AD/4AP////////wAf////gA/+AD////////8AH////4AP/gA/////////AB///
+ /gAAH4AP////////wAf///8AAD+AD////////8AH////gAA/wA/////////gB////4AAP8AH////////
+ 4AP////AAH/AB////////+AD////4AB/wAf////////gA/////AA/8AH///////////////4AP//////
+ ////////////+AH///////////////////wB///////////////////+A////////////////////wP/
+ //////////////////8D////////////////////h////////////////////8f/////////////////
+ ///v////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.Designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.Designer.cs (revision 5050)
@@ -0,0 +1,32 @@
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class HiveExperimentListView {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing) {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ components = new System.ComponentModel.Container();
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ }
+
+ #endregion
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentListView.cs (revision 5050)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ [View("HiveExperimentList View")]
+ [Content(typeof(IItemList), false)]
+ public partial class HiveExperimentListView : ItemListView {
+
+ public HiveExperimentListView() {
+ InitializeComponent();
+ itemsGroupBox.Text = "Hive Experiments";
+ }
+
+ protected override HiveExperimentClient CreateItem() {
+ return new HiveExperimentClient();
+ }
+
+ protected override void SetEnabledStateOfControls() {
+ base.SetEnabledStateOfControls();
+ if (Content != null) {
+ if (itemsListView.SelectedItems.Count > 0) {
+ // only allow delete-operation if all selected items are stored in hive (they have HiveExperimentId)
+ bool canRemove = true;
+ foreach (ListViewItem item in itemsListView.SelectedItems) {
+ canRemove = canRemove && Content[item.Index].HiveExperimentId != Guid.Empty;
+ }
+ this.removeButton.Enabled = canRemove;
+ }
+ }
+ }
+
+ protected override void removeButton_Click(object sender, EventArgs e) {
+ DialogResult result = MessageBox.Show("This action will permanently delete this experiment (also on the hive server). Continue?", "Delete Experiment", MessageBoxButtons.OKCancel);
+ if (result == DialogResult.OK) {
+ base.removeButton_Click(sender, e);
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.Designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.Designer.cs (revision 5050)
@@ -0,0 +1,109 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class HiveExperimentManagerView {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing) {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HiveExperimentManagerView));
+ this.hiveExperimentListView = new HiveExperimentListView();
+ this.updateExperimentsButton = new System.Windows.Forms.Button();
+ this.updateExperimentsPanel = new System.Windows.Forms.Panel();
+ this.updateExperimentsPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // hiveExperimentListView
+ //
+ this.hiveExperimentListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.hiveExperimentListView.Caption = "HiveExperimentList View";
+ this.hiveExperimentListView.Content = null;
+ this.hiveExperimentListView.Location = new System.Drawing.Point(3, 3);
+ this.hiveExperimentListView.Name = "hiveExperimentListView";
+ this.hiveExperimentListView.ReadOnly = false;
+ this.hiveExperimentListView.Size = new System.Drawing.Size(729, 518);
+ this.hiveExperimentListView.TabIndex = 0;
+ //
+ // updateExperimentsButton
+ //
+ this.updateExperimentsButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.updateExperimentsButton.Image = ((System.Drawing.Image)(resources.GetObject("updateExperimentsButton.Image")));
+ this.updateExperimentsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.updateExperimentsButton.Location = new System.Drawing.Point(87, 28);
+ this.updateExperimentsButton.Name = "updateExperimentsButton";
+ this.updateExperimentsButton.Size = new System.Drawing.Size(175, 59);
+ this.updateExperimentsButton.TabIndex = 5;
+ this.updateExperimentsButton.Text = "Update Experiment List";
+ this.updateExperimentsButton.UseVisualStyleBackColor = true;
+ this.updateExperimentsButton.Click += new System.EventHandler(this.updateExperimentsButton_Click);
+ //
+ // updateExperimentsPanel
+ //
+ this.updateExperimentsPanel.Controls.Add(this.updateExperimentsButton);
+ this.updateExperimentsPanel.Location = new System.Drawing.Point(228, 0);
+ this.updateExperimentsPanel.Name = "updateExperimentsPanel";
+ this.updateExperimentsPanel.Size = new System.Drawing.Size(360, 103);
+ this.updateExperimentsPanel.TabIndex = 6;
+ //
+ // HiveClientView
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.updateExperimentsPanel);
+ this.Controls.Add(this.hiveExperimentListView);
+ this.Name = "HiveClientView";
+ this.Size = new System.Drawing.Size(735, 524);
+ this.updateExperimentsPanel.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private System.Windows.Forms.Button updateExperimentsButton;
+ private HiveExperimentListView hiveExperimentListView;
+ private System.Windows.Forms.Panel updateExperimentsPanel;
+
+
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.cs (revision 5050)
@@ -0,0 +1,124 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ ///
+ /// The base class for visual representations of items.
+ ///
+ [View("Hive Experiment Manager View")]
+ [Content(typeof(HiveExperimentManagerClient), true)]
+ public sealed partial class HiveExperimentManagerView : ItemView {
+ private ProgressView progressView;
+
+ public new HiveExperimentManagerClient Content {
+ get { return (HiveExperimentManagerClient)base.Content; }
+ set { base.Content = value; }
+ }
+
+ ///
+ /// Initializes a new instance of .
+ ///
+ public HiveExperimentManagerView() {
+ InitializeComponent();
+ updateExperimentsPanel.Dock = DockStyle.Fill;
+ }
+
+ protected override void OnContentChanged() {
+ base.OnContentChanged();
+ Content_HiveExperimentsChanged(this, EventArgs.Empty);
+ Content_IsProgressingChanged(this, EventArgs.Empty);
+ if(Content != null) UpdateExperimentsAsync();
+ }
+
+ protected override void RegisterContentEvents() {
+ this.Content.HiveExperimentsChanged += new EventHandler(Content_HiveExperimentsChanged);
+ this.Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
+ }
+
+ protected override void DeregisterContentEvents() {
+ this.Content.HiveExperimentsChanged -= new EventHandler(Content_HiveExperimentsChanged);
+ this.Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
+ }
+
+ private void Content_HiveExperimentsChanged(object sender, EventArgs e) {
+ if (Content != null) {
+ this.hiveExperimentListView.Content = Content.HiveExperiments;
+ }
+ }
+
+ protected override void SetEnabledStateOfControls() {
+ base.SetEnabledStateOfControls();
+ updateExperimentsPanel.Visible = Content != null && Content.HiveExperiments == null;
+
+ }
+
+ private void updateExperimentsButton_Click(object sender, EventArgs e) {
+ if(Content != null) UpdateExperimentsAsync();
+ }
+
+ private void Content_IsProgressingChanged(object sender, EventArgs e) {
+ if (this.InvokeRequired) {
+ Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
+ } else {
+ if (Content != null && Content.IsProgressing) {
+ SetProgressView();
+ } else {
+ FinishProgressView();
+ }
+ }
+ }
+
+ private void SetProgressView() {
+ if (progressView == null) {
+ progressView = new ProgressView(this, Content.Progress);
+ } else {
+ progressView.Progress = Content.Progress;
+ }
+ }
+
+ private void FinishProgressView() {
+ if (progressView != null) {
+ progressView.Finish();
+ progressView = null;
+ SetEnabledStateOfControls();
+ }
+ }
+
+ private void UpdateExperimentsAsync() {
+ MethodInvoker invoker = new MethodInvoker(Content.UpdateExperimentList);
+ invoker.BeginInvoke((ar) => {
+ try {
+ invoker.EndInvoke(ar);
+ }
+ catch (Exception ex) {
+ ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
+ }
+ }, null);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.resx (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentManagerView.resx (revision 5050)
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+
+
+
+ 57
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.Designer.cs (revision 5050)
@@ -0,0 +1,415 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class HiveExperimentView {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing) {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HiveExperimentView));
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.experimentTabPage = new System.Windows.Forms.TabPage();
+ this.openExperimentButton = new System.Windows.Forms.Button();
+ this.newExperimentButton = new System.Windows.Forms.Button();
+ this.experimentNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
+ this.viewExperimentButton = new System.Windows.Forms.Button();
+ this.jobsTabPage = new System.Windows.Forms.TabPage();
+ this.hiveJobView = new HiveJobView();
+ this.logTabPage = new System.Windows.Forms.TabPage();
+ this.logView = new HeuristicLab.Core.Views.LogView();
+ this.downloadExperimentButton = new System.Windows.Forms.Button();
+ this.startButton = new System.Windows.Forms.Button();
+ this.stopButton = new System.Windows.Forms.Button();
+ this.resetButton = new System.Windows.Forms.Button();
+ this.executionTimeLabel = new System.Windows.Forms.Label();
+ this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+ this.pauseButton = new System.Windows.Forms.Button();
+ this.resourceIdsLabel = new System.Windows.Forms.Label();
+ this.resourceIdsTextBox = new System.Windows.Forms.TextBox();
+ this.disconnectButton = new System.Windows.Forms.Button();
+ this.reconnectButton = new System.Windows.Forms.Button();
+ this.downloadExperimentPanel = new System.Windows.Forms.Panel();
+ ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+ this.tabControl.SuspendLayout();
+ this.experimentTabPage.SuspendLayout();
+ this.jobsTabPage.SuspendLayout();
+ this.logTabPage.SuspendLayout();
+ this.downloadExperimentPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // nameTextBox
+ //
+ this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+ this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+ this.nameTextBox.Size = new System.Drawing.Size(663, 20);
+ //
+ // descriptionTextBox
+ //
+ this.descriptionTextBox.Size = new System.Drawing.Size(663, 20);
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.experimentTabPage);
+ this.tabControl.Controls.Add(this.jobsTabPage);
+ this.tabControl.Controls.Add(this.logTabPage);
+ this.tabControl.Location = new System.Drawing.Point(0, 78);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(735, 416);
+ this.tabControl.TabIndex = 4;
+ //
+ // experimentTabPage
+ //
+ this.experimentTabPage.Controls.Add(this.openExperimentButton);
+ this.experimentTabPage.Controls.Add(this.newExperimentButton);
+ this.experimentTabPage.Controls.Add(this.experimentNamedItemView);
+ this.experimentTabPage.Controls.Add(this.viewExperimentButton);
+ this.experimentTabPage.Location = new System.Drawing.Point(4, 22);
+ this.experimentTabPage.Name = "experimentTabPage";
+ this.experimentTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.experimentTabPage.Size = new System.Drawing.Size(727, 390);
+ this.experimentTabPage.TabIndex = 1;
+ this.experimentTabPage.Text = "Experiment";
+ this.experimentTabPage.UseVisualStyleBackColor = true;
+ //
+ // openExperimentButton
+ //
+ this.openExperimentButton.Image = ((System.Drawing.Image)(resources.GetObject("openExperimentButton.Image")));
+ this.openExperimentButton.Location = new System.Drawing.Point(36, 6);
+ this.openExperimentButton.Name = "openExperimentButton";
+ this.openExperimentButton.Size = new System.Drawing.Size(24, 24);
+ this.openExperimentButton.TabIndex = 5;
+ this.toolTip.SetToolTip(this.openExperimentButton, "Open Experiment");
+ this.openExperimentButton.UseVisualStyleBackColor = true;
+ this.openExperimentButton.Click += new System.EventHandler(this.openExperimentButton_Click);
+ //
+ // newExperimentButton
+ //
+ this.newExperimentButton.Image = ((System.Drawing.Image)(resources.GetObject("newExperimentButton.Image")));
+ this.newExperimentButton.Location = new System.Drawing.Point(6, 6);
+ this.newExperimentButton.Name = "newExperimentButton";
+ this.newExperimentButton.Size = new System.Drawing.Size(24, 24);
+ this.newExperimentButton.TabIndex = 4;
+ this.toolTip.SetToolTip(this.newExperimentButton, "New Experiment");
+ this.newExperimentButton.UseVisualStyleBackColor = true;
+ this.newExperimentButton.Click += new System.EventHandler(this.newExperimentButton_Click);
+ //
+ // experimentNamedItemView
+ //
+ this.experimentNamedItemView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.experimentNamedItemView.Caption = "NamedItem View";
+ this.experimentNamedItemView.Content = null;
+ this.experimentNamedItemView.Location = new System.Drawing.Point(3, 36);
+ this.experimentNamedItemView.Name = "experimentNamedItemView";
+ this.experimentNamedItemView.ReadOnly = false;
+ this.experimentNamedItemView.Size = new System.Drawing.Size(721, 52);
+ this.experimentNamedItemView.TabIndex = 3;
+ //
+ // viewExperimentButton
+ //
+ this.viewExperimentButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.viewExperimentButton.Location = new System.Drawing.Point(0, 94);
+ this.viewExperimentButton.Name = "viewExperimentButton";
+ this.viewExperimentButton.Size = new System.Drawing.Size(727, 23);
+ this.viewExperimentButton.TabIndex = 1;
+ this.viewExperimentButton.Text = "&Show Experiment";
+ this.viewExperimentButton.UseVisualStyleBackColor = true;
+ this.viewExperimentButton.Click += new System.EventHandler(this.showExperimentButton_Click);
+ //
+ // jobsTabPage
+ //
+ this.jobsTabPage.Controls.Add(this.hiveJobView);
+ this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
+ this.jobsTabPage.Name = "jobsTabPage";
+ this.jobsTabPage.Size = new System.Drawing.Size(727, 390);
+ this.jobsTabPage.TabIndex = 5;
+ this.jobsTabPage.Text = "Jobs";
+ this.jobsTabPage.UseVisualStyleBackColor = true;
+ //
+ // hiveJobView
+ //
+ this.hiveJobView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.hiveJobView.Caption = "HiveJob View";
+ this.hiveJobView.Content = null;
+ this.hiveJobView.Location = new System.Drawing.Point(2, 3);
+ this.hiveJobView.Name = "hiveJobView";
+ this.hiveJobView.ReadOnly = true;
+ this.hiveJobView.Size = new System.Drawing.Size(722, 384);
+ this.hiveJobView.TabIndex = 0;
+ //
+ // logTabPage
+ //
+ this.logTabPage.Controls.Add(this.logView);
+ this.logTabPage.Location = new System.Drawing.Point(4, 22);
+ this.logTabPage.Name = "logTabPage";
+ this.logTabPage.Size = new System.Drawing.Size(727, 390);
+ this.logTabPage.TabIndex = 3;
+ this.logTabPage.Text = "Log";
+ this.logTabPage.UseVisualStyleBackColor = true;
+ //
+ // logView
+ //
+ this.logView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.logView.Caption = "Log View";
+ this.logView.Content = null;
+ this.logView.Location = new System.Drawing.Point(3, 4);
+ this.logView.Name = "logView";
+ this.logView.ReadOnly = false;
+ this.logView.Size = new System.Drawing.Size(721, 362);
+ this.logView.TabIndex = 0;
+ //
+ // downloadExperimentButton
+ //
+ this.downloadExperimentButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.downloadExperimentButton.Image = ((System.Drawing.Image)(resources.GetObject("downloadExperimentButton.Image")));
+ this.downloadExperimentButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.downloadExperimentButton.Location = new System.Drawing.Point(44, 22);
+ this.downloadExperimentButton.Name = "downloadExperimentButton";
+ this.downloadExperimentButton.Size = new System.Drawing.Size(164, 54);
+ this.downloadExperimentButton.TabIndex = 17;
+ this.downloadExperimentButton.Text = "Download Experiment";
+ this.toolTip.SetToolTip(this.downloadExperimentButton, "Reconnect to Hive");
+ this.downloadExperimentButton.UseVisualStyleBackColor = true;
+ this.downloadExperimentButton.Click += new System.EventHandler(this.downloadExperimentButton_Click);
+ //
+ // startButton
+ //
+ this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.startButton.Image = ((System.Drawing.Image)(resources.GetObject("startButton.Image")));
+ this.startButton.Location = new System.Drawing.Point(0, 500);
+ this.startButton.Name = "startButton";
+ this.startButton.Size = new System.Drawing.Size(24, 24);
+ this.startButton.TabIndex = 5;
+ this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+ this.startButton.UseVisualStyleBackColor = true;
+ this.startButton.Click += new System.EventHandler(this.startButton_Click);
+ //
+ // stopButton
+ //
+ this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+ this.stopButton.Location = new System.Drawing.Point(60, 500);
+ this.stopButton.Name = "stopButton";
+ this.stopButton.Size = new System.Drawing.Size(24, 24);
+ this.stopButton.TabIndex = 7;
+ this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+ this.stopButton.UseVisualStyleBackColor = true;
+ this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+ //
+ // resetButton
+ //
+ this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.resetButton.Enabled = false;
+ this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
+ this.resetButton.Location = new System.Drawing.Point(90, 500);
+ this.resetButton.Name = "resetButton";
+ this.resetButton.Size = new System.Drawing.Size(24, 24);
+ this.resetButton.TabIndex = 8;
+ this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
+ this.resetButton.UseVisualStyleBackColor = true;
+ this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+ //
+ // executionTimeLabel
+ //
+ this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.executionTimeLabel.AutoSize = true;
+ this.executionTimeLabel.Location = new System.Drawing.Point(509, 507);
+ this.executionTimeLabel.Name = "executionTimeLabel";
+ this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+ this.executionTimeLabel.TabIndex = 9;
+ this.executionTimeLabel.Text = "&Execution Time:";
+ //
+ // executionTimeTextBox
+ //
+ this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.executionTimeTextBox.Location = new System.Drawing.Point(598, 504);
+ this.executionTimeTextBox.Name = "executionTimeTextBox";
+ this.executionTimeTextBox.ReadOnly = true;
+ this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
+ this.executionTimeTextBox.TabIndex = 10;
+ //
+ // pauseButton
+ //
+ this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.pauseButton.Enabled = false;
+ this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+ this.pauseButton.Location = new System.Drawing.Point(30, 500);
+ this.pauseButton.Name = "pauseButton";
+ this.pauseButton.Size = new System.Drawing.Size(24, 24);
+ this.pauseButton.TabIndex = 6;
+ this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+ this.pauseButton.UseVisualStyleBackColor = true;
+ this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+ //
+ // resourceIdsLabel
+ //
+ this.resourceIdsLabel.AutoSize = true;
+ this.resourceIdsLabel.Location = new System.Drawing.Point(3, 55);
+ this.resourceIdsLabel.Name = "resourceIdsLabel";
+ this.resourceIdsLabel.Size = new System.Drawing.Size(67, 13);
+ this.resourceIdsLabel.TabIndex = 12;
+ this.resourceIdsLabel.Text = "ResourceIds";
+ //
+ // resourceIdsTextBox
+ //
+ this.resourceIdsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.resourceIdsTextBox.Location = new System.Drawing.Point(72, 52);
+ this.resourceIdsTextBox.Name = "resourceIdsTextBox";
+ this.resourceIdsTextBox.Size = new System.Drawing.Size(663, 20);
+ this.resourceIdsTextBox.TabIndex = 14;
+ this.resourceIdsTextBox.Validated += new System.EventHandler(this.resourceIdsTextBox_Validated);
+ //
+ // disconnectButton
+ //
+ this.disconnectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.disconnectButton.Enabled = false;
+ this.disconnectButton.Location = new System.Drawing.Point(234, 500);
+ this.disconnectButton.Name = "disconnectButton";
+ this.disconnectButton.Size = new System.Drawing.Size(120, 24);
+ this.disconnectButton.TabIndex = 15;
+ this.disconnectButton.Text = "Stop Result Polling";
+ this.toolTip.SetToolTip(this.disconnectButton, "Disconnect from Hive (Jobs will be continue to be calculated)");
+ this.disconnectButton.UseVisualStyleBackColor = true;
+ this.disconnectButton.Click += new System.EventHandler(this.disconnectButton_Click);
+ //
+ // reconnectButton
+ //
+ this.reconnectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.reconnectButton.Enabled = false;
+ this.reconnectButton.Location = new System.Drawing.Point(120, 500);
+ this.reconnectButton.Name = "reconnectButton";
+ this.reconnectButton.Size = new System.Drawing.Size(108, 24);
+ this.reconnectButton.TabIndex = 16;
+ this.reconnectButton.Text = "Start Result Polling";
+ this.toolTip.SetToolTip(this.reconnectButton, "Reconnect to Hive");
+ this.reconnectButton.UseVisualStyleBackColor = true;
+ this.reconnectButton.Click += new System.EventHandler(this.reconnectButton_Click);
+ //
+ // downloadExperimentPanel
+ //
+ this.downloadExperimentPanel.Controls.Add(this.downloadExperimentButton);
+ this.downloadExperimentPanel.Location = new System.Drawing.Point(331, 3);
+ this.downloadExperimentPanel.Name = "downloadExperimentPanel";
+ this.downloadExperimentPanel.Size = new System.Drawing.Size(250, 80);
+ this.downloadExperimentPanel.TabIndex = 18;
+ //
+ // HiveExperimentView
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.downloadExperimentPanel);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.disconnectButton);
+ this.Controls.Add(this.startButton);
+ this.Controls.Add(this.resourceIdsTextBox);
+ this.Controls.Add(this.executionTimeTextBox);
+ this.Controls.Add(this.resourceIdsLabel);
+ this.Controls.Add(this.executionTimeLabel);
+ this.Controls.Add(this.pauseButton);
+ this.Controls.Add(this.stopButton);
+ this.Controls.Add(this.resetButton);
+ this.Controls.Add(this.reconnectButton);
+ this.Name = "HiveExperimentView";
+ this.Size = new System.Drawing.Size(735, 524);
+ this.Controls.SetChildIndex(this.reconnectButton, 0);
+ this.Controls.SetChildIndex(this.resetButton, 0);
+ this.Controls.SetChildIndex(this.stopButton, 0);
+ this.Controls.SetChildIndex(this.pauseButton, 0);
+ this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+ this.Controls.SetChildIndex(this.resourceIdsLabel, 0);
+ this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+ this.Controls.SetChildIndex(this.resourceIdsTextBox, 0);
+ this.Controls.SetChildIndex(this.startButton, 0);
+ this.Controls.SetChildIndex(this.disconnectButton, 0);
+ this.Controls.SetChildIndex(this.tabControl, 0);
+ this.Controls.SetChildIndex(this.nameLabel, 0);
+ this.Controls.SetChildIndex(this.descriptionLabel, 0);
+ this.Controls.SetChildIndex(this.nameTextBox, 0);
+ this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+ this.Controls.SetChildIndex(this.downloadExperimentPanel, 0);
+ ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+ this.tabControl.ResumeLayout(false);
+ this.experimentTabPage.ResumeLayout(false);
+ this.jobsTabPage.ResumeLayout(false);
+ this.logTabPage.ResumeLayout(false);
+ this.downloadExperimentPanel.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+ #endregion
+
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage experimentTabPage;
+ private System.Windows.Forms.Button startButton;
+ private System.Windows.Forms.Button stopButton;
+ private System.Windows.Forms.Button resetButton;
+ private System.Windows.Forms.Label executionTimeLabel;
+ private System.Windows.Forms.TextBox executionTimeTextBox;
+ private System.Windows.Forms.Button pauseButton;
+ private System.Windows.Forms.Label resourceIdsLabel;
+ private System.Windows.Forms.TextBox resourceIdsTextBox;
+ private System.Windows.Forms.Button viewExperimentButton;
+ private Core.Views.NamedItemView experimentNamedItemView;
+ private System.Windows.Forms.TabPage logTabPage;
+ private Core.Views.LogView logView;
+ private System.Windows.Forms.Button disconnectButton;
+ private System.Windows.Forms.Button reconnectButton;
+ private System.Windows.Forms.Button openExperimentButton;
+ private System.Windows.Forms.Button newExperimentButton;
+ private System.Windows.Forms.TabPage jobsTabPage;
+ private System.Windows.Forms.Button downloadExperimentButton;
+ private System.Windows.Forms.Panel downloadExperimentPanel;
+ private HiveJobView hiveJobView;
+
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.cs (revision 5050)
@@ -0,0 +1,307 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ ///
+ /// The base class for visual representations of items.
+ ///
+ [View("Experiment View")]
+ [Content(typeof(HiveExperimentClient), true)]
+ public sealed partial class HiveExperimentView : NamedItemView {
+ private ProgressView progressView;
+
+ public new HiveExperimentClient Content {
+ get { return (HiveExperimentClient)base.Content; }
+ set { base.Content = value; }
+ }
+
+ ///
+ /// Initializes a new instance of .
+ ///
+ public HiveExperimentView() {
+ InitializeComponent();
+ downloadExperimentPanel.Dock = DockStyle.Fill;
+ }
+
+ protected override void DeregisterContentEvents() {
+ Content.ExceptionOccurred -= new EventHandler>(Content_ExceptionOccurred);
+ Content.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
+ Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+ Content.Prepared -= new EventHandler(Content_Prepared);
+ Content.Started -= new EventHandler(Content_Started);
+ Content.Paused -= new EventHandler(Content_Paused);
+ Content.Stopped -= new EventHandler(Content_Stopped);
+ Content.IsResultsPollingChanged -= new EventHandler(Content_IsResultsPollingChanged);
+ Content.HiveJobChanged -= new EventHandler(Content_HiveJobChanged);
+ Content.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
+ base.DeregisterContentEvents();
+ }
+
+ protected override void RegisterContentEvents() {
+ base.RegisterContentEvents();
+ Content.ExceptionOccurred += new EventHandler>(Content_ExceptionOccurred);
+ Content.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+ Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+ Content.Prepared += new EventHandler(Content_Prepared);
+ Content.Started += new EventHandler(Content_Started);
+ Content.Paused += new EventHandler(Content_Paused);
+ Content.Stopped += new EventHandler(Content_Stopped);
+ Content.IsResultsPollingChanged += new EventHandler(Content_IsResultsPollingChanged);
+ Content.HiveJobChanged += new EventHandler(Content_HiveJobChanged);
+ Content.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
+ }
+
+ protected override void OnContentChanged() {
+ base.OnContentChanged();
+ if (Content == null) {
+ executionTimeTextBox.Text = string.Empty;
+ resourceIdsTextBox.Text = string.Empty;
+ logView.Content = null;
+ } else {
+ executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+ resourceIdsTextBox.Text = Content.ResourceIds;
+ logView.Content = Content.Log;
+ }
+ Content_HiveJobChanged(this, EventArgs.Empty);
+ Content_IsProgressingChanged(this, EventArgs.Empty);
+ SetEnabledStateOfControls();
+ }
+
+ protected override void SetEnabledStateOfControls() {
+ base.SetEnabledStateOfControls();
+ executionTimeTextBox.Enabled = Content != null;
+ experimentNamedItemView.ReadOnly = true;
+ if (Content != null) {
+ this.nameTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
+ this.descriptionTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
+ this.resourceIdsTextBox.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
+ this.hiveJobView.ReadOnly = Content.ExecutionState != ExecutionState.Prepared;
+
+ viewExperimentButton.Enabled = Content.GetExperiment() != null;
+
+ this.Locked = Content.ExecutionState == ExecutionState.Started && Content.IsPollingResults;
+ downloadExperimentPanel.Visible = Content.HiveExperimentId != Guid.Empty && Content.GetExperiment() == null;
+ }
+ SetEnabledStateOfExecutableButtons();
+ }
+
+ protected override void OnClosed(FormClosedEventArgs e) {
+ if (Content != null) {
+ if (Content.IsPollingResults)
+ Content.StopResultPolling();
+ }
+ base.OnClosed(e);
+ }
+
+ #region Content Events
+ private void Content_ExecutionStateChanged(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
+ else
+ SetEnabledStateOfControls();
+ }
+ private void Content_Prepared(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_Prepared), sender, e);
+ else {
+ nameTextBox.Enabled = descriptionTextBox.Enabled = true;
+ Locked = false;
+ SetEnabledStateOfControls();
+ }
+ }
+ private void Content_Started(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_Started), sender, e);
+ else {
+ nameTextBox.Enabled = descriptionTextBox.Enabled = false;
+ SetEnabledStateOfControls();
+ }
+ }
+ private void Content_Paused(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_Paused), sender, e);
+ else {
+ nameTextBox.Enabled = descriptionTextBox.Enabled = true;
+ SetEnabledStateOfControls();
+ }
+ }
+ private void Content_Stopped(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_Stopped), sender, e);
+ else {
+ nameTextBox.Enabled = descriptionTextBox.Enabled = true;
+ Locked = false;
+ SetEnabledStateOfControls();
+ }
+ }
+ private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+ else
+ executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+ }
+ private void Content_ExceptionOccurred(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler>(Content_ExceptionOccurred), sender, e);
+ else
+ ErrorHandling.ShowErrorDialog(this, e.Value);
+ }
+ private void Content_IsResultsPollingChanged(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_IsResultsPollingChanged), sender, e);
+ else {
+ SetEnabledStateOfControls();
+ }
+ }
+ void Content_HiveJobChanged(object sender, EventArgs e) {
+ if (InvokeRequired)
+ Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
+ else {
+ if (Content != null) {
+ hiveJobView.Content = Content.HiveJob;
+ experimentNamedItemView.Content = Content.GetExperiment();
+ } else {
+ hiveJobView.Content = null;
+ experimentNamedItemView.Content = null;
+ }
+ SetEnabledStateOfControls();
+ }
+ }
+ #endregion
+
+ #region Control events
+ private void startButton_Click(object sender, EventArgs e) {
+ Content.Start();
+ }
+ private void pauseButton_Click(object sender, EventArgs e) {
+ Content.Pause();
+ }
+ private void stopButton_Click(object sender, EventArgs e) {
+ Content.Stop();
+ }
+ private void resetButton_Click(object sender, EventArgs e) {
+ Content.Prepare();
+ }
+
+ private void resourceIdsTextBox_Validated(object sender, EventArgs e) {
+ Content.ResourceIds = resourceIdsTextBox.Text;
+ }
+
+ private void newExperimentButton_Click(object sender, EventArgs e) {
+ Content.SetExperiment(new HeuristicLab.Optimization.Experiment());
+ }
+
+ private void openExperimentButton_Click(object sender, EventArgs e) {
+ OpenFileDialog openFileDialog = new OpenFileDialog();
+ openFileDialog.Title = "Open Experimenter";
+ openFileDialog.FileName = "Item";
+ openFileDialog.Multiselect = false;
+ openFileDialog.DefaultExt = "hl";
+ openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
+
+ if (openFileDialog.ShowDialog() == DialogResult.OK) {
+ Content.SetExperiment((HeuristicLab.Optimization.Experiment)ContentManager.Load(openFileDialog.FileName));
+ }
+ }
+
+ private void showExperimentButton_Click(object sender, EventArgs e) {
+ MainFormManager.MainForm.ShowContent(Content.GetExperiment());
+ }
+
+ private void disconnectButton_Click(object sender, EventArgs e) {
+ if (Content != null) {
+ Content.StopResultPolling();
+ SetEnabledStateOfControls();
+ }
+ }
+
+ private void reconnectButton_Click(object sender, EventArgs e) {
+ if (Content != null) {
+ Content.StartResultPolling();
+ SetEnabledStateOfControls();
+ }
+ }
+ #endregion
+
+ #region Helpers
+ private void SetEnabledStateOfExecutableButtons() {
+ if (Content == null) {
+ startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = reconnectButton.Enabled = disconnectButton.Enabled = false;
+ } else {
+ startButton.Enabled = Content.GetExperiment() != null && Content.ExecutionState == ExecutionState.Prepared;
+ pauseButton.Enabled = false;
+ stopButton.Enabled = Content.ExecutionState == ExecutionState.Started && Content.IsPollingResults;
+ resetButton.Enabled = false;
+ reconnectButton.Enabled = (Content.ExecutionState == ExecutionState.Started) && !Content.IsPollingResults;
+ disconnectButton.Enabled = (Content.ExecutionState == ExecutionState.Started) && Content.IsPollingResults;
+ }
+ }
+ #endregion
+
+ private void downloadExperimentButton_Click(object sender, EventArgs e) {
+ var invoker = new MethodInvoker(Content.LoadHiveJob);
+ invoker.BeginInvoke((ar) => {
+ try {
+ invoker.EndInvoke(ar);
+ }
+ catch (Exception ex) {
+ ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
+ }
+ }, null);
+ }
+
+ private void Content_IsProgressingChanged(object sender, EventArgs e) {
+ if (this.InvokeRequired) {
+ Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
+ } else {
+ if (Content != null && Content.IsProgressing) {
+ SetProgressView();
+ } else {
+ FinishProgressView();
+ }
+ }
+ }
+
+ private void SetProgressView() {
+ if (progressView == null) {
+ progressView = new ProgressView(this, Content.Progress);
+ }
+ progressView.Progress = Content.Progress;
+ }
+
+ private void FinishProgressView() {
+ if (progressView != null) {
+ progressView.Finish();
+ progressView = null;
+ SetEnabledStateOfControls();
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.resx (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveExperimentView.resx (revision 5050)
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 107, 17
+
+
+ 17, 17
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDAAA
+ CwwBP0AiyAAAAnpJREFUOE+lk1lIlFEYhv+LLrqySI1CMLJELBADQ6qLEKVFTSm3QkkTyq0FQzHXZlxH
+ nRnXKRVzRp1GHa0sxbBCKBSJ0HKhxNQsKCrF1FDJ7emfkSzLQPDiuTmc9znv+ThHAIT1sKZwWqHWWZqn
+ 41pmORkqPfFyTcKvQ9ckCIpS4RWmCDCELsWWmSeLsuhUtU9gVCFCnTbHT4S/aaqRKf53tfD4ohPeEQo8
+ w3KNAvq7NcyM1xr5MaZjbkSNvlxBvTY1eTWJV7gSz9A83EMKEGorlEyPVa0IL3wuYq43kqqyTCqL01EX
+ JlOSm8RNeRwFshjR+XvwQrUmm+mvmuWTF8Uw/XHQG7Iq/whul8r4/qnEWNsQbq7LNvJQn0WDTsa9ynT0
+ 6hR0JVLKVde5lZdAsTIOVXassY1QWZLO5Pt8DLWHWiXUVylZGJLCcOpK3olrg/HQFwWvI+iq8eVKsEeF
+ oFalMDGQCR/k3K9W0P5IvrTpzyu8CoQOb+bb3Jh57MTbCjsunj06IQr2CqV5Er69kTLclki9Ts7ioAR6
+ QpcEXcFi8DTz7R7MtBxhsukQo3X7kIZZc8bFLNcwTKFImchodyx3tNl0PhOb9EWKgvPQGcDi85PMPj3O
+ VPNhxuod+FJtS0faZvzdrHCwMbExClRZcfS0JHFXmwUDSfBSrPvCh9lWd6aeODHe4MiI3o6Pmt30yk2R
+ hOzCfo9F4/JTzs+IobY8k94H4XTkCMu0yzfQIttIY/ImahLMUcdYcOPqDvxddy462lu6LgtyUqPJkVwg
+ IzaI+Mt+hslyzteFU8cO4HzQjv121thaWWC53YytW0zYZmqy8iGt5ysbsj8BvQ/ROxW7aPkAAAAASUVO
+ RK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALDAAA
+ CwwBP0AiyAAAAaJJREFUOE+Nkk1LAkEYx5egU9Sla9AX6NKhLlH3IujSoXtBn0EI+gB5qVBIKyIMtEDo
+ BUIhK6qDSUj4gqYloilmvqa5rrr/Zlx3dkU0B/48z87O/zfzPDMcAE7SOg8sB2AkqYdIXIoAK4LyX17X
+ HiVzYPhC0NBUB1yR6Jfy5lx59rQXRAKEhl6Y4YhMnXOSmUDywRlYHV5YbG6YLp1UW2pgEyBoSdARbdNP
+ OszSSQxEZnkO2D+7w/TCWhtEOoGfqyE5KmKnVf/HIHBLcn4SiI21oGQPkw32J68M0VKvBKgvulgJdEey
+ O+sJNhlg9/i6aZalAEpz98xwQADhAaWJ2GOAWr0BCpFBCoCeIjOxgdCIHlYCiI8DGQ1QMjKzKIooVwSk
+ MuUmYGp+lf5rlcDeArhD6wMzqZOqUEe2UEE0WegNMFgcHYB6Q0SxXEUiXcJbNNsboD+xdwAqfA3p3C8i
+ n3l4QuneAFqfetDG5X94xFJFBCIZuHzJ/gHqxoVjObwGv/DojvcPUDfO9/4NpyeBm+dofwD5vrvFrtco
+ 3zFd8J/oO/gDpYIVhUFyWDsAAAAASUVORK5CYII=
+
+
+
+
+ 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
+ QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+ Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
+ YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
+ 685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
+ TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
+ 8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
+ 66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
+ BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+ Cv8BNGKaggAAAX9JREFUOE9j+P//PwMlmCLNIIupa0Dv5r//Ybht7bf/jSs+/69d/P5/xbxX/0tmP/9f
+ MP3x/9JZj4EWI7yN4oKuDb/+bzr57f/KQ1/+L9jz6f/lBz//965997956RuwIXnTX/zXDV2F2wCQrSsO
+ fvk/b9en/7ee/AIp/N+w5M3/0rkv/+dMff4/qffZf1W/RbgNADl5zo5P/x++/AHWDAIls1/+z5ry/H9C
+ 79P/Ya2P/8u5zcJtAMi/Nx99hmtGZhy7/Oa/V+3D/2J2k3AbAPJn87I3/09deQnXG9355H9g0yMw36H0
+ /n9+s27cBoBCuhxoSM605/93HrkL1hTQ8Oi/W9UDMNss7+5/ToNW3AaAoikb6N9EoH/D2x7/n7Puwn/X
+ ivv/bYrvgQ3Qy7j1n1WnEbcBoDiO63n6P7Tl0X+fuof/ncrv/7cuvPffJPsO2AD1JCIMsEza9h+EjWM2
+ /NcKXv5fwWMuOOB4TTr/s+k24XcB0BKSkzbJGtAtodgAAJMl+qgyDSjjAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+ Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
+ Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
+ JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
+ oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
+
+
+
+ 25
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobListView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobListView.cs (revision 5050)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ [View("JobItemList View")]
+ [Content(typeof(IItemList), false)]
+ public partial class HiveJobListView : ItemListView {
+
+ public HiveJobListView() {
+ InitializeComponent();
+ itemsGroupBox.Text = "Jobs";
+ }
+
+ protected override HiveJob CreateItem() {
+ return null;
+ }
+
+ protected override void SetEnabledStateOfControls() {
+ base.SetEnabledStateOfControls();
+ this.addButton.Enabled = false;
+ this.moveDownButton.Enabled = false;
+ this.moveUpButton.Enabled = false;
+ this.removeButton.Enabled = false;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobListView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobListView.designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobListView.designer.cs (revision 5050)
@@ -0,0 +1,32 @@
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class HiveJobListView {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing) {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ components = new System.ComponentModel.Container();
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ }
+
+ #endregion
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.cs (revision 5050)
@@ -0,0 +1,191 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ [View("HiveJob View")]
+ [Content(typeof(HiveJob), true)]
+ public partial class HiveJobView : ItemView {
+ public new HiveJob Content {
+ get { return (HiveJob)base.Content; }
+ set {
+ if (base.Content != value) {
+ base.Content = value;
+ }
+ }
+ }
+
+ public HiveJobView() {
+ InitializeComponent();
+ }
+
+ protected override void RegisterContentEvents() {
+ base.RegisterContentEvents();
+ Content.OptimizerJobChanged += new EventHandler(Content_OptimizerJobChanged);
+ Content.JobChanged += new EventHandler(Content_JobChanged);
+ Content.JobStateChanged += new EventHandler(Content_JobStateChanged);
+ }
+
+ protected override void DeregisterContentEvents() {
+ Content.OptimizerJobChanged -= new EventHandler(Content_OptimizerJobChanged);
+ Content.JobChanged -= new EventHandler(Content_JobChanged);
+ Content.JobStateChanged -= new EventHandler(Content_JobStateChanged);
+ base.DeregisterContentEvents();
+ }
+
+ protected override void OnContentChanged() {
+ base.OnContentChanged();
+ if (Content != null && Content.Job != null) {
+ logView.Content = Content.OptimizerJob.Log;
+ childHiveJobView.Content = Content.ChildHiveJobs;
+ computeInParallelCheckBox.Checked = Content.OptimizerJob.ComputeInParallel;
+ } else {
+ logView.Content = null;
+ childHiveJobView.Content = null;
+ computeInParallelCheckBox.Checked = false;
+ }
+ Content_OptimizerJobChanged(this, EventArgs.Empty);
+ Content_JobChanged(this, EventArgs.Empty);
+ Content_JobStateChanged(this, EventArgs.Empty);
+ }
+
+ void Content_OptimizerJobChanged(object sender, EventArgs e) {
+ RegisterJobEvents();
+ Job_OptimizerChanged(this, e);
+ }
+
+ void Job_OptimizerChanged(object sender, EventArgs e) {
+ if (Content != null && Content.Job != null && Content.OptimizerJob.Optimizer != null) {
+ optimizerNamedItemView.Content = Content.OptimizerJob.Optimizer;
+ runCollectionViewHost.Content = Content.OptimizerJob.Optimizer.Runs;
+ } else {
+ optimizerNamedItemView.Content = null;
+ runCollectionViewHost.Content = null;
+ }
+ }
+
+ private void RegisterJobEvents() {
+ if (Content != null && Content.Job != null) {
+ Content.OptimizerJob.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
+ Content.OptimizerJob.OptimizerChanged += new EventHandler(Job_OptimizerChanged);
+ }
+ }
+
+ private void DeregisterJobEvents() {
+ if (Content != null && Content.Job != null) {
+ Content.OptimizerJob.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
+ Content.OptimizerJob.OptimizerChanged -= new EventHandler(Job_OptimizerChanged);
+ }
+ }
+
+ #region Content Events
+ private void Content_JobChanged(object sender, EventArgs e) {
+ if (InvokeRequired) {
+ Invoke(new EventHandler(Content_JobChanged), sender, e);
+ } else {
+ if (Content != null && Content.Job != null) {
+ this.jobIdTextBox.Text = Content.Job.Id.ToString();
+ this.dateCreatedTextBox.Text = Content.Job.DateCreated.ToString();
+ this.priorityTextBox.Text = Content.Job.Priority.ToString();
+ this.coresNeededTextBox.Text = Content.Job.CoresNeeded.ToString();
+ this.memoryNeededTextBox.Text = Content.Job.MemoryNeeded.ToString();
+ } else {
+ this.jobIdTextBox.Text = string.Empty;
+ this.dateCreatedTextBox.Text = string.Empty;
+ this.priorityTextBox.Text = string.Empty;
+ this.coresNeededTextBox.Text = string.Empty;
+ this.memoryNeededTextBox.Text = string.Empty;
+ }
+ }
+ }
+
+ private void Content_JobStateChanged(object sender, EventArgs e) {
+ if (InvokeRequired) {
+ Invoke(new EventHandler(Content_JobStateChanged), sender, e);
+ } else {
+ if (Content != null && Content.Job != null) {
+ this.stateTextBox.Text = Content.Job.JobState.ToString();
+ this.executionTimeTextBox.Text = Content.Job.ExecutionTime.ToString();
+ this.dateCalculatedText.Text = Content.Job.DateCalculated.ToString();
+ this.dateFinishedTextBox.Text = Content.Job.DateFinished.ToString();
+ this.exceptionTextBox.Text = Content.Job.Exception;
+ } else {
+ this.stateTextBox.Text = string.Empty;
+ this.executionTimeTextBox.Text = string.Empty;
+ this.dateCalculatedText.Text = string.Empty;
+ this.dateFinishedTextBox.Text = string.Empty;
+ this.exceptionTextBox.Text = string.Empty;
+ }
+ }
+ }
+
+ protected override void SetEnabledStateOfControls() {
+ base.SetEnabledStateOfControls();
+ this.jobIdTextBox.ReadOnly = true;
+ this.stateTextBox.ReadOnly = true;
+ this.executionTimeTextBox.ReadOnly = true;
+ this.dateCreatedTextBox.ReadOnly = true;
+ this.dateCalculatedText.ReadOnly = true;
+ this.dateFinishedTextBox.ReadOnly = true;
+ this.exceptionTextBox.ReadOnly = true;
+
+ this.priorityTextBox.ReadOnly = this.ReadOnly;
+ this.coresNeededTextBox.ReadOnly = this.ReadOnly;
+ this.memoryNeededTextBox.ReadOnly = this.ReadOnly;
+ this.computeInParallelCheckBox.Enabled = !this.ReadOnly && this.Content != null && this.Content.OptimizerJob != null && this.Content.OptimizerJob.IsParallelizable;
+
+ optimizerNamedItemView.ReadOnly = true;
+ ShowOrHideChildJobTabPage();
+ }
+
+ void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
+ if (InvokeRequired) {
+ Invoke(new EventHandler(OptimizerJob_ComputeInParallelChanged), sender, e);
+ } else {
+ computeInParallelCheckBox.Checked = Content.OptimizerJob.ComputeInParallel;
+ ShowOrHideChildJobTabPage();
+ }
+ }
+
+ private void ShowOrHideChildJobTabPage() {
+ if (Content != null && Content.OptimizerJob != null) {
+ if (!Content.OptimizerJob.ComputeInParallel) {
+ if (tabControl.TabPages.Contains(childJobsTabPage))
+ tabControl.TabPages.Remove(childJobsTabPage);
+ } else {
+ if (!tabControl.TabPages.Contains(childJobsTabPage))
+ tabControl.TabPages.Insert(1, childJobsTabPage);
+ }
+ }
+ }
+ #endregion
+
+ private void computeInParallelCheckBox_CheckedChanged(object sender, EventArgs e) {
+ if (Content != null && Content.OptimizerJob != null) {
+ this.Content.OptimizerJob.ComputeInParallel = this.computeInParallelCheckBox.Checked;
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.designer.cs (revision 5050)
@@ -0,0 +1,494 @@
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class HiveJobView {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.stateLabel = new System.Windows.Forms.Label();
+ this.stateTextBox = new System.Windows.Forms.TextBox();
+ this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+ this.dateCreatedTextBox = new System.Windows.Forms.TextBox();
+ this.dateFinishedTextBox = new System.Windows.Forms.TextBox();
+ this.exceptionTextBox = new System.Windows.Forms.TextBox();
+ this.executionTimeLabel = new System.Windows.Forms.Label();
+ this.dateCreatedLabel = new System.Windows.Forms.Label();
+ this.dateFinishedLabel = new System.Windows.Forms.Label();
+ this.exceptionLabel = new System.Windows.Forms.Label();
+ this.dateCalculatedText = new System.Windows.Forms.TextBox();
+ this.dateCalculatedLabel = new System.Windows.Forms.Label();
+ this.jobStatusGroupBox = new System.Windows.Forms.GroupBox();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.detailsTabPage = new System.Windows.Forms.TabPage();
+ this.optimizerGroupBox = new System.Windows.Forms.GroupBox();
+ this.optimizerNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
+ this.configurationGroupBox = new System.Windows.Forms.GroupBox();
+ this.priorityTextBox = new System.Windows.Forms.TextBox();
+ this.priorityLabel = new System.Windows.Forms.Label();
+ this.coresNeededTextBox = new System.Windows.Forms.TextBox();
+ this.memoryNeededTextBox = new System.Windows.Forms.TextBox();
+ this.memoryNeededLabel = new System.Windows.Forms.Label();
+ this.coresNeededLabel = new System.Windows.Forms.Label();
+ this.computeInParallelLabel = new System.Windows.Forms.Label();
+ this.computeInParallelCheckBox = new System.Windows.Forms.CheckBox();
+ this.jobIdLabel = new System.Windows.Forms.Label();
+ this.jobIdTextBox = new System.Windows.Forms.TextBox();
+ this.childJobsTabPage = new System.Windows.Forms.TabPage();
+ this.childHiveJobView = new HiveJobListView();
+ this.runsTabPage = new System.Windows.Forms.TabPage();
+ this.logTabPage = new System.Windows.Forms.TabPage();
+ this.logView = new HeuristicLab.Core.Views.LogView();
+ this.runCollectionViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+ this.jobStatusGroupBox.SuspendLayout();
+ this.tabControl.SuspendLayout();
+ this.detailsTabPage.SuspendLayout();
+ this.optimizerGroupBox.SuspendLayout();
+ this.configurationGroupBox.SuspendLayout();
+ this.childJobsTabPage.SuspendLayout();
+ this.runsTabPage.SuspendLayout();
+ this.logTabPage.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // stateLabel
+ //
+ this.stateLabel.AutoSize = true;
+ this.stateLabel.Location = new System.Drawing.Point(7, 19);
+ this.stateLabel.Name = "stateLabel";
+ this.stateLabel.Size = new System.Drawing.Size(35, 13);
+ this.stateLabel.TabIndex = 0;
+ this.stateLabel.Text = "State:";
+ //
+ // stateTextBox
+ //
+ this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.stateTextBox.Location = new System.Drawing.Point(95, 19);
+ this.stateTextBox.Name = "stateTextBox";
+ this.stateTextBox.Size = new System.Drawing.Size(509, 20);
+ this.stateTextBox.TabIndex = 2;
+ //
+ // executionTimeTextBox
+ //
+ this.executionTimeTextBox.Location = new System.Drawing.Point(95, 41);
+ this.executionTimeTextBox.Name = "executionTimeTextBox";
+ this.executionTimeTextBox.Size = new System.Drawing.Size(509, 20);
+ this.executionTimeTextBox.TabIndex = 4;
+ //
+ // dateCreatedTextBox
+ //
+ this.dateCreatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.dateCreatedTextBox.Location = new System.Drawing.Point(95, 63);
+ this.dateCreatedTextBox.Name = "dateCreatedTextBox";
+ this.dateCreatedTextBox.Size = new System.Drawing.Size(509, 20);
+ this.dateCreatedTextBox.TabIndex = 5;
+ //
+ // dateFinishedTextBox
+ //
+ this.dateFinishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.dateFinishedTextBox.Location = new System.Drawing.Point(95, 107);
+ this.dateFinishedTextBox.Name = "dateFinishedTextBox";
+ this.dateFinishedTextBox.Size = new System.Drawing.Size(509, 20);
+ this.dateFinishedTextBox.TabIndex = 6;
+ //
+ // exceptionTextBox
+ //
+ this.exceptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.exceptionTextBox.Location = new System.Drawing.Point(95, 129);
+ this.exceptionTextBox.Name = "exceptionTextBox";
+ this.exceptionTextBox.Size = new System.Drawing.Size(509, 20);
+ this.exceptionTextBox.TabIndex = 10;
+ //
+ // executionTimeLabel
+ //
+ this.executionTimeLabel.AutoSize = true;
+ this.executionTimeLabel.Location = new System.Drawing.Point(7, 41);
+ this.executionTimeLabel.Name = "executionTimeLabel";
+ this.executionTimeLabel.Size = new System.Drawing.Size(80, 13);
+ this.executionTimeLabel.TabIndex = 13;
+ this.executionTimeLabel.Text = "ExecutionTime:";
+ //
+ // dateCreatedLabel
+ //
+ this.dateCreatedLabel.AutoSize = true;
+ this.dateCreatedLabel.Location = new System.Drawing.Point(7, 63);
+ this.dateCreatedLabel.Name = "dateCreatedLabel";
+ this.dateCreatedLabel.Size = new System.Drawing.Size(70, 13);
+ this.dateCreatedLabel.TabIndex = 14;
+ this.dateCreatedLabel.Text = "DateCreated:";
+ //
+ // dateFinishedLabel
+ //
+ this.dateFinishedLabel.AutoSize = true;
+ this.dateFinishedLabel.Location = new System.Drawing.Point(7, 107);
+ this.dateFinishedLabel.Name = "dateFinishedLabel";
+ this.dateFinishedLabel.Size = new System.Drawing.Size(72, 13);
+ this.dateFinishedLabel.TabIndex = 15;
+ this.dateFinishedLabel.Text = "DateFinished:";
+ //
+ // exceptionLabel
+ //
+ this.exceptionLabel.AutoSize = true;
+ this.exceptionLabel.Location = new System.Drawing.Point(7, 129);
+ this.exceptionLabel.Name = "exceptionLabel";
+ this.exceptionLabel.Size = new System.Drawing.Size(57, 13);
+ this.exceptionLabel.TabIndex = 19;
+ this.exceptionLabel.Text = "Exception:";
+ //
+ // dateCalculatedText
+ //
+ this.dateCalculatedText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.dateCalculatedText.Location = new System.Drawing.Point(95, 85);
+ this.dateCalculatedText.Name = "dateCalculatedText";
+ this.dateCalculatedText.Size = new System.Drawing.Size(509, 20);
+ this.dateCalculatedText.TabIndex = 22;
+ //
+ // dateCalculatedLabel
+ //
+ this.dateCalculatedLabel.AutoSize = true;
+ this.dateCalculatedLabel.Location = new System.Drawing.Point(7, 85);
+ this.dateCalculatedLabel.Name = "dateCalculatedLabel";
+ this.dateCalculatedLabel.Size = new System.Drawing.Size(83, 13);
+ this.dateCalculatedLabel.TabIndex = 23;
+ this.dateCalculatedLabel.Text = "DateCalculated:";
+ //
+ // jobStatusGroupBox
+ //
+ this.jobStatusGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.jobStatusGroupBox.Controls.Add(this.stateTextBox);
+ this.jobStatusGroupBox.Controls.Add(this.dateCalculatedLabel);
+ this.jobStatusGroupBox.Controls.Add(this.stateLabel);
+ this.jobStatusGroupBox.Controls.Add(this.dateCalculatedText);
+ this.jobStatusGroupBox.Controls.Add(this.dateFinishedTextBox);
+ this.jobStatusGroupBox.Controls.Add(this.executionTimeTextBox);
+ this.jobStatusGroupBox.Controls.Add(this.dateCreatedTextBox);
+ this.jobStatusGroupBox.Controls.Add(this.executionTimeLabel);
+ this.jobStatusGroupBox.Controls.Add(this.exceptionLabel);
+ this.jobStatusGroupBox.Controls.Add(this.dateCreatedLabel);
+ this.jobStatusGroupBox.Controls.Add(this.dateFinishedLabel);
+ this.jobStatusGroupBox.Controls.Add(this.exceptionTextBox);
+ this.jobStatusGroupBox.Location = new System.Drawing.Point(6, 226);
+ this.jobStatusGroupBox.Name = "jobStatusGroupBox";
+ this.jobStatusGroupBox.Size = new System.Drawing.Size(610, 162);
+ this.jobStatusGroupBox.TabIndex = 24;
+ this.jobStatusGroupBox.TabStop = false;
+ this.jobStatusGroupBox.Text = "Job Status";
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.detailsTabPage);
+ this.tabControl.Controls.Add(this.childJobsTabPage);
+ this.tabControl.Controls.Add(this.runsTabPage);
+ this.tabControl.Controls.Add(this.logTabPage);
+ this.tabControl.Location = new System.Drawing.Point(3, 3);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(627, 518);
+ this.tabControl.TabIndex = 25;
+ //
+ // detailsTabPage
+ //
+ this.detailsTabPage.Controls.Add(this.optimizerGroupBox);
+ this.detailsTabPage.Controls.Add(this.configurationGroupBox);
+ this.detailsTabPage.Controls.Add(this.jobIdLabel);
+ this.detailsTabPage.Controls.Add(this.jobIdTextBox);
+ this.detailsTabPage.Controls.Add(this.jobStatusGroupBox);
+ this.detailsTabPage.Location = new System.Drawing.Point(4, 22);
+ this.detailsTabPage.Name = "detailsTabPage";
+ this.detailsTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.detailsTabPage.Size = new System.Drawing.Size(619, 492);
+ this.detailsTabPage.TabIndex = 0;
+ this.detailsTabPage.Text = "Details";
+ this.detailsTabPage.UseVisualStyleBackColor = true;
+ //
+ // optimizerGroupBox
+ //
+ this.optimizerGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.optimizerGroupBox.Controls.Add(this.optimizerNamedItemView);
+ this.optimizerGroupBox.Location = new System.Drawing.Point(6, 29);
+ this.optimizerGroupBox.Name = "optimizerGroupBox";
+ this.optimizerGroupBox.Size = new System.Drawing.Size(610, 74);
+ this.optimizerGroupBox.TabIndex = 28;
+ this.optimizerGroupBox.TabStop = false;
+ this.optimizerGroupBox.Text = "Optimizer";
+ //
+ // optimizerNamedItemView
+ //
+ this.optimizerNamedItemView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.optimizerNamedItemView.Caption = "NamedItem View";
+ this.optimizerNamedItemView.Content = null;
+ this.optimizerNamedItemView.Location = new System.Drawing.Point(0, 20);
+ this.optimizerNamedItemView.Name = "optimizerNamedItemView";
+ this.optimizerNamedItemView.ReadOnly = false;
+ this.optimizerNamedItemView.Size = new System.Drawing.Size(604, 51);
+ this.optimizerNamedItemView.TabIndex = 0;
+ //
+ // configurationGroupBox
+ //
+ this.configurationGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.configurationGroupBox.Controls.Add(this.priorityTextBox);
+ this.configurationGroupBox.Controls.Add(this.priorityLabel);
+ this.configurationGroupBox.Controls.Add(this.coresNeededTextBox);
+ this.configurationGroupBox.Controls.Add(this.memoryNeededTextBox);
+ this.configurationGroupBox.Controls.Add(this.memoryNeededLabel);
+ this.configurationGroupBox.Controls.Add(this.coresNeededLabel);
+ this.configurationGroupBox.Controls.Add(this.computeInParallelLabel);
+ this.configurationGroupBox.Controls.Add(this.computeInParallelCheckBox);
+ this.configurationGroupBox.Location = new System.Drawing.Point(6, 105);
+ this.configurationGroupBox.Name = "configurationGroupBox";
+ this.configurationGroupBox.Size = new System.Drawing.Size(610, 119);
+ this.configurationGroupBox.TabIndex = 27;
+ this.configurationGroupBox.TabStop = false;
+ this.configurationGroupBox.Text = "Configuration";
+ //
+ // priorityTextBox
+ //
+ this.priorityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.priorityTextBox.Location = new System.Drawing.Point(108, 66);
+ this.priorityTextBox.Name = "priorityTextBox";
+ this.priorityTextBox.Size = new System.Drawing.Size(496, 20);
+ this.priorityTextBox.TabIndex = 41;
+ //
+ // priorityLabel
+ //
+ this.priorityLabel.AutoSize = true;
+ this.priorityLabel.Location = new System.Drawing.Point(7, 66);
+ this.priorityLabel.Name = "priorityLabel";
+ this.priorityLabel.Size = new System.Drawing.Size(41, 13);
+ this.priorityLabel.TabIndex = 42;
+ this.priorityLabel.Text = "Priority:";
+ //
+ // coresNeededTextBox
+ //
+ this.coresNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.coresNeededTextBox.Location = new System.Drawing.Point(108, 20);
+ this.coresNeededTextBox.Name = "coresNeededTextBox";
+ this.coresNeededTextBox.Size = new System.Drawing.Size(496, 20);
+ this.coresNeededTextBox.TabIndex = 37;
+ //
+ // memoryNeededTextBox
+ //
+ this.memoryNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.memoryNeededTextBox.Location = new System.Drawing.Point(108, 42);
+ this.memoryNeededTextBox.Name = "memoryNeededTextBox";
+ this.memoryNeededTextBox.Size = new System.Drawing.Size(496, 20);
+ this.memoryNeededTextBox.TabIndex = 38;
+ //
+ // memoryNeededLabel
+ //
+ this.memoryNeededLabel.AutoSize = true;
+ this.memoryNeededLabel.Location = new System.Drawing.Point(7, 42);
+ this.memoryNeededLabel.Name = "memoryNeededLabel";
+ this.memoryNeededLabel.Size = new System.Drawing.Size(85, 13);
+ this.memoryNeededLabel.TabIndex = 40;
+ this.memoryNeededLabel.Text = "MemoryNeeded:";
+ //
+ // coresNeededLabel
+ //
+ this.coresNeededLabel.AutoSize = true;
+ this.coresNeededLabel.Location = new System.Drawing.Point(7, 20);
+ this.coresNeededLabel.Name = "coresNeededLabel";
+ this.coresNeededLabel.Size = new System.Drawing.Size(75, 13);
+ this.coresNeededLabel.TabIndex = 39;
+ this.coresNeededLabel.Text = "CoresNeeded:";
+ //
+ // computeInParallelLabel
+ //
+ this.computeInParallelLabel.AutoSize = true;
+ this.computeInParallelLabel.Location = new System.Drawing.Point(7, 93);
+ this.computeInParallelLabel.Name = "computeInParallelLabel";
+ this.computeInParallelLabel.Size = new System.Drawing.Size(95, 13);
+ this.computeInParallelLabel.TabIndex = 36;
+ this.computeInParallelLabel.Text = "ComputeInParallel:";
+ //
+ // computeInParallelCheckBox
+ //
+ this.computeInParallelCheckBox.AutoSize = true;
+ this.computeInParallelCheckBox.Location = new System.Drawing.Point(108, 92);
+ this.computeInParallelCheckBox.Name = "computeInParallelCheckBox";
+ this.computeInParallelCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.computeInParallelCheckBox.TabIndex = 35;
+ this.computeInParallelCheckBox.UseVisualStyleBackColor = true;
+ this.computeInParallelCheckBox.CheckedChanged += new System.EventHandler(this.computeInParallelCheckBox_CheckedChanged);
+ //
+ // jobIdLabel
+ //
+ this.jobIdLabel.AutoSize = true;
+ this.jobIdLabel.Location = new System.Drawing.Point(3, 6);
+ this.jobIdLabel.Name = "jobIdLabel";
+ this.jobIdLabel.Size = new System.Drawing.Size(36, 13);
+ this.jobIdLabel.TabIndex = 25;
+ this.jobIdLabel.Text = "JobId:";
+ //
+ // jobIdTextBox
+ //
+ this.jobIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.jobIdTextBox.Location = new System.Drawing.Point(91, 6);
+ this.jobIdTextBox.Name = "jobIdTextBox";
+ this.jobIdTextBox.Size = new System.Drawing.Size(525, 20);
+ this.jobIdTextBox.TabIndex = 26;
+ //
+ // childJobsTabPage
+ //
+ this.childJobsTabPage.Controls.Add(this.childHiveJobView);
+ this.childJobsTabPage.Location = new System.Drawing.Point(4, 22);
+ this.childJobsTabPage.Name = "childJobsTabPage";
+ this.childJobsTabPage.Size = new System.Drawing.Size(619, 492);
+ this.childJobsTabPage.TabIndex = 2;
+ this.childJobsTabPage.Text = "Child Jobs";
+ this.childJobsTabPage.UseVisualStyleBackColor = true;
+ //
+ // childHiveJobView
+ //
+ this.childHiveJobView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.childHiveJobView.Caption = "JobItemList View";
+ this.childHiveJobView.Content = null;
+ this.childHiveJobView.Location = new System.Drawing.Point(3, 3);
+ this.childHiveJobView.Name = "childHiveJobView";
+ this.childHiveJobView.ReadOnly = false;
+ this.childHiveJobView.Size = new System.Drawing.Size(613, 486);
+ this.childHiveJobView.TabIndex = 0;
+ //
+ // runsTabPage
+ //
+ this.runsTabPage.Controls.Add(this.runCollectionViewHost);
+ this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+ this.runsTabPage.Name = "runsTabPage";
+ this.runsTabPage.Size = new System.Drawing.Size(619, 492);
+ this.runsTabPage.TabIndex = 4;
+ this.runsTabPage.Text = "Runs";
+ this.runsTabPage.UseVisualStyleBackColor = true;
+ //
+ // logTabPage
+ //
+ this.logTabPage.Controls.Add(this.logView);
+ this.logTabPage.Location = new System.Drawing.Point(4, 22);
+ this.logTabPage.Name = "logTabPage";
+ this.logTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.logTabPage.Size = new System.Drawing.Size(619, 492);
+ this.logTabPage.TabIndex = 1;
+ this.logTabPage.Text = "Log";
+ this.logTabPage.UseVisualStyleBackColor = true;
+ //
+ // logView
+ //
+ this.logView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.logView.Caption = "Log View";
+ this.logView.Content = null;
+ this.logView.Location = new System.Drawing.Point(3, 3);
+ this.logView.Name = "logView";
+ this.logView.ReadOnly = false;
+ this.logView.Size = new System.Drawing.Size(613, 486);
+ this.logView.TabIndex = 0;
+ //
+ // runCollectionViewHost
+ //
+ this.runCollectionViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.runCollectionViewHost.Caption = "View";
+ this.runCollectionViewHost.Content = null;
+ this.runCollectionViewHost.Enabled = false;
+ this.runCollectionViewHost.Location = new System.Drawing.Point(3, 3);
+ this.runCollectionViewHost.Name = "runCollectionViewHost";
+ this.runCollectionViewHost.ReadOnly = false;
+ this.runCollectionViewHost.Size = new System.Drawing.Size(613, 486);
+ this.runCollectionViewHost.TabIndex = 0;
+ this.runCollectionViewHost.ViewType = null;
+ //
+ // HiveJobView
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.tabControl);
+ this.Name = "HiveJobView";
+ this.Size = new System.Drawing.Size(633, 524);
+ this.jobStatusGroupBox.ResumeLayout(false);
+ this.jobStatusGroupBox.PerformLayout();
+ this.tabControl.ResumeLayout(false);
+ this.detailsTabPage.ResumeLayout(false);
+ this.detailsTabPage.PerformLayout();
+ this.optimizerGroupBox.ResumeLayout(false);
+ this.configurationGroupBox.ResumeLayout(false);
+ this.configurationGroupBox.PerformLayout();
+ this.childJobsTabPage.ResumeLayout(false);
+ this.runsTabPage.ResumeLayout(false);
+ this.logTabPage.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label stateLabel;
+ private System.Windows.Forms.TextBox stateTextBox;
+ private System.Windows.Forms.TextBox executionTimeTextBox;
+ private System.Windows.Forms.TextBox dateCreatedTextBox;
+ private System.Windows.Forms.TextBox dateFinishedTextBox;
+ private System.Windows.Forms.TextBox exceptionTextBox;
+ private System.Windows.Forms.Label executionTimeLabel;
+ private System.Windows.Forms.Label dateCreatedLabel;
+ private System.Windows.Forms.Label dateFinishedLabel;
+ private System.Windows.Forms.Label exceptionLabel;
+ private System.Windows.Forms.TextBox dateCalculatedText;
+ private System.Windows.Forms.Label dateCalculatedLabel;
+ private System.Windows.Forms.GroupBox jobStatusGroupBox;
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage detailsTabPage;
+ private System.Windows.Forms.TabPage logTabPage;
+ private Core.Views.LogView logView;
+ private System.Windows.Forms.Label jobIdLabel;
+ private System.Windows.Forms.TextBox jobIdTextBox;
+ private System.Windows.Forms.TabPage childJobsTabPage;
+ private HiveJobListView childHiveJobView;
+ private System.Windows.Forms.GroupBox configurationGroupBox;
+ private System.Windows.Forms.TextBox priorityTextBox;
+ private System.Windows.Forms.Label priorityLabel;
+ private System.Windows.Forms.TextBox coresNeededTextBox;
+ private System.Windows.Forms.TextBox memoryNeededTextBox;
+ private System.Windows.Forms.Label memoryNeededLabel;
+ private System.Windows.Forms.Label coresNeededLabel;
+ private System.Windows.Forms.Label computeInParallelLabel;
+ private System.Windows.Forms.CheckBox computeInParallelCheckBox;
+ private System.Windows.Forms.GroupBox optimizerGroupBox;
+ private Core.Views.NamedItemView optimizerNamedItemView;
+ private System.Windows.Forms.TabPage runsTabPage;
+ private MainForm.WindowsForms.ViewHost runCollectionViewHost;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.resx (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/HiveJobView.resx (revision 5050)
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ConnectionSetupMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ConnectionSetupMenuItem.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ConnectionSetupMenuItem.cs (revision 5050)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Clients.Hive.Views;
+
+namespace HeuristicLab.Optimizer.MenuItems {
+ public class ConnectionSetupMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+ public override string Name {
+ get { return "Set &Username / Password..."; }
+ }
+ public override IEnumerable Structure {
+ get { return new string[] { "&Services", "&Hive" }; }
+ }
+ public override System.Drawing.Image Image {
+ get {
+ return HeuristicLab.Common.Resources.VS2008ImageLibrary.NetworkConnections;
+ }
+ }
+ public override void Execute() {
+ using (var dialog = new ConnectionSetupView()) {
+ dialog.ShowDialog((IWin32Window)MainFormManager.MainForm);
+ }
+ }
+ public override int Position {
+ get { return 11000; }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ExperimentManagerMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ExperimentManagerMenuItem.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/ExperimentManager/MenuItems/ExperimentManagerMenuItem.cs (revision 5050)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Clients.Hive;
+
+namespace HeuristicLab.Optimizer.MenuItems {
+ public class ExperimentManagerMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+ public override string Name {
+ get { return "&Experiment Manager"; }
+ }
+ public override IEnumerable Structure {
+ get { return new string[] { "&Services", "&Hive" }; }
+ }
+ public override void Execute() {
+ MainFormManager.MainForm.ShowContent(new HiveExperimentManagerClient());
+ }
+ public override int Position {
+ get { return 10000; }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj (revision 5050)
@@ -0,0 +1,190 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}
+ Library
+ Properties
+ HeuristicLab.Clients.Hive.Views
+ HeuristicLab.Clients.Hive.Views-3.4
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimizer-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ ConnectionSetupView.cs
+
+
+ UserControl
+
+
+ HiveExperimentListView.cs
+
+
+ UserControl
+
+
+ HiveExperimentManagerView.cs
+
+
+ UserControl
+
+
+ HiveExperimentView.cs
+
+
+ UserControl
+
+
+ HiveJobListView.cs
+
+
+ UserControl
+
+
+ HiveJobView.cs
+
+
+
+
+
+ UserControl
+
+
+ ProgressView.cs
+
+
+
+
+
+
+
+
+
+ ConnectionSetupView.cs
+
+
+ HiveExperimentManagerView.cs
+
+
+ HiveExperimentView.cs
+
+
+ HiveJobView.cs
+
+
+ ProgressView.cs
+
+
+
+
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}
+ HeuristicLab.Clients.Hive-3.4
+
+
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}
+ HeuristicLab.Hive-3.4
+
+
+ {14424A16-48D4-445E-80BF-DDF617548BBB}
+ HeuristicLab.Services.Hive.Common-3.4
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLabClientsHiveViewsPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLabClientsHiveViewsPlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLabClientsHiveViewsPlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ [Plugin("HeuristicLab.Clients.Hive.Views", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Clients.Hive.Views-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabClientsHiveViewsPlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.cs (revision 5050)
@@ -0,0 +1,154 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Hive.Views {
+ public partial class ProgressView : HeuristicLab.MainForm.WindowsForms.View {
+ private ContentView parentView;
+ private IProgress progress;
+ public IProgress Progress {
+ get {
+ return this.progress;
+ }
+ set {
+ if (this.progress != value) {
+ if (this.progress != null) {
+ DeregisterProgressEvents();
+ }
+ this.progress = value;
+ RegisterProgressEvents();
+ OnProgressChanged();
+ }
+ }
+ }
+
+ public bool CancelEnabled {
+ get {
+ return cancelButton.Visible;
+ }
+ set {
+ if (InvokeRequired) {
+ Invoke(new Action((ce) => { CancelEnabled = ce; }), value);
+ } else {
+ cancelButton.Visible = value;
+ }
+ }
+ }
+
+ /// This is the View which will be locked if lockParentView is true
+ public ProgressView(ContentView parentView, IProgress progress) {
+ InitializeComponent();
+ this.parentView = parentView;
+ this.Progress = progress;
+
+ this.CancelEnabled = false;
+
+ progressBar.Style = ProgressBarStyle.Marquee;
+
+ this.Left = (parentView.ClientRectangle.Width / 2) - (this.Width / 2);
+ this.Top = (parentView.ClientRectangle.Height / 2) - (this.Height / 2);
+ this.Anchor = AnchorStyles.Left | AnchorStyles.Top;
+
+ LockBackground();
+
+ parentView.Controls.Add(this);
+ this.BringToFront();
+ }
+
+ private void RegisterProgressEvents() {
+ progress.Finished += new EventHandler(progress_Finished);
+ progress.StatusChanged += new EventHandler(progress_StatusChanged);
+ progress.ProgressValueChanged += new EventHandler(progress_ProgressChanged);
+ }
+
+ private void DeregisterProgressEvents() {
+ progress.Finished -= new EventHandler(progress_Finished);
+ progress.StatusChanged -= new EventHandler(progress_StatusChanged);
+ progress.ProgressValueChanged -= new EventHandler(progress_ProgressChanged);
+ }
+
+ void progress_Finished(object sender, EventArgs e) {
+ Finish();
+ }
+
+ void progress_ProgressChanged(object sender, EventArgs e) {
+ if (InvokeRequired) {
+ Invoke(new EventHandler(progress_ProgressChanged), sender, e);
+ } else {
+ progressBar.Style = ProgressBarStyle.Blocks;
+ this.progressBar.Value = Math.Min(this.progressBar.Maximum, (int)(progress.ProgressValue * progressBar.Maximum));
+ }
+ }
+
+ void progress_StatusChanged(object sender, EventArgs e) {
+ if (InvokeRequired) {
+ Invoke(new EventHandler(progress_StatusChanged), sender, e);
+ } else {
+ statusLabel.Text = progress.Status;
+ }
+ }
+
+ private void LockBackground() {
+ if (InvokeRequired) {
+ Invoke(new Action(LockBackground));
+ } else {
+ this.parentView.Locked = true;
+ foreach (Control c in this.parentView.Controls) {
+ c.Enabled = false;
+ }
+ this.Enabled = true;
+ this.ReadOnly = false;
+ }
+ }
+
+ public void Finish() {
+ if (InvokeRequired) {
+ Invoke(new Action(Finish));
+ } else {
+ progressBar.Value = progressBar.Maximum;
+ parentView.Locked = false;
+ foreach (Control c in this.parentView.Controls) {
+ c.Enabled = true;
+ }
+ parentView.Controls.Remove(this);
+ this.Dispose();
+ }
+ }
+
+ private void cancelButton_Click(object sender, EventArgs e) {
+ Finish();
+ }
+
+ private void OnProgressChanged() {
+ progress_StatusChanged(this, EventArgs.Empty);
+ progress_ProgressChanged(this, EventArgs.Empty);
+ }
+
+ public event EventHandler Canceled;
+ protected virtual void OnCanceled() {
+ var handler = Canceled;
+ if (handler != null) Canceled(this, EventArgs.Empty);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.designer.cs (revision 5050)
@@ -0,0 +1,96 @@
+using HeuristicLab.MainForm.WindowsForms;
+namespace HeuristicLab.Clients.Hive.Views {
+ partial class ProgressView : View {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.progressBar = new System.Windows.Forms.ProgressBar();
+ this.statusLabel = new System.Windows.Forms.Label();
+ this.cancelButton = new System.Windows.Forms.Button();
+ this.panel = new System.Windows.Forms.Panel();
+ this.panel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // progressBar
+ //
+ this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.progressBar.Location = new System.Drawing.Point(3, 3);
+ this.progressBar.Name = "progressBar";
+ this.progressBar.Size = new System.Drawing.Size(352, 23);
+ this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+ this.progressBar.TabIndex = 0;
+ //
+ // statusLabel
+ //
+ this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.statusLabel.Location = new System.Drawing.Point(3, 33);
+ this.statusLabel.Name = "statusLabel";
+ this.statusLabel.Size = new System.Drawing.Size(352, 17);
+ this.statusLabel.TabIndex = 1;
+ //
+ // cancelButton
+ //
+ this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cancelButton.Location = new System.Drawing.Point(280, 53);
+ this.cancelButton.Name = "cancelButton";
+ this.cancelButton.Size = new System.Drawing.Size(75, 23);
+ this.cancelButton.TabIndex = 2;
+ this.cancelButton.Text = "Cancel";
+ this.cancelButton.UseVisualStyleBackColor = true;
+ this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+ //
+ // panel
+ //
+ this.panel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel.Controls.Add(this.progressBar);
+ this.panel.Controls.Add(this.cancelButton);
+ this.panel.Controls.Add(this.statusLabel);
+ this.panel.Location = new System.Drawing.Point(0, 0);
+ this.panel.Name = "panel";
+ this.panel.Size = new System.Drawing.Size(360, 88);
+ this.panel.TabIndex = 3;
+ //
+ // ProgressView
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.panel);
+ this.Name = "ProgressView";
+ this.Size = new System.Drawing.Size(360, 88);
+ this.panel.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ProgressBar progressBar;
+ private System.Windows.Forms.Label statusLabel;
+ private System.Windows.Forms.Button cancelButton;
+ private System.Windows.Forms.Panel panel;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.resx (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Progress/ProgressView.resx (revision 5050)
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Clients.Hive.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c31cc708-fab2-4982-ba57-72e35440fad8")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/AddJobToHiveException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/AddJobToHiveException.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/AddJobToHiveException.cs (revision 5050)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ class AddJobToHiveException : Exception {
+ public AddJobToHiveException(string message) : base(message) { }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/JobResultPollingException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/JobResultPollingException.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/JobResultPollingException.cs (revision 5050)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ class JobResultPollingException : Exception {
+ public JobResultPollingException(string message) : base(message) { }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/OptimizerNotFoundException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/OptimizerNotFoundException.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/OptimizerNotFoundException.cs (revision 5050)
@@ -0,0 +1,30 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ class OptimizerNotFoundException : Exception {
+
+ public OptimizerNotFoundException(string message) : base(message) {
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/ServiceClientFactoryException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/ServiceClientFactoryException.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Exceptions/ServiceClientFactoryException.cs (revision 5050)
@@ -0,0 +1,28 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ public class ServiceClientFactoryException : Exception {
+ public ServiceClientFactoryException(string message) : base(message) { }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj (revision 5050)
@@ -0,0 +1,149 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}
+ Library
+ Properties
+ HeuristicLab.Clients.Hive
+ HeuristicLab.Clients.Hive-3.4
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Clients.Common-3.3.dll
+
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ False
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+ False
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Tracing-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Settings.settings
+
+
+
+
+
+ PublicSettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}
+ HeuristicLab.Hive-3.4
+
+
+ {14424A16-48D4-445E-80BF-DDF617548BBB}
+ HeuristicLab.Services.Hive.Common-3.4
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLabClientsHivePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLabClientsHivePlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLabClientsHivePlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+ [Plugin("HeuristicLab.Clients.Hive", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Clients.Hive-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabClientsHivePlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveExperimentClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveExperimentClient.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveExperimentClient.cs (revision 5050)
@@ -0,0 +1,620 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Tracing;
+using HeuristicLab.Services.Hive.Common;
+using HeuristicLab.Services.Hive.Common.ServiceContracts;
+
+namespace HeuristicLab.Clients.Hive {
+ using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
+ using HeuristicLab.Services.Hive.Common.DataTransfer;
+ using HeuristicLab.Clients.Hive.Jobs;
+
+ ///
+ /// An experiment which contains multiple batch runs of algorithms.
+ ///
+ [Item(itemName, itemDescription)]
+ public class HiveExperimentClient : NamedItem, IExecutable, IProgressReporter {
+ private object locker = new object();
+ private const string itemName = "Hive Experiment";
+ private const string itemDescription = "A runner for a single experiment, which's algorithms are executed in the Hive.";
+ private System.Timers.Timer timer;
+ private DateTime lastUpdateTime;
+ private Guid? rootJobId;
+ private JobResultPoller jobResultPoller;
+
+ private Guid hiveExperimentId;
+ public Guid HiveExperimentId {
+ get { return hiveExperimentId; }
+ set { hiveExperimentId = value; }
+ }
+
+ private HiveJob hiveJob;
+ public HiveJob HiveJob {
+ get { return hiveJob; }
+ set {
+ DeregisterHiveJobEvents();
+ if (hiveJob != value) {
+ hiveJob = value;
+ RegisterHiveJobEvents();
+ OnHiveJobChanged();
+ }
+ }
+ }
+
+ private ILog log;
+ public ILog Log {
+ get { return log; }
+ }
+
+ private string resourceIds;
+ public string ResourceIds {
+ get { return resourceIds; }
+ set {
+ if (resourceIds != value) {
+ resourceIds = value;
+ OnResourceIdsChanged();
+ }
+ }
+ }
+
+ private bool isPollingResults;
+ public bool IsPollingResults {
+ get { return isPollingResults; }
+ private set {
+ if (isPollingResults != value) {
+ isPollingResults = value;
+ OnIsPollingResultsChanged();
+ }
+ }
+ }
+
+ private bool isProgressing;
+ public bool IsProgressing {
+ get { return isProgressing; }
+ set {
+ if (isProgressing != value) {
+ isProgressing = value;
+ OnIsProgressingChanged();
+ }
+ }
+ }
+
+ private IProgress progress;
+ public IProgress Progress {
+ get { return progress; }
+ }
+
+ public HiveExperimentClient() : base(itemName, itemDescription) {
+ // TODO //this.ResourceIds = HeuristicLab.Hive.Experiment.Properties.Settings.Default.ResourceIds;
+ this.ResourceIds = "MyGroup";
+ this.log = new Log();
+ InitTimer();
+ }
+ public HiveExperimentClient(DT.HiveExperiment hiveExperimentDto) : this() {
+ UpdateFromDto(hiveExperimentDto);
+ }
+ protected HiveExperimentClient(HiveExperimentClient original, Cloner cloner)
+ : base(original, cloner) {
+ this.ResourceIds = original.resourceIds;
+ this.ExecutionState = original.executionState;
+ this.ExecutionTime = original.executionTime;
+ this.log = cloner.Clone(original.log);
+ this.lastUpdateTime = original.lastUpdateTime;
+ this.rootJobId = original.rootJobId;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new HiveExperimentClient(this, cloner);
+ }
+
+ public void UpdateFromDto(DT.HiveExperiment hiveExperimentDto) {
+ this.HiveExperimentId = hiveExperimentDto.Id;
+ this.Name = hiveExperimentDto.Name;
+ this.Description = hiveExperimentDto.Description;
+ // TODO: this.ResourceIds = hiveExperimentDto.ResourceIds;
+ this.rootJobId = hiveExperimentDto.RootJobId;
+ }
+
+ public DT.HiveExperiment ToHiveExperimentDto() {
+ return new DT.HiveExperiment() {
+ Id = this.HiveExperimentId,
+ Name = this.Name,
+ Description = this.Description,
+ //ResourceIds = this.ResourceIds,
+ RootJobId = this.rootJobId
+ };
+ }
+
+ public void SetExperiment(Optimization.Experiment experiment) {
+ this.HiveJob = new HiveJob(experiment);
+ Prepare();
+ }
+
+ private void RegisterHiveJobEvents() {
+ if (HiveJob != null) {
+ HiveJob.JobStateChanged += new EventHandler(HiveJob_JobStateChanged);
+ }
+ }
+
+ private void DeregisterHiveJobEvents() {
+ if (HiveJob != null) {
+ HiveJob.JobStateChanged -= new EventHandler(HiveJob_JobStateChanged);
+ }
+ }
+
+ ///
+ /// Returns the experiment from the root HiveJob
+ ///
+ public Optimization.Experiment GetExperiment() {
+ if (this.HiveJob != null) {
+ return HiveJob.OptimizerJob.OptimizerAsExperiment;
+ }
+ return null;
+ }
+
+ #region IExecutable Members
+ private Core.ExecutionState executionState;
+ public ExecutionState ExecutionState {
+ get { return executionState; }
+ private set {
+ if (executionState != value) {
+ executionState = value;
+ OnExecutionStateChanged();
+ }
+ }
+ }
+
+ private TimeSpan executionTime;
+ public TimeSpan ExecutionTime {
+ get { return executionTime; }
+ private set {
+ if (executionTime != value) {
+ executionTime = value;
+ OnExecutionTimeChanged();
+ }
+ }
+ }
+
+ public void Pause() {
+ throw new NotSupportedException();
+ }
+
+ public void Prepare() {
+ // do nothing
+ }
+
+ public void Start() {
+ OnStarted();
+ ExecutionTime = new TimeSpan();
+ lastUpdateTime = DateTime.Now;
+ this.ExecutionState = Core.ExecutionState.Started;
+
+ Thread t = new Thread(RunUploadExperiment);
+ t.Name = "RunUploadExperimentThread";
+ t.Start();
+ }
+
+ private void RunUploadExperiment() {
+ try {
+ this.progress = new Progress("Connecting to server...");
+ IsProgressing = true;
+ using (Disposable service = ServiceLocator.Instance.ServicePool.GetService()) {
+ IEnumerable groups = ToResourceIdList(this.ResourceIds);
+ this.HiveJob.SetIndexInParentOptimizerList(null);
+
+ int totalJobCount = this.HiveJob.GetAllHiveJobs().Count();
+ int jobCount = 0;
+
+ this.progress.Status = "Uploading jobs...";
+ UploadJobWithChildren(service.Obj, this.HiveJob, null, groups, ref jobCount, totalJobCount);
+ this.rootJobId = this.HiveJob.Job.Id;
+ LogMessage("Finished sending jobs to hive");
+
+ // insert or update HiveExperiment
+ this.progress.Status = "Uploading HiveExperiment...";
+
+ DT.HiveExperiment he = service.Obj.GetHiveExperiment(service.Obj.AddHiveExperiment(this.ToHiveExperimentDto()));
+ this.UpdateFromDto(he);
+
+ StartResultPolling();
+ }
+ }
+ catch (Exception e) {
+ OnExceptionOccured(e);
+ }
+ finally {
+ IsProgressing = false;
+ }
+ }
+
+ ///
+ /// Uploads the given job and all its child-jobs while setting the proper parentJobId values for the childs
+ ///
+ ///
+ ///
+ ///
+ /// shall be null if its the root job
+ ///
+ private void UploadJobWithChildren(IHiveService service, HiveJob hiveJob, HiveJob parentHiveJob, IEnumerable groups, ref int jobCount, int totalJobCount) {
+ jobCount++;
+ this.progress.Status = string.Format("Serializing job {0} of {1}", jobCount, totalJobCount);
+ JobData jobData;
+ if (hiveJob.OptimizerJob.ComputeInParallel &&
+ (hiveJob.OptimizerJob.Optimizer is Optimization.Experiment || hiveJob.OptimizerJob.Optimizer is Optimization.BatchRun)) {
+ hiveJob.Job.JobState = JobState.WaitingForChildJobs;
+ hiveJob.OptimizerJob.CollectChildJobs = false; // don't collect child-jobs on slaves
+ jobData = hiveJob.GetAsJobData(true);
+ } else {
+ jobData = hiveJob.GetAsJobData(false);
+ }
+
+ this.progress.Status = string.Format("Uploading job {0} of {1} ({2} kb)", jobCount, totalJobCount, jobData.Data.Count() / 1024);
+ this.progress.ProgressValue = (double)jobCount / totalJobCount;
+
+ if (parentHiveJob != null) {
+ //response = service.AddChildJob(parentHiveJob.Job.Id, serializedJob);
+ hiveJob.Job.Id = service.AddChildJob(parentHiveJob.Job.Id, hiveJob.Job, jobData);
+ } else {
+ // response = service.AddJobWithGroupStrings(serializedJob, groups);
+ hiveJob.Job.Id = service.AddJob(hiveJob.Job, jobData);
+ }
+
+ LogMessage(hiveJob.Job.Id, "Job sent to Hive");
+
+ foreach (HiveJob child in hiveJob.ChildHiveJobs) {
+ UploadJobWithChildren(service, child, hiveJob, groups, ref jobCount, totalJobCount);
+ }
+ }
+
+ ///
+ /// Converts a string which can contain Ids separated by ';' to a enumerable
+ ///
+ private IEnumerable ToResourceIdList(string resourceGroups) {
+ if (!string.IsNullOrEmpty(resourceGroups)) {
+ return resourceIds.Split(';');
+ } else {
+ return new List();
+ }
+ }
+
+ public void Stop() {
+ using (Disposable service = ServiceLocator.Instance.ServicePool.GetService()) {
+ foreach (HiveJob hj in HiveJob.GetAllHiveJobs()) {
+ service.Obj.AbortJob(hj.Job.Id);
+ }
+ }
+ }
+
+ #endregion
+
+ public void StartResultPolling() {
+ if (!jobResultPoller.IsPolling) {
+ jobResultPoller.Start();
+ } else {
+ throw new JobResultPollingException("Result polling already running");
+ }
+ }
+
+ public void StopResultPolling() {
+ if (jobResultPoller.IsPolling) {
+ jobResultPoller.Stop();
+ } else {
+ throw new JobResultPollingException("Result polling not running");
+ }
+ }
+
+ #region HiveJob Events
+ void HiveJob_JobStateChanged(object sender, EventArgs e) {
+ if (HiveJob != null) {
+ rootJobId = HiveJob.Job.Id;
+ }
+ }
+ #endregion
+
+ #region Eventhandler
+
+ public event EventHandler ExecutionTimeChanged;
+ private void OnExecutionTimeChanged() {
+ EventHandler handler = ExecutionTimeChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler ExecutionStateChanged;
+ private void OnExecutionStateChanged() {
+ LogMessage("ExecutionState changed to " + executionState.ToString());
+ EventHandler handler = ExecutionStateChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler Started;
+ private void OnStarted() {
+ LogMessage("Started");
+ timer.Start();
+ EventHandler handler = Started;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler Stopped;
+ private void OnStopped() {
+ LogMessage("Stopped");
+ timer.Stop();
+ EventHandler handler = Stopped;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler Paused;
+ private void OnPaused() {
+ LogMessage("Paused");
+ EventHandler handler = Paused;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler Prepared;
+ protected virtual void OnPrepared() {
+ LogMessage("Prepared");
+ EventHandler handler = Prepared;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler ResourceIdsChanged;
+ protected virtual void OnResourceIdsChanged() {
+ EventHandler handler = ResourceIdsChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler IsResultsPollingChanged;
+ private void OnIsPollingResultsChanged() {
+ if (this.IsPollingResults) {
+ LogMessage("Results Polling Started");
+ } else {
+ LogMessage("Results Polling Stopped");
+ }
+ EventHandler handler = IsResultsPollingChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler> ExceptionOccurred;
+ private void OnExceptionOccured(Exception e) {
+ var handler = ExceptionOccurred;
+ if (handler != null) handler(this, new EventArgs(e));
+ }
+
+ public event EventHandler HiveJobChanged;
+ private void OnHiveJobChanged() {
+ if (jobResultPoller != null && jobResultPoller.IsPolling) {
+ jobResultPoller.Stop();
+ DeregisterResultPollingEvents();
+ }
+ if (HiveJob != null) {
+ jobResultPoller = new JobResultPoller(HiveJob, ApplicationConstants.ResultPollingInterval);
+ RegisterResultPollingEvents();
+ }
+ EventHandler handler = HiveJobChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler IsProgressingChanged;
+ private void OnIsProgressingChanged() {
+ var handler = IsProgressingChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ #endregion
+
+ #region JobResultPoller Events
+ private void RegisterResultPollingEvents() {
+ jobResultPoller.ExceptionOccured += new EventHandler>(jobResultPoller_ExceptionOccured);
+ jobResultPoller.JobResultsReceived += new EventHandler>>(jobResultPoller_JobResultReceived);
+ jobResultPoller.PollingStarted += new EventHandler(jobResultPoller_PollingStarted);
+ jobResultPoller.PollingFinished += new EventHandler(jobResultPoller_PollingFinished);
+ jobResultPoller.IsPollingChanged += new EventHandler(jobResultPoller_IsPollingChanged);
+ }
+ private void DeregisterResultPollingEvents() {
+ jobResultPoller.ExceptionOccured -= new EventHandler>(jobResultPoller_ExceptionOccured);
+ jobResultPoller.JobResultsReceived -= new EventHandler>>(jobResultPoller_JobResultReceived);
+ jobResultPoller.PollingStarted -= new EventHandler(jobResultPoller_PollingStarted);
+ jobResultPoller.PollingFinished -= new EventHandler(jobResultPoller_PollingFinished);
+ jobResultPoller.IsPollingChanged -= new EventHandler(jobResultPoller_IsPollingChanged);
+ }
+ void jobResultPoller_IsPollingChanged(object sender, EventArgs e) {
+ this.IsPollingResults = jobResultPoller.IsPolling;
+ }
+ void jobResultPoller_PollingFinished(object sender, EventArgs e) {
+ LogMessage("Polling results finished");
+ }
+ void jobResultPoller_PollingStarted(object sender, EventArgs e) {
+ LogMessage("Polling results started");
+ }
+ void jobResultPoller_JobResultReceived(object sender, EventArgs> e) {
+ foreach (LightweightJob lightweightJob in e.Value) {
+ HiveJob hj = hiveJob.GetHiveJobByJobId(lightweightJob.Id);
+ if (hj != null) {
+ hj.UpdateFromLightweightJob(lightweightJob);
+ if ((hj.Job.JobState == JobState.Aborted ||
+ hj.Job.JobState == JobState.Failed ||
+ hj.Job.JobState == JobState.Finished) &&
+ !hj.IsFinishedOptimizerDownloaded) {
+ LogMessage(hj.Job.Id, "Downloading optimizer for job");
+ OptimizerJob optimizerJob = LoadOptimizerJob(hj.Job.Id);
+ if (optimizerJob == null) {
+ // something bad happened to this job. set to finished to allow the rest beeing downloaded
+ hj.IsFinishedOptimizerDownloaded = true;
+ } else {
+ if (lightweightJob.ParentJobId.HasValue) {
+ HiveJob parentHiveJob = HiveJob.GetHiveJobByJobId(lightweightJob.ParentJobId.Value);
+ parentHiveJob.UpdateChildOptimizer(optimizerJob, hj.Job.Id);
+ } else {
+ this.HiveJob.IsFinishedOptimizerDownloaded = true;
+ }
+ }
+ }
+ }
+ }
+ GC.Collect(); // force GC, because .NET is too lazy here (deserialization takes a lot of memory)
+ if (AllJobsFinished()) {
+ this.ExecutionState = Core.ExecutionState.Stopped;
+ StopResultPolling();
+ OnStopped();
+ }
+ }
+
+ private bool AllJobsFinished() {
+ return HiveJob.GetAllHiveJobs().All(hj => hj.IsFinishedOptimizerDownloaded);
+ }
+
+ void jobResultPoller_ExceptionOccured(object sender, EventArgs e) {
+ OnExceptionOccured(e.Value);
+ }
+ #endregion
+
+ #region Execution Time Timer
+ private void InitTimer() {
+ timer = new System.Timers.Timer(100);
+ timer.AutoReset = true;
+ timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+ }
+
+ private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
+ DateTime now = DateTime.Now;
+ ExecutionTime += now - lastUpdateTime;
+ lastUpdateTime = now;
+ }
+ #endregion
+
+ #region Logging
+ private void LogMessage(string message) {
+ // HeuristicLab.Log is not Thread-Safe, so lock on every call
+ lock (locker) {
+ log.LogMessage(message);
+ Logger.Debug(message);
+ }
+ }
+
+ private void LogMessage(Guid jobId, string message) {
+ //GetJobItemById(jobId).LogMessage(message);
+ LogMessage(message + " (jobId: " + jobId + ")");
+ }
+
+ #endregion
+
+ ///
+ /// Downloads the root job from hive and sets the experiment, rootJob and rootJobItem
+ ///
+ public void LoadHiveJob() {
+ progress = new Progress();
+ try {
+ IsProgressing = true;
+ int totalJobCount = 0;
+ int jobCount = 0;
+ progress.Status = "Connecting to Server...";
+ using (var service = ServiceLocator.Instance.ServicePool.GetService()) {
+ // fetch all Job objects to create the full tree of tree of HiveJob objects
+ progress.Status = "Downloading list of jobs...";
+ IEnumerable allResults = service.Obj.GetLightweightChildJobs(rootJobId.Value, true, true);
+ totalJobCount = allResults.Count();
+
+ // download them first
+ IDictionary allJobs = new Dictionary();
+ IDictionary allJobDatas = new Dictionary();
+ foreach (LightweightJob lightweightJob in allResults) {
+ jobCount++;
+ progress.Status = string.Format("Downloading {0} of {1} jobs...", jobCount, totalJobCount);
+ allJobs.Add(lightweightJob.Id, service.Obj.GetJob(lightweightJob.Id));
+ allJobDatas.Add(lightweightJob.Id, service.Obj.GetJobData(lightweightJob.Id));
+ progress.ProgressValue = (double)jobCount / totalJobCount;
+ }
+
+ jobCount = 1;
+ progress.Status = string.Format("Deserializing {0} of {1} jobs... ({2} kb)", jobCount, totalJobCount, allJobDatas[this.rootJobId.Value].Data.Count() / 1024);
+ this.HiveJob = new HiveJob(allJobs[this.rootJobId.Value], allJobDatas[this.rootJobId.Value], false);
+ allJobDatas.Remove(this.rootJobId.Value); // reduce memory footprint
+ allJobs.Remove(this.rootJobId.Value);
+ progress.ProgressValue = (double)jobCount / totalJobCount;
+
+ if (this.HiveJob.Job.DateFinished.HasValue) {
+ this.ExecutionTime = this.HiveJob.Job.DateFinished.Value - this.HiveJob.Job.DateCreated.Value;
+ this.lastUpdateTime = this.HiveJob.Job.DateFinished.Value;
+ this.ExecutionState = Core.ExecutionState.Stopped;
+ OnStopped();
+ } else {
+ this.ExecutionTime = DateTime.Now - this.HiveJob.Job.DateCreated.Value;
+ this.lastUpdateTime = DateTime.Now;
+ this.ExecutionState = Core.ExecutionState.Started;
+ OnStarted();
+ }
+
+ // build child-job tree
+ LoadChildResults(service.Obj, this.HiveJob, allResults, allJobs, allJobDatas, progress, totalJobCount, ref jobCount);
+ StartResultPolling();
+ }
+ }
+ catch (Exception e) {
+ OnExceptionOccured(e);
+ }
+ finally {
+ IsProgressing = false;
+ }
+ }
+
+ private void LoadChildResults(IHiveService service, HiveJob parentHiveJob, IEnumerable allResults, IDictionary allJobs, IDictionary allJobDatas, IProgress progress, int totalJobCount, ref int jobCount) {
+ IEnumerable childResults = from result in allResults
+ where result.ParentJobId.HasValue && result.ParentJobId.Value == parentHiveJob.Job.Id
+ orderby result.DateCreated ascending
+ select result;
+ foreach (LightweightJob lightweightJob in childResults) {
+ jobCount++;
+ progress.Status = string.Format("Deserializing {0} of {1} jobs ({2} kb)...", jobCount, totalJobCount, allJobDatas[lightweightJob.Id].Data.Count() / 1024);
+ OptimizerJob optimizerJob = null;
+ try {
+ optimizerJob = PersistenceUtil.Deserialize(allJobDatas[lightweightJob.Id].Data);
+ }
+ catch {
+ optimizerJob = null;
+ }
+ progress.ProgressValue = (double)jobCount / totalJobCount;
+ HiveJob childHiveJob = new HiveJob(optimizerJob, false);
+ parentHiveJob.AddChildHiveJob(childHiveJob);
+ childHiveJob.Job = allJobs[lightweightJob.Id];
+ allJobDatas.Remove(lightweightJob.Id); // reduce memory footprint
+ allJobs.Remove(lightweightJob.Id);
+ if (jobCount % 10 == 0) GC.Collect(); // this is needed or otherwise HL takes over the system when the number of jobs is high
+ LoadChildResults(service, childHiveJob, allResults, allJobs, allJobDatas, progress, totalJobCount, ref jobCount);
+ }
+ }
+
+ private OptimizerJob LoadOptimizerJob(Guid jobId) {
+ using (var service = ServiceLocator.Instance.ServicePool.GetService()) {
+ JobData jobData = service.Obj.GetJobData(jobId);
+ try {
+ return PersistenceUtil.Deserialize(jobData.Data);
+ }
+ catch {
+ return null;
+ }
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveExperimentManagerClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveExperimentManagerClient.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveExperimentManagerClient.cs (revision 5050)
@@ -0,0 +1,156 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Services.Hive.Common.ServiceContracts;
+using HeuristicLab.Services.Hive.Common;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Clients.Hive {
+ using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
+ using HeuristicLab.Common;
+ using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+ [Item("Hive Client", "Connects to Hive and lists all submitted experiments by the current user.")]
+ [Creatable("Hive")]
+ public class HiveExperimentManagerClient : Item, IProgressReporter {
+ private static object locker = new object();
+ private bool currentlyUpdating;
+
+ private ItemList hiveExperiments;
+ public ItemList HiveExperiments {
+ get { return hiveExperiments; }
+ set {
+ if (hiveExperiments != value) {
+ DeRegisterHiveExperimentsEvents();
+ hiveExperiments = value;
+ RegisterHiveExperimentsEvent();
+ OnHiveExperimentsChanged();
+ }
+ }
+ }
+
+ private bool isProgressing;
+ public bool IsProgressing {
+ get { return isProgressing; }
+ set {
+ if (isProgressing != value) {
+ isProgressing = value;
+ OnIsProgressingChanged();
+ }
+ }
+ }
+
+ private IProgress progress;
+ public IProgress Progress {
+ get { return progress; }
+ }
+
+ public HiveExperimentManagerClient() { }
+ protected HiveExperimentManagerClient(HiveExperimentManagerClient original, Cloner cloner)
+ : base(original, cloner) {
+ this.hiveExperiments = cloner.Clone(original.hiveExperiments);
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new HiveExperimentManagerClient(this, cloner);
+ }
+
+ private void RegisterHiveExperimentsEvent() {
+ if (hiveExperiments != null) {
+ hiveExperiments.ItemsRemoved += new CollectionItemsChangedEventHandler>(hiveExperiments_ItemsRemoved);
+ }
+ }
+
+ private void DeRegisterHiveExperimentsEvents() {
+ if (hiveExperiments != null) {
+ hiveExperiments.ItemsRemoved -= new CollectionItemsChangedEventHandler>(hiveExperiments_ItemsRemoved);
+ }
+ }
+
+ public void UpdateExperimentList() {
+ this.progress = new Progress("Downloading HiveExperiments...");
+ try {
+ IsProgressing = true;
+ if (this.HiveExperiments == null) {
+ this.HiveExperiments = new ItemList();
+ }
+ using (var service = ServiceLocator.Instance.ServicePool.GetService()) {
+ currentlyUpdating = true;
+ IEnumerable response = service.Obj.GetHiveExperiments();
+ progress.Status = "Populating HiveExperiment list...";
+ RefreshExperimentList(response);
+ currentlyUpdating = false;
+ }
+ }
+ catch (Exception) {
+ this.HiveExperiments = null;
+ throw;
+ }
+ finally {
+ IsProgressing = false;
+ }
+ }
+
+ private void RefreshExperimentList(IEnumerable hiveExperiments) {
+ foreach (DT.HiveExperiment hiveExperimentDto in hiveExperiments) {
+ HiveExperimentClient hiveExperiment = GetHiveExperiment(hiveExperimentDto.Id);
+ if (hiveExperiment == null) {
+ // not yet there, create new
+ this.HiveExperiments.Add(new HiveExperimentClient(hiveExperimentDto));
+ } else {
+ // update
+ hiveExperiment.UpdateFromDto(hiveExperimentDto);
+ }
+ }
+ }
+
+ private HiveExperimentClient GetHiveExperiment(Guid hiveExperimentId) {
+ return this.HiveExperiments.SingleOrDefault(he => he.HiveExperimentId.Equals(hiveExperimentId));
+ }
+
+ public event EventHandler HiveExperimentsChanged;
+ private void OnHiveExperimentsChanged() {
+ var handler = HiveExperimentsChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ void hiveExperiments_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs> e) {
+ if (!currentlyUpdating) {
+ using (Disposable service = ServiceLocator.Instance.ServicePool.GetService()) {
+ foreach (IndexedItem item in e.Items) {
+ if (item.Value.HiveExperimentId != Guid.Empty) {
+ service.Obj.DeleteHiveExperiment(item.Value.HiveExperimentId);
+ }
+ }
+ }
+ }
+ }
+
+ public event EventHandler IsProgressingChanged;
+ private void OnIsProgressingChanged() {
+ var handler = IsProgressingChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveJobClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveJobClient.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/HiveJobClient.cs (revision 5050)
@@ -0,0 +1,595 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Services.Hive.Common.DataTransfer;
+using HeuristicLab.Clients.Hive.Jobs;
+using HeuristicLab.PluginInfrastructure;
+using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.Clients.Hive {
+
+ [Item("Hive Job", "Represents a hive job.")]
+ public class HiveJob : Item {
+ private static object locker = new object();
+
+ public override Image ItemImage {
+ get {
+ if (job.Id == Guid.Empty) { // not yet uploaded
+ return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event;
+ } else {
+ if (job.JobState == JobState.Waiting) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutablePrepared;
+ else if (job.JobState == JobState.WaitingForChildJobs) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutablePrepared;
+ else if (job.JobState == JobState.Calculating) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStarted;
+ else if (job.JobState == JobState.Aborted) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
+ else if (job.JobState == JobState.Failed) return HeuristicLab.Common.Resources.VS2008ImageLibrary.Error;
+ else if (job.JobState == JobState.Finished) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
+ else return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event;
+ }
+ }
+ }
+
+ private Job job;
+ public Job Job {
+ get { return job; }
+ set {
+ if (job != value) {
+ job = value;
+ OnJobChanged();
+ OnToStringChanged();
+ OnItemImageChanged();
+ }
+ }
+ }
+
+ private OptimizerJob optimizerJob;
+ public OptimizerJob OptimizerJob {
+ get { return optimizerJob; }
+ private set {
+ if (optimizerJob != null && syncJobsWithOptimizers) {
+ this.childHiveJobs.Clear();
+ }
+ if (optimizerJob != value) {
+ DergisterOptimizerEvents();
+ optimizerJob = value;
+ if (optimizerJob.ExecutionState == ExecutionState.Stopped) {
+ IsFinishedOptimizerDownloaded = true;
+ }
+ RegisterOptimizerEvents();
+ OnOptimizerJobChanged();
+ }
+ }
+ }
+
+ private ItemList childHiveJobs;
+ public ReadOnlyItemList ChildHiveJobs {
+ get { return childHiveJobs.AsReadOnly(); }
+ }
+
+ private bool isFinishedOptimizerDownloaded;
+ public bool IsFinishedOptimizerDownloaded {
+ get { return isFinishedOptimizerDownloaded; }
+ set {
+ if (isFinishedOptimizerDownloaded != value) {
+ isFinishedOptimizerDownloaded = value;
+ OnIsFinishedOptimizerDownloadedChanged();
+ }
+ }
+ }
+
+ private bool syncJobsWithOptimizers = true;
+
+ public HiveJob() {
+ this.Job = new Job() {
+ JobState = JobState.Waiting,
+ DateCreated = DateTime.Now,
+ CoresNeeded = 1,
+ MemoryNeeded = 0
+ };
+ this.childHiveJobs = new ItemList();
+ syncJobsWithOptimizers = true;
+ }
+
+ public HiveJob(Job jobDto)
+ : this() {
+ this.Job = jobDto;
+ }
+
+ public HiveJob(LightweightJob lightweightJob)
+ : this() {
+ UpdateFromLightweightJob(lightweightJob);
+ }
+
+ public HiveJob(OptimizerJob optimizerJob, bool autoCreateChildHiveJobs)
+ : this() {
+ this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
+ this.OptimizerJob = optimizerJob;
+ this.syncJobsWithOptimizers = true;
+ }
+
+ public HiveJob(IOptimizer optimizer)
+ : this() {
+ this.OptimizerJob = new OptimizerJob(optimizer);
+ }
+
+ public HiveJob(Job job, JobData jobData, bool autoCreateChildHiveJobs)
+ : this() {
+ this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
+ this.Job = job;
+ try {
+ this.OptimizerJob = PersistenceUtil.Deserialize(jobData.Data);
+ }
+ catch {
+ this.OptimizerJob = null;
+ }
+ this.syncJobsWithOptimizers = true;
+ }
+
+ protected HiveJob(HiveJob original, Cloner cloner)
+ : base(original, cloner) {
+ this.Job = cloner.Clone(original.job);
+ this.OptimizerJob = cloner.Clone(original.OptimizerJob);
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new HiveJob(this, cloner);
+ }
+
+ ///
+ /// if this.Optimizer is an experiment
+ /// Uses the child-optimizers of this.HiveJob and creates HiveJob-childs
+ /// if this.Optimizer is a batchrun
+ /// Creates a number of child-jobs according to repetitions
+ ///
+ private void UpdateChildHiveJobs() {
+ if (Job != null && syncJobsWithOptimizers) {
+ if (OptimizerJob.Optimizer is Optimization.Experiment) {
+ Optimization.Experiment experiment = (Optimization.Experiment)OptimizerJob.Optimizer;
+ foreach (IOptimizer childOpt in experiment.Optimizers) {
+ this.childHiveJobs.Add(new HiveJob(childOpt));
+ }
+ } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
+ Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
+ if (batchRun.Algorithm != null) {
+ while (this.childHiveJobs.Count < batchRun.Repetitions) {
+ this.childHiveJobs.Add(new HiveJob(batchRun.Algorithm));
+ }
+ while (this.childHiveJobs.Count > batchRun.Repetitions) {
+ this.childHiveJobs.Remove(this.childHiveJobs.Last());
+ }
+ }
+ }
+ }
+ }
+
+ private void RegisterOptimizerEvents() {
+ if (OptimizerJob != null) {
+ if (OptimizerJob.Optimizer is Optimization.Experiment) {
+ Optimization.Experiment experiment = OptimizerJob.OptimizerAsExperiment;
+ experiment.Optimizers.ItemsAdded += new Collections.CollectionItemsChangedEventHandler>(Optimizers_ItemsAdded);
+ experiment.Optimizers.ItemsReplaced += new Collections.CollectionItemsChangedEventHandler>(Optimizers_ItemsReplaced);
+ experiment.Optimizers.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler>(Optimizers_ItemsRemoved);
+ experiment.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler>(Optimizers_CollectionReset);
+ } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
+ Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
+ batchRun.RepetitionsChanged += new EventHandler(batchRun_RepetitionsChanged);
+ batchRun.AlgorithmChanged += new EventHandler(batchRun_AlgorithmChanged);
+ }
+ OptimizerJob.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
+ OptimizerJob.ToStringChanged += new EventHandler(OptimizerJob_ToStringChanged);
+ }
+ }
+ private void DergisterOptimizerEvents() {
+ if (OptimizerJob != null) {
+ if (OptimizerJob.Optimizer is Optimization.Experiment) {
+ Optimization.Experiment experiment = OptimizerJob.OptimizerAsExperiment;
+ experiment.Optimizers.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler>(Optimizers_ItemsAdded);
+ experiment.Optimizers.ItemsReplaced -= new Collections.CollectionItemsChangedEventHandler>(Optimizers_ItemsReplaced);
+ experiment.Optimizers.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler>(Optimizers_ItemsRemoved);
+ experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler>(Optimizers_CollectionReset);
+ } else if (OptimizerJob.Optimizer is Optimization.BatchRun) {
+ Optimization.BatchRun batchRun = OptimizerJob.OptimizerAsBatchRun;
+ batchRun.RepetitionsChanged -= new EventHandler(batchRun_RepetitionsChanged);
+ batchRun.AlgorithmChanged -= new EventHandler(batchRun_AlgorithmChanged);
+ }
+ OptimizerJob.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
+ OptimizerJob.ToStringChanged -= new EventHandler(OptimizerJob_ToStringChanged);
+ }
+ }
+
+ void batchRun_AlgorithmChanged(object sender, EventArgs e) {
+ if (syncJobsWithOptimizers) {
+ this.childHiveJobs.Clear();
+ UpdateChildHiveJobs();
+ }
+ }
+
+ void batchRun_RepetitionsChanged(object sender, EventArgs e) {
+ if (syncJobsWithOptimizers) {
+ UpdateChildHiveJobs();
+ }
+ }
+
+ void OptimizerJob_ToStringChanged(object sender, EventArgs e) {
+ this.OnToStringChanged();
+ }
+
+ private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs> e) {
+ if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
+ foreach (var item in e.Items) {
+ if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+ this.childHiveJobs.Add(new HiveJob(item.Value));
+ }
+ }
+ }
+ }
+ private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs> e) {
+ if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
+ foreach (var item in e.OldItems) {
+ this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+ }
+ foreach (var item in e.Items) {
+ if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+ this.childHiveJobs.Add(new HiveJob(item.Value));
+ }
+ }
+ }
+ }
+ private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs> e) {
+ if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
+ foreach (var item in e.Items) {
+ this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+ }
+ }
+ }
+ void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs> e) {
+ if (syncJobsWithOptimizers && this.OptimizerJob.ComputeInParallel) {
+ foreach (var item in e.Items) {
+ this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+ }
+ }
+ }
+
+ void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
+ if (OptimizerJob != null && syncJobsWithOptimizers) {
+ if (OptimizerJob.ComputeInParallel) {
+ // child-hive jobs are not yet created, so create them according to the child-optimizers
+ this.UpdateChildHiveJobs();
+ } else {
+ // child-hive jobs need to be deleted
+ this.childHiveJobs.Clear();
+ }
+ }
+ }
+
+ public void AddChildHiveJob(HiveJob hiveJob) {
+ this.childHiveJobs.Add(hiveJob);
+ syncJobsWithOptimizers = false;
+ if (this.OptimizerJob != null && hiveJob.OptimizerJob != null) {
+ if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
+ if (!this.OptimizerJob.OptimizerAsExperiment.Optimizers.Contains(hiveJob.OptimizerJob.Optimizer)) {
+ UpdateOptimizerInExperiment(this.OptimizerJob.OptimizerAsExperiment, hiveJob.OptimizerJob);
+ }
+ } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
+ UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, hiveJob.OptimizerJob);
+ }
+ }
+ syncJobsWithOptimizers = true;
+ }
+
+ ///
+ /// if this.Optimizer is Experiment
+ /// replace the child-optimizer in the experiment
+ /// if this.Optimizer is BatchRun
+ /// add the runs from the optimizerJob to the batchrun and replace the algorithm
+ ///
+ public void UpdateChildOptimizer(OptimizerJob optimizerJob, Guid childJobId) {
+ syncJobsWithOptimizers = false; // don't sync with optimizers during this method
+ bool childIsFinishedOptimizerDownloaded = false;
+
+ if (this.OptimizerJob != null && this.OptimizerJob.Optimizer != null) {
+ if (this.OptimizerJob.Optimizer is Optimization.Experiment) {
+ UpdateOptimizerInExperiment(this.OptimizerJob.OptimizerAsExperiment, optimizerJob);
+ childIsFinishedOptimizerDownloaded = true;
+ } else if (this.OptimizerJob.Optimizer is Optimization.BatchRun) {
+ UpdateOptimizerInBatchRun(this.OptimizerJob.OptimizerAsBatchRun, optimizerJob);
+ if (this.OptimizerJob.OptimizerAsBatchRun.Repetitions == this.OptimizerJob.Optimizer.Runs.Count) {
+ childIsFinishedOptimizerDownloaded = true;
+ }
+ } else {
+ childIsFinishedOptimizerDownloaded = optimizerJob.Optimizer.ExecutionState == ExecutionState.Stopped;
+ }
+ }
+
+ HiveJob child = this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
+ if (!optimizerJob.ComputeInParallel) {
+ child.syncJobsWithOptimizers = false;
+ child.OptimizerJob = optimizerJob;
+ child.syncJobsWithOptimizers = true;
+ }
+ if (childIsFinishedOptimizerDownloaded) {
+ child.IsFinishedOptimizerDownloaded = true;
+ }
+ syncJobsWithOptimizers = true;
+ }
+
+ ///
+ /// Adds the runs from the optimizerJob to the batchrun and replaces the algorithm
+ /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
+ ///
+ private void UpdateOptimizerInBatchRun(BatchRun batchRun, OptimizerJob optimizerJob) {
+ if (batchRun.Algorithm == null) {
+ batchRun.Algorithm = (IAlgorithm)optimizerJob.Optimizer; // only set the first optimizer as algorithm. if every time the Algorithm would be set, the runs would be cleared each time
+ }
+ foreach (IRun run in optimizerJob.Optimizer.Runs) {
+ if (!batchRun.Runs.Contains(run))
+ batchRun.Runs.Add(run);
+ }
+ }
+
+ ///
+ /// replace the child-optimizer in the experiment
+ /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
+ ///
+ private void UpdateOptimizerInExperiment(Optimization.Experiment experiment, OptimizerJob optimizerJob) {
+ if (optimizerJob.IndexInParentOptimizerList < 0)
+ throw new IndexOutOfRangeException("IndexInParentOptimizerList must be equal or greater than zero! The Job is invalid and the optimizer-tree cannot be reassembled.");
+
+ while (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList) {
+ experiment.Optimizers.Add(new UserDefinedAlgorithm("Placeholder")); // add dummy-entries to Optimizers so that its possible to insert the optimizerJob at the correct position
+ }
+ if (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList + 1) {
+ experiment.Optimizers.Add(optimizerJob.Optimizer);
+ } else {
+ // if ComputeInParallel==true, don't replace the optimizer (except it is still a Placeholder)
+ // this is because Jobs with ComputeInParallel get submitted to hive with their child-optimizers deleted
+ if (!optimizerJob.ComputeInParallel || experiment.Optimizers[optimizerJob.IndexInParentOptimizerList].Name == "Placeholder") {
+ experiment.Optimizers[optimizerJob.IndexInParentOptimizerList] = optimizerJob.Optimizer;
+ }
+ }
+ }
+
+ ///
+ /// Sets the IndexInParentOptimizerList property of the OptimizerJob
+ /// according to the position in the OptimizerList of the parentHiveJob.Job
+ /// Recursively updates all the child-jobs as well
+ ///
+ internal void SetIndexInParentOptimizerList(HiveJob parentHiveJob) {
+ if (parentHiveJob != null) {
+ if (parentHiveJob.OptimizerJob.Optimizer is Optimization.Experiment) {
+ this.OptimizerJob.IndexInParentOptimizerList = parentHiveJob.OptimizerJob.OptimizerAsExperiment.Optimizers.IndexOf(this.OptimizerJob.Optimizer);
+ } else if (parentHiveJob.OptimizerJob.Optimizer is Optimization.BatchRun) {
+ this.OptimizerJob.IndexInParentOptimizerList = 0;
+ } else {
+ throw new NotSupportedException("Only Experiment and BatchRuns are supported");
+ }
+ }
+ foreach (HiveJob child in childHiveJobs) {
+ child.SetIndexInParentOptimizerList(this);
+ }
+ }
+
+ public override string ToString() {
+ if (optimizerJob != null) {
+ return optimizerJob.ToString();
+ } else {
+ return base.ToString();
+ }
+ }
+
+ public void UpdateFromLightweightJob(LightweightJob lightweightJob) {
+ if (lightweightJob != null) {
+ job.Id = lightweightJob.Id;
+ job.DateCreated = lightweightJob.DateCreated;
+ job.DateCalculated = lightweightJob.DateCalculated;
+ job.DateFinished = lightweightJob.DateFinished;
+ job.Exception = lightweightJob.Exception;
+ job.Id = lightweightJob.Id;
+ job.ExecutionTime = lightweightJob.ExecutionTime;
+ job.JobState = lightweightJob.JobState;
+ // what about parentJob
+ OnJobStateChanged();
+ OnToStringChanged();
+ OnItemImageChanged();
+ }
+ }
+
+ ///
+ /// Creates a JobData object containing the Job and the IJob-Object as byte[]
+ ///
+ ///
+ /// if true the Child-Optimizers will not be serialized (if the job contains an Experiment)
+ ///
+ public JobData GetAsJobData(bool withoutChildOptimizers) {
+ if (this.optimizerJob == null || this.optimizerJob.Optimizer == null)
+ return null;
+
+ byte[] jobByteArray;
+ if (withoutChildOptimizers && this.OptimizerJob.Optimizer is Optimization.Experiment) {
+ OptimizerJob clonedJob = (OptimizerJob)this.OptimizerJob.Clone(); // use a cloned job, so that the childHiveJob don't get confused
+ clonedJob.OptimizerAsExperiment.Optimizers.Clear();
+ jobByteArray = PersistenceUtil.Serialize(clonedJob);
+ } else if (withoutChildOptimizers && this.OptimizerJob.Optimizer is Optimization.BatchRun) {
+ OptimizerJob clonedJob = (OptimizerJob)this.OptimizerJob.Clone();
+ clonedJob.OptimizerAsBatchRun.Algorithm = null;
+ jobByteArray = PersistenceUtil.Serialize(clonedJob);
+ } else if (this.OptimizerJob.Optimizer is IAlgorithm) {
+ ((IAlgorithm)this.OptimizerJob.Optimizer).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
+ jobByteArray = PersistenceUtil.Serialize(this.OptimizerJob);
+ } else {
+ jobByteArray = PersistenceUtil.Serialize(this.OptimizerJob);
+ }
+
+ UpdateRequiredPlugins();
+
+ JobData jobData = new JobData() {
+ JobId = job.Id,
+ Data = jobByteArray
+ };
+
+ return jobData;
+ }
+
+ ///
+ /// find out which which plugins are needed for the given object
+ ///
+ private void UpdateRequiredPlugins() {
+ List pluginList = new List();
+
+ IEnumerable neededPlugins = ApplicationManager.Manager.Plugins; //HivePluginInfoDto.FindPluginsNeeded(optimizerJob.GetType());
+ using (var service = ServiceLocator.Instance.ServicePool.GetService()) {
+ IEnumerable availablePlugins = service.Obj.GetAvailablePlugins();
+ foreach (IPluginDescription neededPlugin in neededPlugins) {
+ Plugin found = availablePlugins.Where(availablePlugin => availablePlugin.Name == neededPlugin.Name && availablePlugin.Version.Major == neededPlugin.Version.Major && availablePlugin.Version.Minor == neededPlugin.Version.Minor && availablePlugin.Version.Revision == neededPlugin.Version.Revision && availablePlugin.Version.MinorRevision == neededPlugin.Version.MinorRevision).SingleOrDefault();
+ if (found != null) {
+ pluginList.Add(found.Id);
+ } else {
+ Plugin p = new Plugin() { Name = neededPlugin.Name, Version = neededPlugin.Version };
+ List pluginDatas = new List();
+
+ foreach (IPluginFile pf in neededPlugin.Files) {
+ PluginData pluginData = new PluginData();
+
+ pluginData.Data = File.ReadAllBytes(pf.Name);
+ pluginDatas.Add(pluginData);
+ }
+ pluginList.Add(service.Obj.AddPlugin(p, pluginDatas));
+ }
+ }
+ }
+ this.Job.PluginsNeededIds = pluginList;
+ }
+
+ #region Events
+ public event EventHandler JobChanged;
+ private void OnJobChanged() {
+ LogMessage("JobChanged");
+ EventHandler handler = JobChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler JobStateChanged;
+ private void OnJobStateChanged() {
+ LogMessage("JobStateChanged (State: " + this.Job.JobState + ", ExecutionTime: " + this.Job.ExecutionTime.ToString() + ")");
+ EventHandler handler = JobStateChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler OptimizerJobChanged;
+ private void OnOptimizerJobChanged() {
+ OptimizerJob_ComputeInParallelChanged(this, EventArgs.Empty);
+ var handler = JobChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler IsFinishedOptimizerDownloadedChanged;
+ private void OnIsFinishedOptimizerDownloadedChanged() {
+ var handler = IsFinishedOptimizerDownloadedChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ #endregion
+
+ public void LogMessage(string message) {
+ lock (locker) {
+ if (optimizerJob != null) {
+ optimizerJob.Log.LogMessage(message);
+ }
+ }
+ }
+
+ ///
+ /// Returns a list of HiveJobs including this and all its child-jobs recursively
+ ///
+ public IEnumerable GetAllHiveJobs() {
+ List jobs = new List();
+ jobs.Add(this);
+ foreach (HiveJob child in this.ChildHiveJobs) {
+ jobs.AddRange(child.GetAllHiveJobs());
+ }
+ return jobs;
+ }
+
+ public HiveJob GetParentByJobId(Guid jobId) {
+ if (this.ChildHiveJobs.SingleOrDefault(j => j.job.Id == jobId) != null)
+ return this;
+ foreach (HiveJob child in this.childHiveJobs) {
+ HiveJob result = child.GetParentByJobId(jobId);
+ if (result != null)
+ return result;
+ }
+ return null;
+ }
+
+
+ public HiveJob GetChildByOptimizerJob(OptimizerJob optimizerJob) {
+ foreach (var child in ChildHiveJobs) {
+ if (child.OptimizerJob == optimizerJob)
+ return child;
+ }
+ return null;
+ }
+
+
+ public HiveJob GetChildByOptimizer(IOptimizer optimizer) {
+ foreach (var child in ChildHiveJobs) {
+ if (child.OptimizerJob.Optimizer == optimizer)
+ return child;
+ }
+ return null;
+ }
+
+ ///
+ /// Searches for an HiveJob object with the correct jobId recursively
+ ///
+ public HiveJob GetHiveJobByJobId(Guid jobId) {
+ if (this.Job.Id == jobId) {
+ return this;
+ } else {
+ foreach (HiveJob child in this.ChildHiveJobs) {
+ HiveJob result = child.GetHiveJobByJobId(jobId);
+ if (result != null)
+ return result;
+ }
+ }
+ return null;
+ }
+
+
+ public void RemoveByJobId(Guid jobId) {
+ IEnumerable jobs = ChildHiveJobs.Where(j => j.Job.Id == jobId).ToList(); // if Guid.Empty needs to be removed, there could be more than one with this jobId
+ foreach (HiveJob j in jobs) {
+ this.childHiveJobs.Remove(j);
+ }
+ foreach (HiveJob child in ChildHiveJobs) {
+ child.RemoveByJobId(jobId);
+ }
+ }
+
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/JobResultPoller.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/JobResultPoller.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/JobResultPoller.cs (revision 5050)
@@ -0,0 +1,131 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Services.Hive.Common;
+using HeuristicLab.Services.Hive.Common.ServiceContracts;
+using HeuristicLab.Services.Hive.Common.DataTransfer;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Clients.Hive {
+ internal class JobResultPoller {
+ private bool stopRequested { get; set; }
+ private AutoResetEvent waitHandle;
+ private Thread thread;
+
+ private HiveJob hiveJob;
+ public HiveJob HiveJob {
+ get { return hiveJob; }
+ set { hiveJob = value; }
+ }
+
+ private TimeSpan interval;
+ public TimeSpan Interval {
+ get { return interval; }
+ set { interval = value; }
+ }
+
+ private bool isPolling;
+ public bool IsPolling {
+ get { return isPolling; }
+ set {
+ if (isPolling != value) {
+ isPolling = value;
+ OnIsPollingChanged();
+ }
+ }
+ }
+
+ public JobResultPoller(HiveJob hiveJob, TimeSpan interval) {
+ this.isPolling = false;
+ this.hiveJob = hiveJob;
+ this.interval = interval;
+ }
+
+ public void Start() {
+ stopRequested = false;
+ thread = new Thread(RunPolling);
+ thread.Start();
+ IsPolling = true;
+ }
+
+ public void Stop() {
+ // use AutoResetEvent.Set instead if Thread.Interrupt because its much cleaner
+ stopRequested = true;
+ waitHandle.Set();
+ IsPolling = false;
+ thread = null;
+ }
+
+ public void RunPolling() {
+ try {
+ waitHandle = new AutoResetEvent(false);
+ while (!stopRequested) {
+ OnPollingStarted();
+ FetchJobResults();
+ OnPollingFinished();
+ waitHandle.WaitOne(Interval);
+ }
+ waitHandle.Close();
+ }
+ catch (Exception e) {
+ OnExceptionOccured(e);
+ }
+ }
+
+ private void FetchJobResults() {
+ using (Disposable service = ServiceLocator.Instance.ServicePool.GetService()) {
+ IEnumerable response = service.Obj.GetLightweightChildJobs(hiveJob.Job.Id, true, true);
+ OnJobResultsReceived(response);
+ }
+ }
+
+ public event EventHandler>> JobResultsReceived;
+ private void OnJobResultsReceived(IEnumerable lightweightJobs) {
+ var handler = JobResultsReceived;
+ if (handler != null) handler(this, new EventArgs>(lightweightJobs));
+ }
+
+ public event EventHandler> ExceptionOccured;
+ private void OnExceptionOccured(Exception e) {
+ var handler = ExceptionOccured;
+ if (handler != null) handler(this, new EventArgs(e));
+ }
+
+ public event EventHandler IsPollingChanged;
+ private void OnIsPollingChanged() {
+ var handler = IsPollingChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ public event EventHandler PollingStarted;
+ private void OnPollingStarted() {
+ var handler = PollingStarted;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ public event EventHandler PollingFinished;
+ private void OnPollingFinished() {
+ var handler = PollingFinished;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/PluginClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/PluginClient.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveExperiment/PluginClient.cs (revision 5050)
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Services.Hive.Common.DataTransfer;
+
+namespace HeuristicLab.Clients.Hive.HiveExperiment {
+ internal class PluginClient {
+
+ private List availablePlugins;
+ public IEnumerable AvailablePlugins {
+ get {
+ return availablePlugins;
+ }
+ }
+
+ public void Load() {
+ using (var service = ServiceLocator.Instance.ServicePool.GetService()) {
+
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs (revision 5050)
@@ -0,0 +1,338 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive;
+
+namespace HeuristicLab.Clients.Hive.Jobs {
+ [Item("Optimizer Job", "Represents Job which executes a IOptimizer object.")]
+ [StorableClass]
+ public class OptimizerJob : DeepCloneable, IJob {
+ [Storable]
+ protected IOptimizer optimizer;
+ public IOptimizer Optimizer {
+ get { return optimizer; }
+ set {
+ if (value != optimizer) {
+ if (optimizer != null) DeregisterEvents();
+ optimizer = value;
+ if (optimizer != null) RegisterEvents();
+ OnOptimizerChanged();
+ }
+ }
+ }
+
+ [Storable]
+ protected ILog log;
+ public ILog Log {
+ get { return log; }
+ }
+
+ [Storable]
+ protected bool computeInParallel;
+ public bool ComputeInParallel {
+ get { return computeInParallel; }
+ set {
+ if (computeInParallel != value) {
+ computeInParallel = value;
+ OnComputeInParallelChanged();
+ }
+ }
+ }
+
+ [Storable]
+ private int indexInParentOptimizerList = -1;
+ public int IndexInParentOptimizerList {
+ get { return indexInParentOptimizerList; }
+ set { this.indexInParentOptimizerList = value; }
+ }
+
+ [Storable]
+ private bool collectChildJobs;
+ public bool CollectChildJobs {
+ get { return collectChildJobs; }
+ set { collectChildJobs = value; }
+ }
+
+ public OptimizerJob() {
+ this.log = new Log();
+ }
+ public OptimizerJob(IOptimizer optimizer)
+ : this() {
+ this.Optimizer = optimizer;
+
+ if (optimizer is Optimization.Experiment) {
+ this.ComputeInParallel = true;
+ } else if (optimizer is Optimization.BatchRun) {
+ this.ComputeInParallel = false;
+ } else {
+ this.ComputeInParallel = false;
+ }
+ }
+ [StorableConstructor]
+ protected OptimizerJob(bool deserializing) { }
+ protected OptimizerJob(OptimizerJob original, Cloner cloner)
+ : base(original, cloner) {
+ this.Optimizer = cloner.Clone(original.Optimizer);
+ this.log = cloner.Clone(original.Log);
+ this.ComputeInParallel = original.ComputeInParallel;
+ this.IndexInParentOptimizerList = original.IndexInParentOptimizerList;
+ this.CollectChildJobs = original.CollectChildJobs;
+ this.RegisterEvents();
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new OptimizerJob(this, cloner);
+ }
+
+ [StorableHook(HookType.AfterDeserialization)]
+ protected virtual void AfterDeserialization() {
+ RegisterEvents();
+ }
+
+ ///
+ /// Casts the Optimizer to an Experiment. Returns null if cast was not successfull.
+ ///
+ public Optimization.Experiment OptimizerAsExperiment {
+ get { return Optimizer as Optimization.Experiment; }
+ }
+
+ ///
+ /// Casts the Optimizer to an BatchRun. Returns null if cast was not successfull.
+ ///
+ public Optimization.BatchRun OptimizerAsBatchRun {
+ get { return Optimizer as Optimization.BatchRun; }
+ }
+
+ #region IJob Members
+
+ public virtual ExecutionState ExecutionState {
+ get { return optimizer.ExecutionState; }
+ }
+
+ public TimeSpan ExecutionTime {
+ get { return optimizer.ExecutionTime; }
+ }
+
+ public virtual void Run() {
+ throw new NotSupportedException();
+ }
+
+ public virtual void Prepare() {
+ optimizer.Prepare();
+ }
+
+ public virtual void Start() {
+ if ((optimizer is Optimization.Experiment && OptimizerAsExperiment.Optimizers.Count == 0) || // experiment would not fire OnStopped if it has 0 optimizers
+ (optimizer is Optimization.BatchRun && OptimizerAsBatchRun.Algorithm == null)) { // batchrun would not fire OnStopped if algorithm == null
+ OnJobStopped();
+ } else {
+ optimizer.Start();
+ }
+ }
+
+ public virtual void Stop() {
+ optimizer.Stop();
+ }
+
+ public virtual void Resume(IEnumerable childJobs) {
+ OnJobStopped();
+ }
+
+ public event EventHandler JobStopped;
+ protected virtual void OnJobStopped() {
+ EventHandler handler = JobStopped;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler JobFailed;
+ protected virtual void OnJobFailed(EventArgs e) {
+ EventHandler handler = JobFailed;
+ if (handler != null) handler(this, e);
+ }
+
+ public event EventHandler> NewChildJob;
+ protected virtual void OnNewChildJob(IJob job) {
+ EventHandler> handler = NewChildJob;
+ if (handler != null) handler(this, new EventArgs(job));
+ }
+
+ public event EventHandler WaitForChildJobs;
+ protected virtual void OnWaitForChildJobs() {
+ EventHandler handler = WaitForChildJobs;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler DeleteChildJobs;
+ protected virtual void OnDeleteChildJobs() {
+ EventHandler handler = DeleteChildJobs;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler ComputeInParallelChanged;
+ protected virtual void OnComputeInParallelChanged() {
+ EventHandler handler = ComputeInParallelChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler OptimizerChanged;
+ protected virtual void OnOptimizerChanged() {
+ EventHandler handler = OptimizerChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ #endregion
+
+ #region Optimizer Events
+ protected virtual void RegisterEvents() {
+ optimizer.Stopped += new EventHandler(optimizer_Stopped);
+ optimizer.ExceptionOccurred += new EventHandler>(optimizer_ExceptionOccurred);
+ optimizer.DescriptionChanged += new EventHandler(optimizer_DescriptionChanged);
+ optimizer.ItemImageChanged += new EventHandler(optimizer_ItemImageChanged);
+ optimizer.NameChanged += new EventHandler(optimizer_NameChanged);
+ optimizer.NameChanging += new EventHandler>(optimizer_NameChanging);
+ optimizer.ToStringChanged += new EventHandler(optimizer_ToStringChanged);
+ }
+ protected virtual void DeregisterEvents() {
+ optimizer.Stopped -= new EventHandler(optimizer_Stopped);
+ optimizer.ExceptionOccurred -= new EventHandler>(optimizer_ExceptionOccurred);
+ optimizer.DescriptionChanged -= this.DescriptionChanged;
+ optimizer.ItemImageChanged -= this.ItemImageChanged;
+ optimizer.NameChanged -= this.NameChanged;
+ optimizer.NameChanging -= this.NameChanging;
+ optimizer.ToStringChanged -= this.ToStringChanged;
+ }
+
+ void optimizer_ToStringChanged(object sender, EventArgs e) {
+ this.OnToStringChanged();
+ }
+
+ void optimizer_NameChanging(object sender, CancelEventArgs e) {
+ this.OnNameChanging(e.Value, e.Cancel);
+ }
+
+ void optimizer_NameChanged(object sender, EventArgs e) {
+ this.OnNameChanged();
+ }
+
+ void optimizer_ItemImageChanged(object sender, EventArgs e) {
+ this.OnItemImageChanged();
+ }
+
+ void optimizer_DescriptionChanged(object sender, EventArgs e) {
+ this.OnDescriptionChanged();
+ }
+
+ protected virtual void optimizer_ExceptionOccurred(object sender, EventArgs e) {
+ OnJobFailed(e);
+ }
+
+ protected virtual void optimizer_Stopped(object sender, EventArgs e) {
+ OnJobStopped();
+ }
+ #endregion
+
+ #region INamedItem Members
+
+ public bool CanChangeDescription {
+ get { return optimizer.CanChangeDescription; }
+ }
+
+ public bool CanChangeName {
+ get { return optimizer.CanChangeName; }
+ }
+
+ public string Description {
+ get { return optimizer.Description; }
+ set { optimizer.Description = value; }
+ }
+
+ public string Name {
+ get { return optimizer.Name; }
+ set { optimizer.Name = value; }
+ }
+ #endregion
+
+ #region Events
+ public event EventHandler DescriptionChanged;
+ protected virtual void OnDescriptionChanged() {
+ var handler = DescriptionChanged;
+ if(handler != null) handler(this, EventArgs.Empty);
+ }
+ public event EventHandler ItemImageChanged;
+ protected virtual void OnItemImageChanged() {
+ var handler = ItemImageChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ public event EventHandler ToStringChanged;
+ protected virtual void OnToStringChanged() {
+ var handler = ToStringChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ public event EventHandler NameChanged;
+ protected virtual void OnNameChanged() {
+ var handler = NameChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ public event EventHandler> NameChanging;
+ protected virtual void OnNameChanging(string value, bool cancel) {
+ var handler = NameChanging;
+ if (handler != null) handler(this, new CancelEventArgs(value, cancel));
+ }
+ #endregion
+
+ #region IItem Members
+
+ public string ItemDescription {
+ get { return optimizer.ItemDescription; }
+ }
+
+ public System.Drawing.Image ItemImage {
+ get { return optimizer.ItemImage; }
+ }
+
+ public string ItemName {
+ get { return optimizer.ItemName; }
+ }
+
+ public Version ItemVersion {
+ get { return optimizer.ItemVersion; }
+ }
+
+ #endregion
+
+ ///
+ /// Gets the string representation of the current instance in the format: Name: [null|Value].
+ ///
+ /// The current instance as a string.
+ public override string ToString() {
+ return Name;
+ }
+
+ public virtual bool IsParallelizable {
+ get { return this.Optimizer is Optimization.Experiment || this.Optimizer is BatchRun; }
+ }
+
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs (revision 5050)
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using HeuristicLab.Persistence.Default.Xml;
+
+namespace HeuristicLab.Clients.Hive {
+ public static class PersistenceUtil {
+ public static byte[] Serialize(object obj) {
+ MemoryStream memStream = new MemoryStream();
+ XmlGenerator.Serialize(obj, memStream);
+ byte[] jobByteArray = memStream.ToArray();
+ memStream.Dispose();
+ return jobByteArray;
+ }
+
+ public static T Deserialize(byte[] sjob) {
+ MemoryStream memStream = new MemoryStream(sjob);
+ T job = XmlParser.Deserialize(memStream);
+ memStream.Dispose();
+ return job;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/IProgress.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/IProgress.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/IProgress.cs (revision 5050)
@@ -0,0 +1,35 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ public interface IProgress {
+ string Status { get; set; }
+ double ProgressValue { get; set; }
+
+ void Finish();
+
+ event EventHandler Finished;
+ event EventHandler StatusChanged;
+ event EventHandler ProgressValueChanged;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/IProgressReporter.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/IProgressReporter.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/IProgressReporter.cs (revision 5050)
@@ -0,0 +1,31 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ public interface IProgressReporter {
+ IProgress Progress { get; }
+ bool IsProgressing { get; }
+
+ event EventHandler IsProgressingChanged;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/Progress.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/Progress.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Progress/Progress.cs (revision 5050)
@@ -0,0 +1,82 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Clients.Hive {
+ public class Progress : IProgress {
+ private string status;
+ public string Status {
+ get {
+ return this.status;
+ }
+ set {
+ if (this.status != value) {
+ this.status = value;
+ OnStatusChanged();
+ }
+ }
+ }
+
+ private double progressValue;
+ public double ProgressValue {
+ get {
+ return this.progressValue;
+ }
+ set {
+ if (this.progressValue != value) {
+ this.progressValue = value;
+ OnProgressChanged();
+ }
+ }
+ }
+
+ public Progress() { }
+
+ public Progress(string status) {
+ this.Status = status;
+ }
+
+ public void Finish() {
+ OnFinished();
+ }
+
+ #region Event Handler
+ public event EventHandler Finished;
+ private void OnFinished() {
+ var handler = Finished;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler StatusChanged;
+ private void OnStatusChanged() {
+ var handler = StatusChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+
+ public event EventHandler ProgressValueChanged;
+ private void OnProgressChanged() {
+ var handler = ProgressValueChanged;
+ if (handler != null) handler(this, EventArgs.Empty);
+ }
+ #endregion
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Clients.Hive")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3edfc8a5-8924-470c-bc1d-53e067c5c4f4")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/Settings.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/Settings.Designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/Settings.Designer.cs (revision 5050)
@@ -0,0 +1,50 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Clients.Hive.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string HiveUsername {
+ get {
+ return ((string)(this["HiveUsername"]));
+ }
+ set {
+ this["HiveUsername"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string HivePassword {
+ get {
+ return ((string)(this["HivePassword"]));
+ }
+ set {
+ this["HivePassword"] = value;
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/Settings.settings
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/Settings.settings (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Properties/Settings.settings (revision 5050)
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/GenerateServiceClients.cmd
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/GenerateServiceClients.cmd (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/GenerateServiceClients.cmd (revision 5050)
@@ -0,0 +1,28 @@
+echo off
+
+echo.
+echo *******************************************************************************************
+echo Generating HiveService client
+echo.
+
+svcutil.exe ^
+ http://localhost:9000/HiveService/mex ^
+ /out:HiveServiceClient ^
+ /namespace:*,HeuristicLab.Clients.Hive ^
+ /targetClientVersion:Version35 ^
+ /enableDataBinding ^
+ /config:..\app.config
+
+echo.
+echo ---------------------------------------------------------------------------------------
+echo !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!!
+echo.
+echo Following modifications have to be done manually in generated data contracts:
+echo * Remove method "protected void RaisePropertyChanged(string propertyName)" in OKBItem
+echo.
+echo !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!! ATTENTION !!!
+echo ---------------------------------------------------------------------------------------
+echo.
+echo Generation of OKBService client finished.
+echo *******************************************************************************************
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveServiceClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveServiceClient.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveServiceClient.cs (revision 5050)
@@ -0,0 +1,1621 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Clients.Hive
+{
+ using System.Runtime.Serialization;
+
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="HiveItem", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.JobData))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.NamedHiveItem))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.HiveExperiment))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Project))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.HivePlugin))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.HivePluginData))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Resource))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.SlaveGroup))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Slave))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Appointment))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.LightweightJob))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Job))]
+ public partial class HiveItem : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private System.Guid IdField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid Id
+ {
+ get
+ {
+ return this.IdField;
+ }
+ set
+ {
+ if ((this.IdField.Equals(value) != true))
+ {
+ this.IdField = value;
+ this.RaisePropertyChanged("Id");
+ }
+ }
+ }
+
+ public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+ protected void RaisePropertyChanged(string propertyName)
+ {
+ System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+ if ((propertyChanged != null))
+ {
+ propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="JobData", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class JobData : HeuristicLab.Clients.Hive.HiveItem
+ {
+
+ private byte[] DataField;
+
+ private System.Guid JobIdField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public byte[] Data
+ {
+ get
+ {
+ return this.DataField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.DataField, value) != true))
+ {
+ this.DataField = value;
+ this.RaisePropertyChanged("Data");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid JobId
+ {
+ get
+ {
+ return this.JobIdField;
+ }
+ set
+ {
+ if ((this.JobIdField.Equals(value) != true))
+ {
+ this.JobIdField = value;
+ this.RaisePropertyChanged("JobId");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="NamedHiveItem", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.HiveExperiment))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Project))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.HivePlugin))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.HivePluginData))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Resource))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.SlaveGroup))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Slave))]
+ public partial class NamedHiveItem : HeuristicLab.Clients.Hive.HiveItem
+ {
+
+ private string DescriptionField;
+
+ private string NameField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public string Description
+ {
+ get
+ {
+ return this.DescriptionField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.DescriptionField, value) != true))
+ {
+ this.DescriptionField = value;
+ this.RaisePropertyChanged("Description");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public string Name
+ {
+ get
+ {
+ return this.NameField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.NameField, value) != true))
+ {
+ this.NameField = value;
+ this.RaisePropertyChanged("Name");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="HiveExperiment", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class HiveExperiment : HeuristicLab.Clients.Hive.NamedHiveItem
+ {
+
+ private string ResourceIdsField;
+
+ private System.Nullable RootJobIdField;
+
+ private System.Guid UserIdField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public string ResourceIds
+ {
+ get
+ {
+ return this.ResourceIdsField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.ResourceIdsField, value) != true))
+ {
+ this.ResourceIdsField = value;
+ this.RaisePropertyChanged("ResourceIds");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable RootJobId
+ {
+ get
+ {
+ return this.RootJobIdField;
+ }
+ set
+ {
+ if ((this.RootJobIdField.Equals(value) != true))
+ {
+ this.RootJobIdField = value;
+ this.RaisePropertyChanged("RootJobId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid UserId
+ {
+ get
+ {
+ return this.UserIdField;
+ }
+ set
+ {
+ if ((this.UserIdField.Equals(value) != true))
+ {
+ this.UserIdField = value;
+ this.RaisePropertyChanged("UserId");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Project", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class Project : HeuristicLab.Clients.Hive.NamedHiveItem
+ {
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="HivePlugin", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class HivePlugin : HeuristicLab.Clients.Hive.NamedHiveItem
+ {
+
+ private bool UpdateField;
+
+ private System.Version VersionField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public bool Update
+ {
+ get
+ {
+ return this.UpdateField;
+ }
+ set
+ {
+ if ((this.UpdateField.Equals(value) != true))
+ {
+ this.UpdateField = value;
+ this.RaisePropertyChanged("Update");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Version Version
+ {
+ get
+ {
+ return this.VersionField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.VersionField, value) != true))
+ {
+ this.VersionField = value;
+ this.RaisePropertyChanged("Version");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="HivePluginData", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class HivePluginData : HeuristicLab.Clients.Hive.NamedHiveItem
+ {
+
+ private byte[] DataField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public byte[] Data
+ {
+ get
+ {
+ return this.DataField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.DataField, value) != true))
+ {
+ this.DataField = value;
+ this.RaisePropertyChanged("Data");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Resource", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.SlaveGroup))]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Slave))]
+ public partial class Resource : HeuristicLab.Clients.Hive.NamedHiveItem
+ {
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="SlaveGroup", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class SlaveGroup : HeuristicLab.Clients.Hive.Resource
+ {
+
+ private System.Guid[] ResourcesIdsField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid[] ResourcesIds
+ {
+ get
+ {
+ return this.ResourcesIdsField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.ResourcesIdsField, value) != true))
+ {
+ this.ResourcesIdsField = value;
+ this.RaisePropertyChanged("ResourcesIds");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Slave", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class Slave : HeuristicLab.Clients.Hive.Resource
+ {
+
+ private HeuristicLab.Clients.Hive.CalendarState CalendarSyncStatusField;
+
+ private System.Nullable CoresField;
+
+ private System.Nullable CpuSpeedPerCoreField;
+
+ private System.Nullable FreeCoresField;
+
+ private System.Nullable FreeMemoryField;
+
+ private bool IsAllowedToCalculateField;
+
+ private System.Nullable MemoryField;
+
+ private System.Guid SlaveConfigIdField;
+
+ private HeuristicLab.Clients.Hive.SlaveState StateField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public HeuristicLab.Clients.Hive.CalendarState CalendarSyncStatus
+ {
+ get
+ {
+ return this.CalendarSyncStatusField;
+ }
+ set
+ {
+ if ((this.CalendarSyncStatusField.Equals(value) != true))
+ {
+ this.CalendarSyncStatusField = value;
+ this.RaisePropertyChanged("CalendarSyncStatus");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable Cores
+ {
+ get
+ {
+ return this.CoresField;
+ }
+ set
+ {
+ if ((this.CoresField.Equals(value) != true))
+ {
+ this.CoresField = value;
+ this.RaisePropertyChanged("Cores");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable CpuSpeedPerCore
+ {
+ get
+ {
+ return this.CpuSpeedPerCoreField;
+ }
+ set
+ {
+ if ((this.CpuSpeedPerCoreField.Equals(value) != true))
+ {
+ this.CpuSpeedPerCoreField = value;
+ this.RaisePropertyChanged("CpuSpeedPerCore");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable FreeCores
+ {
+ get
+ {
+ return this.FreeCoresField;
+ }
+ set
+ {
+ if ((this.FreeCoresField.Equals(value) != true))
+ {
+ this.FreeCoresField = value;
+ this.RaisePropertyChanged("FreeCores");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable FreeMemory
+ {
+ get
+ {
+ return this.FreeMemoryField;
+ }
+ set
+ {
+ if ((this.FreeMemoryField.Equals(value) != true))
+ {
+ this.FreeMemoryField = value;
+ this.RaisePropertyChanged("FreeMemory");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public bool IsAllowedToCalculate
+ {
+ get
+ {
+ return this.IsAllowedToCalculateField;
+ }
+ set
+ {
+ if ((this.IsAllowedToCalculateField.Equals(value) != true))
+ {
+ this.IsAllowedToCalculateField = value;
+ this.RaisePropertyChanged("IsAllowedToCalculate");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable Memory
+ {
+ get
+ {
+ return this.MemoryField;
+ }
+ set
+ {
+ if ((this.MemoryField.Equals(value) != true))
+ {
+ this.MemoryField = value;
+ this.RaisePropertyChanged("Memory");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid SlaveConfigId
+ {
+ get
+ {
+ return this.SlaveConfigIdField;
+ }
+ set
+ {
+ if ((this.SlaveConfigIdField.Equals(value) != true))
+ {
+ this.SlaveConfigIdField = value;
+ this.RaisePropertyChanged("SlaveConfigId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public HeuristicLab.Clients.Hive.SlaveState State
+ {
+ get
+ {
+ return this.StateField;
+ }
+ set
+ {
+ if ((this.StateField.Equals(value) != true))
+ {
+ this.StateField = value;
+ this.RaisePropertyChanged("State");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Appointment", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class Appointment : HeuristicLab.Clients.Hive.HiveItem
+ {
+
+ private bool AllDayEventField;
+
+ private System.DateTime EndDateField;
+
+ private bool RecurringField;
+
+ private System.Guid RecurringIdField;
+
+ private System.Guid ResourceIdField;
+
+ private System.DateTime StartDateField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public bool AllDayEvent
+ {
+ get
+ {
+ return this.AllDayEventField;
+ }
+ set
+ {
+ if ((this.AllDayEventField.Equals(value) != true))
+ {
+ this.AllDayEventField = value;
+ this.RaisePropertyChanged("AllDayEvent");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.DateTime EndDate
+ {
+ get
+ {
+ return this.EndDateField;
+ }
+ set
+ {
+ if ((this.EndDateField.Equals(value) != true))
+ {
+ this.EndDateField = value;
+ this.RaisePropertyChanged("EndDate");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public bool Recurring
+ {
+ get
+ {
+ return this.RecurringField;
+ }
+ set
+ {
+ if ((this.RecurringField.Equals(value) != true))
+ {
+ this.RecurringField = value;
+ this.RaisePropertyChanged("Recurring");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid RecurringId
+ {
+ get
+ {
+ return this.RecurringIdField;
+ }
+ set
+ {
+ if ((this.RecurringIdField.Equals(value) != true))
+ {
+ this.RecurringIdField = value;
+ this.RaisePropertyChanged("RecurringId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid ResourceId
+ {
+ get
+ {
+ return this.ResourceIdField;
+ }
+ set
+ {
+ if ((this.ResourceIdField.Equals(value) != true))
+ {
+ this.ResourceIdField = value;
+ this.RaisePropertyChanged("ResourceId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.DateTime StartDate
+ {
+ get
+ {
+ return this.StartDateField;
+ }
+ set
+ {
+ if ((this.StartDateField.Equals(value) != true))
+ {
+ this.StartDateField = value;
+ this.RaisePropertyChanged("StartDate");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="LightweightJob", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ [System.Runtime.Serialization.KnownTypeAttribute(typeof(HeuristicLab.Clients.Hive.Job))]
+ public partial class LightweightJob : HeuristicLab.Clients.Hive.HiveItem
+ {
+
+ private System.Nullable DateCalculatedField;
+
+ private System.Nullable DateCreatedField;
+
+ private System.Nullable DateFinishedField;
+
+ private string ExceptionField;
+
+ private System.TimeSpan ExecutionTimeField;
+
+ private System.Nullable ParentJobIdField;
+
+ private System.Guid SlaveIdField;
+
+ private HeuristicLab.Clients.Hive.JobState StateField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable DateCalculated
+ {
+ get
+ {
+ return this.DateCalculatedField;
+ }
+ set
+ {
+ if ((this.DateCalculatedField.Equals(value) != true))
+ {
+ this.DateCalculatedField = value;
+ this.RaisePropertyChanged("DateCalculated");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable DateCreated
+ {
+ get
+ {
+ return this.DateCreatedField;
+ }
+ set
+ {
+ if ((this.DateCreatedField.Equals(value) != true))
+ {
+ this.DateCreatedField = value;
+ this.RaisePropertyChanged("DateCreated");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable DateFinished
+ {
+ get
+ {
+ return this.DateFinishedField;
+ }
+ set
+ {
+ if ((this.DateFinishedField.Equals(value) != true))
+ {
+ this.DateFinishedField = value;
+ this.RaisePropertyChanged("DateFinished");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public string Exception
+ {
+ get
+ {
+ return this.ExceptionField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.ExceptionField, value) != true))
+ {
+ this.ExceptionField = value;
+ this.RaisePropertyChanged("Exception");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.TimeSpan ExecutionTime
+ {
+ get
+ {
+ return this.ExecutionTimeField;
+ }
+ set
+ {
+ if ((this.ExecutionTimeField.Equals(value) != true))
+ {
+ this.ExecutionTimeField = value;
+ this.RaisePropertyChanged("ExecutionTime");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Nullable ParentJobId
+ {
+ get
+ {
+ return this.ParentJobIdField;
+ }
+ set
+ {
+ if ((this.ParentJobIdField.Equals(value) != true))
+ {
+ this.ParentJobIdField = value;
+ this.RaisePropertyChanged("ParentJobId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid SlaveId
+ {
+ get
+ {
+ return this.SlaveIdField;
+ }
+ set
+ {
+ if ((this.SlaveIdField.Equals(value) != true))
+ {
+ this.SlaveIdField = value;
+ this.RaisePropertyChanged("SlaveId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public HeuristicLab.Clients.Hive.JobState State
+ {
+ get
+ {
+ return this.StateField;
+ }
+ set
+ {
+ if ((this.StateField.Equals(value) != true))
+ {
+ this.StateField = value;
+ this.RaisePropertyChanged("State");
+ }
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Job", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class Job : HeuristicLab.Clients.Hive.LightweightJob
+ {
+
+ private System.Guid[] AssignedResourceIdsField;
+
+ private int CoresNeededField;
+
+ private int MemoryNeededField;
+
+ private System.Guid[] PluginsNeededIdsField;
+
+ private int PriorityField;
+
+ private System.Guid ProjectIdField;
+
+ private System.Guid UserIdField;
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid[] AssignedResourceIds
+ {
+ get
+ {
+ return this.AssignedResourceIdsField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.AssignedResourceIdsField, value) != true))
+ {
+ this.AssignedResourceIdsField = value;
+ this.RaisePropertyChanged("AssignedResourceIds");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public int CoresNeeded
+ {
+ get
+ {
+ return this.CoresNeededField;
+ }
+ set
+ {
+ if ((this.CoresNeededField.Equals(value) != true))
+ {
+ this.CoresNeededField = value;
+ this.RaisePropertyChanged("CoresNeeded");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public int MemoryNeeded
+ {
+ get
+ {
+ return this.MemoryNeededField;
+ }
+ set
+ {
+ if ((this.MemoryNeededField.Equals(value) != true))
+ {
+ this.MemoryNeededField = value;
+ this.RaisePropertyChanged("MemoryNeeded");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid[] PluginsNeededIds
+ {
+ get
+ {
+ return this.PluginsNeededIdsField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.PluginsNeededIdsField, value) != true))
+ {
+ this.PluginsNeededIdsField = value;
+ this.RaisePropertyChanged("PluginsNeededIds");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public int Priority
+ {
+ get
+ {
+ return this.PriorityField;
+ }
+ set
+ {
+ if ((this.PriorityField.Equals(value) != true))
+ {
+ this.PriorityField = value;
+ this.RaisePropertyChanged("Priority");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid ProjectId
+ {
+ get
+ {
+ return this.ProjectIdField;
+ }
+ set
+ {
+ if ((this.ProjectIdField.Equals(value) != true))
+ {
+ this.ProjectIdField = value;
+ this.RaisePropertyChanged("ProjectId");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid UserId
+ {
+ get
+ {
+ return this.UserIdField;
+ }
+ set
+ {
+ if ((this.UserIdField.Equals(value) != true))
+ {
+ this.UserIdField = value;
+ this.RaisePropertyChanged("UserId");
+ }
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="JobState", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public enum JobState : int
+ {
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Calculating = 0,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Waiting = 1,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Finished = 2,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Aborted = 3,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Failed = 4,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ WaitForChildJobs = 5,
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="CalendarState", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public enum CalendarState : int
+ {
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Fetch = 0,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ ForceFetch = 1,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Fetching = 2,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Fetched = 3,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ NotAllowedToFetch = 4,
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="SlaveState", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public enum SlaveState : int
+ {
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Idle = 0,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Calculating = 1,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Offline = 2,
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="Heartbeat", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common.DataTra" +
+ "nsfer")]
+ public partial class Heartbeat : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private int FreeCoresField;
+
+ private int FreeMemoryField;
+
+ private bool IsAllowedToCalculateField;
+
+ private System.Collections.Generic.Dictionary JobProgressField;
+
+ private System.Guid SlaveIdField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public int FreeCores
+ {
+ get
+ {
+ return this.FreeCoresField;
+ }
+ set
+ {
+ if ((this.FreeCoresField.Equals(value) != true))
+ {
+ this.FreeCoresField = value;
+ this.RaisePropertyChanged("FreeCores");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public int FreeMemory
+ {
+ get
+ {
+ return this.FreeMemoryField;
+ }
+ set
+ {
+ if ((this.FreeMemoryField.Equals(value) != true))
+ {
+ this.FreeMemoryField = value;
+ this.RaisePropertyChanged("FreeMemory");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public bool IsAllowedToCalculate
+ {
+ get
+ {
+ return this.IsAllowedToCalculateField;
+ }
+ set
+ {
+ if ((this.IsAllowedToCalculateField.Equals(value) != true))
+ {
+ this.IsAllowedToCalculateField = value;
+ this.RaisePropertyChanged("IsAllowedToCalculate");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Collections.Generic.Dictionary JobProgress
+ {
+ get
+ {
+ return this.JobProgressField;
+ }
+ set
+ {
+ if ((object.ReferenceEquals(this.JobProgressField, value) != true))
+ {
+ this.JobProgressField = value;
+ this.RaisePropertyChanged("JobProgress");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute()]
+ public System.Guid SlaveId
+ {
+ get
+ {
+ return this.SlaveIdField;
+ }
+ set
+ {
+ if ((this.SlaveIdField.Equals(value) != true))
+ {
+ this.SlaveIdField = value;
+ this.RaisePropertyChanged("SlaveId");
+ }
+ }
+ }
+
+ public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+ protected void RaisePropertyChanged(string propertyName)
+ {
+ System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+ if ((propertyChanged != null))
+ {
+ propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="MessageContainer", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common")]
+ public partial class MessageContainer : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+ {
+
+ private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+
+ private System.Guid JobIdk__BackingFieldField;
+
+ private HeuristicLab.Clients.Hive.MessageContainer.MessageType Messagek__BackingFieldField;
+
+ public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+ {
+ get
+ {
+ return this.extensionDataField;
+ }
+ set
+ {
+ this.extensionDataField = value;
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute(Name="k__BackingField", IsRequired=true)]
+ public System.Guid JobIdk__BackingField
+ {
+ get
+ {
+ return this.JobIdk__BackingFieldField;
+ }
+ set
+ {
+ if ((this.JobIdk__BackingFieldField.Equals(value) != true))
+ {
+ this.JobIdk__BackingFieldField = value;
+ this.RaisePropertyChanged("JobIdk__BackingField");
+ }
+ }
+ }
+
+ [System.Runtime.Serialization.DataMemberAttribute(Name="k__BackingField", IsRequired=true)]
+ public HeuristicLab.Clients.Hive.MessageContainer.MessageType Messagek__BackingField
+ {
+ get
+ {
+ return this.Messagek__BackingFieldField;
+ }
+ set
+ {
+ if ((this.Messagek__BackingFieldField.Equals(value) != true))
+ {
+ this.Messagek__BackingFieldField = value;
+ this.RaisePropertyChanged("Messagek__BackingField");
+ }
+ }
+ }
+
+ public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+
+ protected void RaisePropertyChanged(string propertyName)
+ {
+ System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+ if ((propertyChanged != null))
+ {
+ propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+ [System.Runtime.Serialization.DataContractAttribute(Name="MessageContainer.MessageType", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Hive.Common")]
+ public enum MessageType : int
+ {
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ FetchJob = 0,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ AbortJob = 1,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ JobAborted = 2,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ FinishedJob = 3,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ NoMessage = 4,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ SnapshotReady = 5,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ Shutdown = 6,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ JobFailed = 7,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ UptimeLimitDisconnect = 8,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ UpdateCalendar = 9,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ AddChildJob = 10,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ PauseJob = 11,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ GetChildJobs = 12,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ DeleteChildJobs = 13,
+
+ [System.Runtime.Serialization.EnumMemberAttribute()]
+ AddSlaveInfo = 14,
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+ [System.ServiceModel.ServiceContractAttribute(ConfigurationName="HeuristicLab.Clients.Hive.IHiveService")]
+ public interface IHiveService
+ {
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddJob", ReplyAction="http://tempuri.org/IHiveService/AddJobResponse")]
+ System.Guid AddJob(HeuristicLab.Clients.Hive.Job jobDto, HeuristicLab.Clients.Hive.JobData jobDataDto);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddChildJob", ReplyAction="http://tempuri.org/IHiveService/AddChildJobResponse")]
+ System.Guid AddChildJob(System.Guid parentJobId, HeuristicLab.Clients.Hive.Job jobDto, HeuristicLab.Clients.Hive.JobData jobDataDto);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetJob", ReplyAction="http://tempuri.org/IHiveService/GetJobResponse")]
+ HeuristicLab.Clients.Hive.Job GetJob(System.Guid jobId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetJobs", ReplyAction="http://tempuri.org/IHiveService/GetJobsResponse")]
+ HeuristicLab.Clients.Hive.Job[] GetJobs();
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetLightweightJobs", ReplyAction="http://tempuri.org/IHiveService/GetLightweightJobsResponse")]
+ HeuristicLab.Clients.Hive.LightweightJob[] GetLightweightJobs(System.Guid[] jobIds);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetLightweightChildJobs", ReplyAction="http://tempuri.org/IHiveService/GetLightweightChildJobsResponse")]
+ HeuristicLab.Clients.Hive.LightweightJob[] GetLightweightChildJobs(System.Nullable parentJobId, bool recursive, bool includeParent);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetJobData", ReplyAction="http://tempuri.org/IHiveService/GetJobDataResponse")]
+ HeuristicLab.Clients.Hive.JobData GetJobData(System.Guid jobId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetJobDataStreamed", ReplyAction="http://tempuri.org/IHiveService/GetJobDataStreamedResponse")]
+ System.IO.Stream GetJobDataStreamed(System.Guid jobId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/UpdateJob", ReplyAction="http://tempuri.org/IHiveService/UpdateJobResponse")]
+ void UpdateJob(HeuristicLab.Clients.Hive.Job jobDto, HeuristicLab.Clients.Hive.JobData jobDataDto);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/UpdateJobDataStreamed", ReplyAction="http://tempuri.org/IHiveService/UpdateJobDataStreamedResponse")]
+ void UpdateJobDataStreamed(System.IO.Stream stream);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/DeleteChildJobs", ReplyAction="http://tempuri.org/IHiveService/DeleteChildJobsResponse")]
+ void DeleteChildJobs(System.Guid parentJobId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AquireJob", ReplyAction="http://tempuri.org/IHiveService/AquireJobResponse")]
+ HeuristicLab.Clients.Hive.Job AquireJob(System.Guid slaveId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AbortJob", ReplyAction="http://tempuri.org/IHiveService/AbortJobResponse")]
+ void AbortJob(System.Guid jobId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/PauseJob", ReplyAction="http://tempuri.org/IHiveService/PauseJobResponse")]
+ HeuristicLab.Clients.Hive.Job PauseJob(HeuristicLab.Clients.Hive.JobData serializedJob);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetHiveExperiment", ReplyAction="http://tempuri.org/IHiveService/GetHiveExperimentResponse")]
+ HeuristicLab.Clients.Hive.HiveExperiment GetHiveExperiment(System.Guid id);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetHiveExperiments", ReplyAction="http://tempuri.org/IHiveService/GetHiveExperimentsResponse")]
+ HeuristicLab.Clients.Hive.HiveExperiment[] GetHiveExperiments();
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddHiveExperiment", ReplyAction="http://tempuri.org/IHiveService/AddHiveExperimentResponse")]
+ System.Guid AddHiveExperiment(HeuristicLab.Clients.Hive.HiveExperiment hiveExperimentDto);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/UpdateHiveExperiment", ReplyAction="http://tempuri.org/IHiveService/UpdateHiveExperimentResponse")]
+ void UpdateHiveExperiment(HeuristicLab.Clients.Hive.HiveExperiment hiveExperimentDto);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/DeleteHiveExperiment", ReplyAction="http://tempuri.org/IHiveService/DeleteHiveExperimentResponse")]
+ void DeleteHiveExperiment(System.Guid hiveExperimentId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetAllProjects", ReplyAction="http://tempuri.org/IHiveService/GetAllProjectsResponse")]
+ HeuristicLab.Clients.Hive.Project GetAllProjects();
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/CreateProject", ReplyAction="http://tempuri.org/IHiveService/CreateProjectResponse")]
+ void CreateProject(HeuristicLab.Clients.Hive.Project project);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/ChangeProject", ReplyAction="http://tempuri.org/IHiveService/ChangeProjectResponse")]
+ void ChangeProject(HeuristicLab.Clients.Hive.Project project);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/DeleteProject", ReplyAction="http://tempuri.org/IHiveService/DeleteProjectResponse")]
+ void DeleteProject(System.Guid projectId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetJobsByProject", ReplyAction="http://tempuri.org/IHiveService/GetJobsByProjectResponse")]
+ HeuristicLab.Clients.Hive.Job[] GetJobsByProject(System.Guid projectId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/ProcessHeartbeat", ReplyAction="http://tempuri.org/IHiveService/ProcessHeartbeatResponse")]
+ HeuristicLab.Clients.Hive.MessageContainer[] ProcessHeartbeat(HeuristicLab.Clients.Hive.Heartbeat heartbeat);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetPlugins", ReplyAction="http://tempuri.org/IHiveService/GetPluginsResponse")]
+ HeuristicLab.Clients.Hive.HivePluginData[] GetPlugins(HeuristicLab.Clients.Hive.HivePlugin[] pluginList);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetStreamedPlugins", ReplyAction="http://tempuri.org/IHiveService/GetStreamedPluginsResponse")]
+ System.IO.Stream GetStreamedPlugins(HeuristicLab.Clients.Hive.HivePlugin[] pluginList);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetCalendar", ReplyAction="http://tempuri.org/IHiveService/GetCalendarResponse")]
+ HeuristicLab.Clients.Hive.Appointment[] GetCalendar(System.Guid slaveId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/SetCalendarStatus", ReplyAction="http://tempuri.org/IHiveService/SetCalendarStatusResponse")]
+ void SetCalendarStatus(System.Guid clientId, HeuristicLab.Clients.Hive.CalendarState state);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetUptimeCalendarForResource", ReplyAction="http://tempuri.org/IHiveService/GetUptimeCalendarForResourceResponse")]
+ HeuristicLab.Clients.Hive.Appointment[] GetUptimeCalendarForResource(System.Guid guid);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/SetUptimeCalendarForResource", ReplyAction="http://tempuri.org/IHiveService/SetUptimeCalendarForResourceResponse")]
+ void SetUptimeCalendarForResource(System.Guid guid, HeuristicLab.Clients.Hive.Appointment[] appointments, bool isForced);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddSlaveGroup", ReplyAction="http://tempuri.org/IHiveService/AddSlaveGroupResponse")]
+ System.Guid AddSlaveGroup(HeuristicLab.Clients.Hive.SlaveGroup slaveGroup);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetSlaves", ReplyAction="http://tempuri.org/IHiveService/GetSlavesResponse")]
+ HeuristicLab.Clients.Hive.Slave[] GetSlaves();
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/GetSlaveGroups", ReplyAction="http://tempuri.org/IHiveService/GetSlaveGroupsResponse")]
+ HeuristicLab.Clients.Hive.SlaveGroup[] GetSlaveGroups();
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/DeleteSlaveGroup", ReplyAction="http://tempuri.org/IHiveService/DeleteSlaveGroupResponse")]
+ void DeleteSlaveGroup(System.Guid clientGroupId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/AddResourceToGroup", ReplyAction="http://tempuri.org/IHiveService/AddResourceToGroupResponse")]
+ void AddResourceToGroup(System.Guid slaveGroupId, HeuristicLab.Clients.Hive.Resource resource);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/RemoveResourceFromGroup", ReplyAction="http://tempuri.org/IHiveService/RemoveResourceFromGroupResponse")]
+ void RemoveResourceFromGroup(System.Guid slaveGroupId, System.Guid resourceId);
+
+ [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHiveService/UpdateSlave", ReplyAction="http://tempuri.org/IHiveService/UpdateSlaveResponse")]
+ void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave);
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+ public interface IHiveServiceChannel : HeuristicLab.Clients.Hive.IHiveService, System.ServiceModel.IClientChannel
+ {
+ }
+
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+ public partial class HiveServiceClient : System.ServiceModel.ClientBase, HeuristicLab.Clients.Hive.IHiveService
+ {
+
+ public HiveServiceClient()
+ {
+ }
+
+ public HiveServiceClient(string endpointConfigurationName) :
+ base(endpointConfigurationName)
+ {
+ }
+
+ public HiveServiceClient(string endpointConfigurationName, string remoteAddress) :
+ base(endpointConfigurationName, remoteAddress)
+ {
+ }
+
+ public HiveServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
+ base(endpointConfigurationName, remoteAddress)
+ {
+ }
+
+ public HiveServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
+ base(binding, remoteAddress)
+ {
+ }
+
+ public System.Guid AddJob(HeuristicLab.Clients.Hive.Job jobDto, HeuristicLab.Clients.Hive.JobData jobDataDto)
+ {
+ return base.Channel.AddJob(jobDto, jobDataDto);
+ }
+
+ public System.Guid AddChildJob(System.Guid parentJobId, HeuristicLab.Clients.Hive.Job jobDto, HeuristicLab.Clients.Hive.JobData jobDataDto)
+ {
+ return base.Channel.AddChildJob(parentJobId, jobDto, jobDataDto);
+ }
+
+ public HeuristicLab.Clients.Hive.Job GetJob(System.Guid jobId)
+ {
+ return base.Channel.GetJob(jobId);
+ }
+
+ public HeuristicLab.Clients.Hive.Job[] GetJobs()
+ {
+ return base.Channel.GetJobs();
+ }
+
+ public HeuristicLab.Clients.Hive.LightweightJob[] GetLightweightJobs(System.Guid[] jobIds)
+ {
+ return base.Channel.GetLightweightJobs(jobIds);
+ }
+
+ public HeuristicLab.Clients.Hive.LightweightJob[] GetLightweightChildJobs(System.Nullable parentJobId, bool recursive, bool includeParent)
+ {
+ return base.Channel.GetLightweightChildJobs(parentJobId, recursive, includeParent);
+ }
+
+ public HeuristicLab.Clients.Hive.JobData GetJobData(System.Guid jobId)
+ {
+ return base.Channel.GetJobData(jobId);
+ }
+
+ public System.IO.Stream GetJobDataStreamed(System.Guid jobId)
+ {
+ return base.Channel.GetJobDataStreamed(jobId);
+ }
+
+ public void UpdateJob(HeuristicLab.Clients.Hive.Job jobDto, HeuristicLab.Clients.Hive.JobData jobDataDto)
+ {
+ base.Channel.UpdateJob(jobDto, jobDataDto);
+ }
+
+ public void UpdateJobDataStreamed(System.IO.Stream stream)
+ {
+ base.Channel.UpdateJobDataStreamed(stream);
+ }
+
+ public void DeleteChildJobs(System.Guid parentJobId)
+ {
+ base.Channel.DeleteChildJobs(parentJobId);
+ }
+
+ public HeuristicLab.Clients.Hive.Job AquireJob(System.Guid slaveId)
+ {
+ return base.Channel.AquireJob(slaveId);
+ }
+
+ public void AbortJob(System.Guid jobId)
+ {
+ base.Channel.AbortJob(jobId);
+ }
+
+ public HeuristicLab.Clients.Hive.Job PauseJob(HeuristicLab.Clients.Hive.JobData serializedJob)
+ {
+ return base.Channel.PauseJob(serializedJob);
+ }
+
+ public HeuristicLab.Clients.Hive.HiveExperiment GetHiveExperiment(System.Guid id)
+ {
+ return base.Channel.GetHiveExperiment(id);
+ }
+
+ public HeuristicLab.Clients.Hive.HiveExperiment[] GetHiveExperiments()
+ {
+ return base.Channel.GetHiveExperiments();
+ }
+
+ public System.Guid AddHiveExperiment(HeuristicLab.Clients.Hive.HiveExperiment hiveExperimentDto)
+ {
+ return base.Channel.AddHiveExperiment(hiveExperimentDto);
+ }
+
+ public void UpdateHiveExperiment(HeuristicLab.Clients.Hive.HiveExperiment hiveExperimentDto)
+ {
+ base.Channel.UpdateHiveExperiment(hiveExperimentDto);
+ }
+
+ public void DeleteHiveExperiment(System.Guid hiveExperimentId)
+ {
+ base.Channel.DeleteHiveExperiment(hiveExperimentId);
+ }
+
+ public HeuristicLab.Clients.Hive.Project GetAllProjects()
+ {
+ return base.Channel.GetAllProjects();
+ }
+
+ public void CreateProject(HeuristicLab.Clients.Hive.Project project)
+ {
+ base.Channel.CreateProject(project);
+ }
+
+ public void ChangeProject(HeuristicLab.Clients.Hive.Project project)
+ {
+ base.Channel.ChangeProject(project);
+ }
+
+ public void DeleteProject(System.Guid projectId)
+ {
+ base.Channel.DeleteProject(projectId);
+ }
+
+ public HeuristicLab.Clients.Hive.Job[] GetJobsByProject(System.Guid projectId)
+ {
+ return base.Channel.GetJobsByProject(projectId);
+ }
+
+ public HeuristicLab.Clients.Hive.MessageContainer[] ProcessHeartbeat(HeuristicLab.Clients.Hive.Heartbeat heartbeat)
+ {
+ return base.Channel.ProcessHeartbeat(heartbeat);
+ }
+
+ public HeuristicLab.Clients.Hive.HivePluginData[] GetPlugins(HeuristicLab.Clients.Hive.HivePlugin[] pluginList)
+ {
+ return base.Channel.GetPlugins(pluginList);
+ }
+
+ public System.IO.Stream GetStreamedPlugins(HeuristicLab.Clients.Hive.HivePlugin[] pluginList)
+ {
+ return base.Channel.GetStreamedPlugins(pluginList);
+ }
+
+ public HeuristicLab.Clients.Hive.Appointment[] GetCalendar(System.Guid slaveId)
+ {
+ return base.Channel.GetCalendar(slaveId);
+ }
+
+ public void SetCalendarStatus(System.Guid clientId, HeuristicLab.Clients.Hive.CalendarState state)
+ {
+ base.Channel.SetCalendarStatus(clientId, state);
+ }
+
+ public HeuristicLab.Clients.Hive.Appointment[] GetUptimeCalendarForResource(System.Guid guid)
+ {
+ return base.Channel.GetUptimeCalendarForResource(guid);
+ }
+
+ public void SetUptimeCalendarForResource(System.Guid guid, HeuristicLab.Clients.Hive.Appointment[] appointments, bool isForced)
+ {
+ base.Channel.SetUptimeCalendarForResource(guid, appointments, isForced);
+ }
+
+ public System.Guid AddSlaveGroup(HeuristicLab.Clients.Hive.SlaveGroup slaveGroup)
+ {
+ return base.Channel.AddSlaveGroup(slaveGroup);
+ }
+
+ public HeuristicLab.Clients.Hive.Slave[] GetSlaves()
+ {
+ return base.Channel.GetSlaves();
+ }
+
+ public HeuristicLab.Clients.Hive.SlaveGroup[] GetSlaveGroups()
+ {
+ return base.Channel.GetSlaveGroups();
+ }
+
+ public void DeleteSlaveGroup(System.Guid clientGroupId)
+ {
+ base.Channel.DeleteSlaveGroup(clientGroupId);
+ }
+
+ public void AddResourceToGroup(System.Guid slaveGroupId, HeuristicLab.Clients.Hive.Resource resource)
+ {
+ base.Channel.AddResourceToGroup(slaveGroupId, resource);
+ }
+
+ public void RemoveResourceFromGroup(System.Guid slaveGroupId, System.Guid resourceId)
+ {
+ base.Channel.RemoveResourceFromGroup(slaveGroupId, resourceId);
+ }
+
+ public void UpdateSlave(HeuristicLab.Clients.Hive.Slave slave)
+ {
+ base.Channel.UpdateSlave(slave);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/ServiceClientFactory.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/ServiceClientFactory.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/ServiceClientFactory.cs (revision 5050)
@@ -0,0 +1,190 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.ServiceModel;
+using HeuristicLab.Common;
+using HeuristicLab.Tracing;
+using HeuristicLab.Services.Hive.Common;
+using System.ServiceModel.Description;
+
+namespace HeuristicLab.Clients.Hive {
+ public class ServiceClientFactory {
+ private static object locker = new object();
+
+ private string endpointName;
+
+ private string username;
+ public string Username {
+ get { return username; }
+ set {
+ if(username != value) {
+ username = value;
+ this.factory = null;
+ }
+ }
+ }
+
+ private string password;
+ public string Password {
+ set {
+ if (password != value) {
+ password = value;
+ this.factory = null;
+ }
+ }
+ }
+
+ private ChannelFactory factory = null;
+ private Disposable disposableService = null;
+ private int requestCount = 0;
+
+ public ServiceClientFactory(string username, string password, string endpointName) {
+ this.username = username;
+ this.password = password;
+ this.endpointName = endpointName;
+ }
+
+ private T CreateFacade(string endpointName) {
+ lock (locker) {
+ try {
+ return CreateChannel(endpointName);
+ }
+ catch (EndpointNotFoundException ex) {
+ OnExceptionOccured(ex);
+ }
+ return default(T);
+ }
+ }
+
+ protected virtual T CreateChannel(string endpointName) {
+ if (factory == null) {
+ factory = new ChannelFactory(endpointName);
+ factory.Credentials.UserName.UserName = username;
+ factory.Credentials.UserName.Password = password;
+ factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
+ }
+
+ return factory.CreateChannel();
+ }
+
+ public Disposable GetService() {
+ lock (locker) {
+ requestCount++;
+ Logger.Debug("Request for ServiceProxy (count: " + requestCount + ")");
+ if (disposableService != null) {
+ if (GetServiceState() == CommunicationState.Faulted) {
+ DisposeService();
+ }
+ }
+ if (disposableService == null) {
+ disposableService = new Disposable(CreateFacade(this.endpointName));
+ RegisterServiceEvents();
+ }
+ return disposableService;
+ }
+ }
+
+ private void RegisterServiceEvents() {
+ disposableService.Disposing += disposableService_Disposing;
+ ((ICommunicationObject)disposableService.Obj).Faulted += new EventHandler(WcfServicePool_Faulted);
+ }
+
+ private void DeregisterServiceEvents() {
+ disposableService.Disposing -= disposableService_Disposing;
+ ((ICommunicationObject)disposableService.Obj).Faulted -= new EventHandler(WcfServicePool_Faulted);
+ }
+
+ private CommunicationState GetServiceState() {
+ return ((ICommunicationObject)disposableService.Obj).State;
+ }
+
+ void WcfServicePool_Faulted(object sender, EventArgs e) {
+ OnExceptionOccured(new CommunicationException(e.ToString()));
+ }
+
+ private void disposableService_Disposing(object sender, EventArgs e) {
+ DisposeService();
+ }
+
+ public void DisposeService() {
+ lock (locker) {
+ requestCount--;
+ Logger.Debug("Disposing ServiceProxy (count: " + requestCount + ")");
+ if (requestCount == 0) {
+ try {
+ DeregisterServiceEvents();
+ ServiceUtil.DisposeWcfClient((ICommunicationObject)disposableService.Obj);
+ }
+ catch (Exception e) {
+ OnExceptionOccured(e);
+ }
+ finally {
+ disposableService = null;
+ }
+ } else if (requestCount < 0) {
+ throw new ServiceClientFactoryException("requestCount cannot be less than 0.");
+ }
+ }
+ }
+
+ public event EventHandler> ExceptionOccured;
+ private void OnExceptionOccured(Exception e) {
+ lock (locker) {
+ var handler = ExceptionOccured;
+ if (handler != null) handler(this, new EventArgs(e));
+ }
+ }
+ }
+
+ public static class ServiceUtil {
+ ///
+ /// This method changes the endpoint-address while preserving the identity-certificate defined in the config file
+ ///
+ public static void ReplaceEndpointAddress(ServiceEndpoint endpoint, string hostAddress) {
+ EndpointAddressBuilder builder = new EndpointAddressBuilder(endpoint.Address);
+ UriBuilder uriBuilder = new UriBuilder(builder.Uri);
+ uriBuilder.Host = hostAddress;
+ builder.Uri = uriBuilder.Uri;
+ endpoint.Address = builder.ToEndpointAddress();
+ }
+
+ ///
+ /// Safely disposes a WCF client proxy object
+ ///
+ ///
+ public static void DisposeWcfClient(ICommunicationObject obj) {
+ if (obj != null) {
+ if (obj.State != CommunicationState.Faulted &&
+ obj.State != CommunicationState.Closed) {
+ try { obj.Close(); }
+ catch (CommunicationObjectFaultedException) { obj.Abort(); }
+ catch (TimeoutException) { obj.Abort(); }
+ catch (Exception e) {
+ obj.Abort();
+ Logger.Error(e);
+ }
+ } else
+ obj.Abort();
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceLocator.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceLocator.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceLocator.cs (revision 5050)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using HeuristicLab.Services.Hive.Common.ServiceContracts;
+using HeuristicLab.Clients.Hive.Properties;
+
+namespace HeuristicLab.Clients.Hive {
+ public class ServiceLocator {
+ private static ServiceLocator instance = null;
+ private ServiceClientFactory serviceFactory = null;
+
+ public static ServiceLocator Instance {
+ get {
+ if (instance == null) {
+ instance = new ServiceLocator();
+ }
+ return instance;
+ }
+ }
+
+ public ServiceLocator() {
+ Settings.Default.SettingChanging += new System.Configuration.SettingChangingEventHandler(Default_SettingChanging);
+ }
+
+ private void Default_SettingChanging(object sender, System.Configuration.SettingChangingEventArgs e) {
+ if (serviceFactory != null) {
+ serviceFactory.Username = Settings.Default.HiveUsername;
+ serviceFactory.Password = Settings.Default.HivePassword;
+ }
+ }
+
+ public ServiceClientFactory ServicePool {
+ get {
+ if (serviceFactory == null) {
+ serviceFactory = new ServiceClientFactory(Settings.Default.HiveUsername, Settings.Default.HivePassword, "wsHttpBinding_IHiveService");
+ }
+ return serviceFactory;
+ }
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/app.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/app.config (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/app.config (revision 5050)
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive-3.3.dll.config
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive-3.3.dll.config (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive-3.3.dll.config (revision 5050)
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive.sln
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive.sln (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive.sln (revision 5050)
@@ -0,0 +1,155 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Hive-3.4", "HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj", "{F98A1740-9AC9-4D36-A582-6A2D0D06978D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Slave-3.4", "HeuristicLab.Clients.Hive.Slave\3.4\HeuristicLab.Clients.Hive.Slave-3.4.csproj", "{989FE92B-484E-41EE-87E2-6A24AF0381D8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Hive.Common-3.4", "HeuristicLab.Services.Hive.Common\3.4\HeuristicLab.Services.Hive.Common-3.4.csproj", "{14424A16-48D4-445E-80BF-DDF617548BBB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Hive.DataAccess-3.4", "HeuristicLab.Services.Hive.DataAccess\3.4\HeuristicLab.Services.Hive.DataAccess-3.4.csproj", "{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{EE1E22D1-0141-4C16-ADC6-333120BD21DE}"
+ ProjectSection(SolutionItems) = preProject
+ ConfigMerger.exe = ConfigMerger.exe
+ CopyAssembly.cmd = CopyAssembly.cmd
+ HeuristicLab 3.3.exe.config = HeuristicLab 3.3.exe.config
+ HeuristicLab.Hive-3.3.dll.config = HeuristicLab.Hive-3.3.dll.config
+ MergeConfigs.cmd = MergeConfigs.cmd
+ PreBuildEvent.cmd = PreBuildEvent.cmd
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive-3.4", "HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj", "{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Views-3.4", "HeuristicLab.Clients.Hive.Views\3.4\HeuristicLab.Clients.Hive.Views-3.4.csproj", "{E1D6C801-892A-406A-B606-F158E36DD3C3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Slave.Views-3.4", "HeuristicLab.Clients.Hive.Slave.Views\3.4\HeuristicLab.Clients.Hive.Slave.Views-3.4.csproj", "{8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Hive-3.4", "HeuristicLab.Services.Hive\3.4\HeuristicLab.Services.Hive-3.4.csproj", "{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}"
+EndProject
+Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "3.4", "HeuristicLab.Services.Hive.Web\3.4\", "{0CA6706D-A569-45DE-A85C-4158891CC1BC}"
+ ProjectSection(WebsiteProperties) = preProject
+ TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
+ Debug.AspNetCompiler.VirtualPath = "/3.4"
+ Debug.AspNetCompiler.PhysicalPath = "HeuristicLab.Services.Hive.Web\3.4\"
+ Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\3.4\"
+ Debug.AspNetCompiler.Updateable = "true"
+ Debug.AspNetCompiler.ForceOverwrite = "true"
+ Debug.AspNetCompiler.FixedNames = "false"
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.VirtualPath = "/3.4"
+ Release.AspNetCompiler.PhysicalPath = "HeuristicLab.Services.Hive.Web\3.4\"
+ Release.AspNetCompiler.TargetPath = "PrecompiledWeb\3.4\"
+ Release.AspNetCompiler.Updateable = "true"
+ Release.AspNetCompiler.ForceOverwrite = "true"
+ Release.AspNetCompiler.FixedNames = "false"
+ Release.AspNetCompiler.Debug = "False"
+ VWDPort = "1649"
+ DefaultWebSiteLanguage = "Visual C#"
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}.Release|x86.ActiveCfg = Release|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {989FE92B-484E-41EE-87E2-6A24AF0381D8}.Release|x86.ActiveCfg = Release|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {14424A16-48D4-445E-80BF-DDF617548BBB}.Release|x86.ActiveCfg = Release|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|x86.ActiveCfg = Release|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}.Release|x86.ActiveCfg = Release|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {E1D6C801-892A-406A-B606-F158E36DD3C3}.Release|x86.ActiveCfg = Release|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {8C0D9F39-397F-4DBE-856F-BC4DC0FE23F8}.Release|x86.ActiveCfg = Release|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|x86.ActiveCfg = Release|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Any CPU.ActiveCfg = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Any CPU.Build.0 = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|x86.ActiveCfg = Debug|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLab.Hive-3.4.csproj (revision 5050)
@@ -0,0 +1,94 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {F98A1740-9AC9-4D36-A582-6A2D0D06978D}
+ Library
+ Properties
+ HeuristicLab.Hive
+ HeuristicLab.Hive-3.4
+ v3.5
+ 512
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+set TargetDir=$(TargetDir)
+set SolutionDir=$(SolutionDir)
+call $(SolutionDir)/CopyAssembly.cmd
+call $(SolutionDir)/MergeConfigs.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLabHivePlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLabHivePlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/HeuristicLabHivePlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Hive {
+ [Plugin("HeuristicLab.Hive", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Hive-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabHivePlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/IJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/IJob.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/IJob.cs (revision 5050)
@@ -0,0 +1,74 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Hive {
+ public interface IJob : INamedItem {
+ TimeSpan ExecutionTime { get; }
+
+ ExecutionState ExecutionState { get; }
+
+ ///
+ /// indicates wether it is possible to create childjobs from this job
+ ///
+ bool IsParallelizable { get; }
+
+ ///
+ /// Configuration to indicate if this job should create child-jobs which will be executed in hive
+ /// Cannot be set true if IsParallelizable is false
+ ///
+ bool ComputeInParallel { get; set; }
+ event EventHandler ComputeInParallelChanged;
+
+ void Run();
+ void Prepare();
+ void Start();
+ void Stop();
+ void Resume(IEnumerable childJobs);
+
+ event EventHandler JobStopped;
+ event EventHandler JobFailed;
+
+ ///
+ /// When this event occurs the job wants to sleep until all his child jobs are finished
+ ///
+ event EventHandler WaitForChildJobs;
+
+ ///
+ /// This event will be fired when the job wants to have a child-job to be computed
+ ///
+ event EventHandler> NewChildJob;
+
+ ///
+ /// Will be fired when job wants all child-jobs to be deleted from hive
+ ///
+ event EventHandler DeleteChildJobs;
+
+ ///
+ /// If this is set to true, the job should be Resumed with the child-jobs attatched instead of Started
+ ///
+ bool CollectChildJobs { get; set; }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Hive")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7032d7ba-4799-4708-803d-9f6cb3feed35")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/ApplicationConstants.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/ApplicationConstants.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/ApplicationConstants.cs (revision 5050)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Data;
+
+namespace HeuristicLab.Services.Hive.Common {
+ public class ApplicationConstants {
+
+ public static System.Data.IsolationLevel IsolationLevel = IsolationLevel.ReadUncommitted;
+
+ ///
+ /// ReadUncommitted to minimize deadlocks.
+ ///
+ public static System.Transactions.IsolationLevel IsolationLevelScope = System.Transactions.IsolationLevel.ReadUncommitted;
+
+ public static int HeartbeatTimeout = 120; // value in seconds
+
+ public static int JobTimeToLive = 5;
+
+ ///
+ /// Interval in which the HL.HiveExperiment will poll results from server
+ ///
+ public static TimeSpan ResultPollingInterval = new TimeSpan(0, 0, 5);
+
+ ///
+ /// Maximum number of jobs that the server should send/receive simultaniously
+ ///
+ public static int MaxJobTransferCount = 6;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Appointment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Appointment.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Appointment.cs (revision 5050)
@@ -0,0 +1,54 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ public class Appointment : HiveItem {
+ [DataMember]
+ public DateTime StartDate { get; set; }
+ [DataMember]
+ public DateTime EndDate { get; set; }
+ [DataMember]
+ public bool AllDayEvent { get; set; }
+ [DataMember]
+ public bool Recurring { get; set; }
+ [DataMember]
+ public Guid RecurringId { get; set; }
+ [DataMember]
+ public Guid ResourceId { get; set; }
+
+ protected Appointment(Appointment original, Cloner cloner) : base(original, cloner) {
+ this.AllDayEvent = original.AllDayEvent;
+ this.EndDate = original.EndDate;
+ this.Recurring = original.Recurring;
+ this.RecurringId = original.RecurringId;
+ this.ResourceId = original.ResourceId;
+ this.StartDate = original.StartDate;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new Appointment(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/CalendarState.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/CalendarState.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/CalendarState.cs (revision 5050)
@@ -0,0 +1,31 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ public enum CalendarState {
+ Fetch,
+ ForceFetch,
+ Fetching,
+ Fetched,
+ NotAllowedToFetch
+ };
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HeartBeat.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HeartBeat.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HeartBeat.cs (revision 5050)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+
+ [DataContract]
+ public class Heartbeat {
+ [DataMember]
+ public Guid SlaveId { get; set; }
+ [DataMember]
+ public int FreeMemory { get; set; }
+ [DataMember]
+ public int FreeCores { get; set; }
+ [DataMember]
+ public Dictionary JobProgress { get; set; } // TODO: define Type
+ [DataMember]
+ public bool IsAllowedToCalculate { get; set; } // this is true if slave is allowed to work according to calendar
+
+ public override string ToString() {
+ String val = "SlaveId: " + SlaveId + ", FreeCores: " + FreeCores;
+ foreach (KeyValuePair kvp in JobProgress) {
+ val += "\nId" + kvp.Key + " ExecutionTime " + kvp.Value;
+ }
+ return val;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperiment.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperiment.cs (revision 5050)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class HiveExperiment : NamedHiveItem {
+ [DataMember]
+ public Guid UserId { get; set; }
+ [DataMember]
+ public Guid? RootJobId { get; set; }
+
+ public HiveExperiment() { }
+ protected HiveExperiment(HiveExperiment original, Cloner cloner) : base(original, cloner) {
+ this.RootJobId = original.RootJobId;
+ this.UserId = original.UserId;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new HiveExperiment(this, cloner);
+ }
+
+ public override string ToString() {
+ return base.ToString() + "Name: " + Name + ", Description: " + Description;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveItem.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveItem.cs (revision 5050)
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public abstract class HiveItem : HiveItemBase {
+ [DataMember]
+ public Guid Id { get; set; }
+
+ public HiveItem() { }
+ protected HiveItem(HiveItem original, Cloner cloner) : base(original, cloner) {
+ this.Id = original.Id;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveItemBase.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveItemBase.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveItemBase.cs (revision 5050)
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Common;
+using System.Runtime.Serialization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public abstract class HiveItemBase : IDeepCloneable {
+ protected HiveItemBase() { }
+ protected HiveItemBase(HiveItemBase original, Cloner cloner) {
+ cloner.RegisterClonedObject(original, this);
+ }
+
+ public abstract IDeepCloneable Clone(Cloner cloner);
+
+ public object Clone() {
+ return Clone(new Cloner());
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Job.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Job.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Job.cs (revision 5050)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class Job : LightweightJob {
+ [DataMember]
+ public Guid UserId { get; set; }
+ [DataMember]
+ public int Priority { get; set; }
+ [DataMember]
+ public int CoresNeeded { get; set; }
+ [DataMember]
+ public int MemoryNeeded { get; set; }
+ [DataMember]
+ public Guid? ProjectId { get; set; }
+ [DataMember]
+ public List PluginsNeededIds { get; set; }
+
+ public Job() { }
+ protected Job(Job original, Cloner cloner) : base(original, cloner) {
+ this.UserId = original.UserId;
+ this.Priority = original.Priority;
+ this.CoresNeeded = original.CoresNeeded;
+ this.MemoryNeeded = original.MemoryNeeded;
+ this.ProjectId = original.ProjectId;
+ this.PluginsNeededIds = new List(original.PluginsNeededIds);
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new Job(this, cloner);
+ }
+
+ public override string ToString() {
+ return string.Format("State: {0}, SlaveId: {1}, DateCreated: {2}, DateCalculated: {3}, CoresNeeded: {4}, MemoryNeeded: {5}", JobState, SlaveId, DateCreated, DateCalculated, CoresNeeded, MemoryNeeded);
+ }
+
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobData.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobData.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobData.cs (revision 5050)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.IO;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class JobData : HiveItemBase {
+ [DataMember]
+ public Guid JobId { get; set; }
+ [DataMember]
+ public byte[] Data { get; set; }
+
+ public JobData() { }
+ protected JobData(JobData original, Cloner cloner) : base(original, cloner) {
+ if (original.Data != null) this.Data = new byte[original.Data.Length]; Array.Copy(original.Data, this.Data, original.Data.Length);
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new JobData(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobState.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobState.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobState.cs (revision 5050)
@@ -0,0 +1,86 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ public enum JobState {
+ ///
+ /// A job is offline as long as he is not yet submitted to the hive
+ ///
+ Offline,
+
+ ///
+ /// Job is waiting to be calculated
+ ///
+ Waiting,
+
+ ///
+ /// The job is paused and waits on the server to be sent back to a Slave when all of its child jobs are Finished.
+ ///
+ WaitingForChildJobs,
+
+ ///
+ /// Job is actively calculated on a Slave
+ ///
+ Calculating,
+
+ ///
+ /// Job as finished and is ready to be collected by the Client
+ ///
+ Finished,
+
+ ///
+ /// Job is aborted and result can be collected by the Client
+ ///
+ Aborted,
+
+ ///
+ /// Job as been aborted due to an error. Results are ready to be collected
+ ///
+ Failed
+ };
+
+ public static class JobStateExtensions {
+ ///
+ /// This job is not yet done
+ ///
+ public static bool IsActive(this JobState jobState) {
+ return !jobState.IsDone();
+ }
+
+ ///
+ /// This job is Waiting
+ ///
+ public static bool IsWaiting(this JobState jobState) {
+ return jobState == JobState.Waiting ||
+ jobState == JobState.WaitingForChildJobs;
+ }
+
+ ///
+ /// This job is Finished || Failed || Aborted
+ ///
+ public static bool IsDone(this JobState jobState) {
+ return jobState == JobState.Finished ||
+ jobState == JobState.Aborted ||
+ jobState == JobState.Failed;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/LightweightJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/LightweightJob.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/LightweightJob.cs (revision 5050)
@@ -0,0 +1,74 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class LightweightJob : HiveItem {
+ [DataMember]
+ public Guid? SlaveId { get; set; }
+ [DataMember]
+ public JobState JobState { get; set; }
+ [DataMember]
+ public TimeSpan? ExecutionTime { get; set; }
+ [DataMember]
+ public String Exception { get; set; }
+ [DataMember]
+ public DateTime? DateCreated { get; set; }
+ [DataMember]
+ public DateTime? DateCalculated { get; set; }
+ [DataMember]
+ public DateTime? DateFinished { get; set; }
+ [DataMember]
+ public Guid? ParentJobId { get; set; }
+
+ public LightweightJob() {
+ JobState = DataTransfer.JobState.Offline;
+ }
+ public LightweightJob(Job job) {
+ this.SlaveId = job.SlaveId;
+ this.JobState = job.JobState;
+ this.ExecutionTime = job.ExecutionTime;
+ this.Exception = job.Exception;
+ this.DateCreated = job.DateCreated;
+ this.DateCalculated = job.DateCalculated;
+ this.DateFinished = job.DateFinished;
+ this.ParentJobId = job.ParentJobId;
+ }
+ protected LightweightJob(LightweightJob original, Cloner cloner) : base(original, cloner) {
+ this.SlaveId = original.SlaveId;
+ this.JobState = original.JobState;
+ this.ExecutionTime = original.ExecutionTime;
+ this.Exception = original.Exception;
+ this.DateCreated = original.DateCreated;
+ this.DateCalculated = original.DateCalculated;
+ this.DateFinished = original.DateFinished;
+ this.ParentJobId = original.ParentJobId;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new LightweightJob(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/NamedHiveItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/NamedHiveItem.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/NamedHiveItem.cs (revision 5050)
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ public abstract class NamedHiveItem : HiveItem {
+ [DataMember]
+ public string Name { get; set; }
+ [DataMember]
+ public string Description { get; set; }
+
+ protected NamedHiveItem() { }
+ protected NamedHiveItem(NamedHiveItem original, Cloner cloner) : base(original, cloner) {
+ this.Name = original.Name;
+ this.Description = original.Description;
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Plugin.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Plugin.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Plugin.cs (revision 5050)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class Plugin : NamedHiveItem {
+ [DataMember]
+ public Version Version { get; set; }
+
+ public Plugin() { }
+ protected Plugin(Plugin original, Cloner cloner) : base(original, cloner) {
+ this.Version = original.Version;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new Plugin(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/PluginData.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/PluginData.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/PluginData.cs (revision 5050)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [Serializable]
+ [DataContract]
+ public class PluginData : HiveItemBase {
+ [DataMember]
+ public Guid PluginId { get; set; }
+ [DataMember]
+ public byte[] Data { get; set; }
+
+ public PluginData() { }
+ protected PluginData(PluginData original, Cloner cloner) : base(original, cloner) {
+ if (original.Data != null) this.Data = new byte[original.Data.Length]; Array.Copy(original.Data, this.Data, original.Data.Length);
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new PluginData(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Project.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Project.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Project.cs (revision 5050)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class Project : NamedHiveItem {
+
+ public Project() { }
+ protected Project(Project original, Cloner cloner) : base(original, cloner) { }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new Project(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Resource.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Resource.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Resource.cs (revision 5050)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class Resource : NamedHiveItem {
+
+ public Resource() { }
+ protected Resource(Resource original, Cloner cloner) : base(original, cloner) { }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new Resource(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Slave.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Slave.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Slave.cs (revision 5050)
@@ -0,0 +1,71 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class Slave : Resource {
+ [DataMember]
+ public int? Cores { get; set; }
+ [DataMember]
+ public int? FreeCores { get; set; }
+ [DataMember]
+ public int? CpuSpeed { get; set; }
+ [DataMember]
+ public int? Memory { get; set; }
+ [DataMember]
+ public int? FreeMemory { get; set; }
+ [DataMember]
+ public SlaveState SlaveState { get; set; }
+ [DataMember]
+ public CalendarState CalendarSyncState { get; set; }
+ [DataMember]
+ public Guid? SlaveConfigId { get; set; }
+ [DataMember]
+ public bool IsAllowedToCalculate { get; set; }
+
+ public Slave() {
+ SlaveState = DataTransfer.SlaveState.Idle;
+ }
+ protected Slave(Slave original, Cloner cloner) : base(original, cloner) {
+ this.Cores = original.Cores;
+ this.FreeCores = original.FreeCores;
+ this.CpuSpeed = original.CpuSpeed;
+ this.Memory = original.Memory;
+ this.FreeMemory = original.FreeMemory;
+ this.SlaveState = original.SlaveState;
+ this.CalendarSyncState = original.CalendarSyncState;
+ this.SlaveConfigId = original.SlaveConfigId;
+ this.IsAllowedToCalculate = original.IsAllowedToCalculate;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new Slave(this, cloner);
+ }
+
+ public override string ToString() {
+ return string.Format("Cores: {0}, FreeCores: {1}", Cores, FreeCores);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveConfig.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveConfig.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveConfig.cs (revision 5050)
@@ -0,0 +1,44 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ [Serializable]
+ public class SlaveConfig : HiveItem {
+ [DataMember]
+ public String UpDownTimeCalendar { get; set; }
+ [DataMember]
+ public int? HeartBeatIntervall { get; set; }
+
+ public SlaveConfig() { }
+ protected SlaveConfig(SlaveConfig original, Cloner cloner) : base(original, cloner) {
+ this.UpDownTimeCalendar = original.UpDownTimeCalendar;
+ this.HeartBeatIntervall = original.HeartBeatIntervall;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new SlaveConfig(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveGroup.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveGroup.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveGroup.cs (revision 5050)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using System;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ public class SlaveGroup : Resource {
+ [DataMember]
+ public List ChildResourcesIds { get; set; }
+ [DataMember]
+ public List ParentResourcesIds { get; set; }
+
+ public SlaveGroup() {
+ ChildResourcesIds = new List();
+ }
+ protected SlaveGroup(SlaveGroup original, Cloner cloner) : base(original, cloner) {
+ this.ChildResourcesIds = new List(original.ChildResourcesIds);
+ this.ParentResourcesIds = new List(original.ParentResourcesIds);
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new SlaveGroup(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveState.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveState.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/SlaveState.cs (revision 5050)
@@ -0,0 +1,29 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ public enum SlaveState {
+ Idle,
+ Calculating,
+ Offline
+ };
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/UpTimeStatistics.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/UpTimeStatistics.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/UpTimeStatistics.cs (revision 5050)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+ [DataContract]
+ public class UpTimeStatistics : HiveItem {
+ [DataMember]
+ public Guid SlaveId { get; set; }
+ [DataMember]
+ public DateTime Login { get; set; }
+ [DataMember]
+ public DateTime Logout { get; set; }
+
+ public UpTimeStatistics() { }
+ protected UpTimeStatistics(UpTimeStatistics original, Cloner cloner) : base(original, cloner) {
+ this.SlaveId = original.SlaveId;
+ this.Login = original.Login;
+ this.Logout = original.Logout;
+ }
+ public override IDeepCloneable Clone(Cloner cloner) {
+ return new UpTimeStatistics(this, cloner);
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/Disposable.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/Disposable.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/Disposable.cs (revision 5050)
@@ -0,0 +1,43 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common {
+ public class Disposable : IDisposable {
+ private T obj;
+ public T Obj {
+ get { return obj; }
+ }
+
+ public Disposable(T obj) {
+ this.obj = obj;
+ }
+
+ public void Dispose() {
+ if (Disposing != null)
+ Disposing(this, new EventArgs(obj));
+ }
+
+ public event EventHandler> Disposing;
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/HeuristicLab.Services.Hive.Common-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/HeuristicLab.Services.Hive.Common-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/HeuristicLab.Services.Hive.Common-3.4.csproj (revision 5050)
@@ -0,0 +1,116 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {14424A16-48D4-445E-80BF-DDF617548BBB}
+ Library
+ Properties
+ HeuristicLab.Services.Hive.Common
+ HeuristicLab.Services.Hive.Common-3.4
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/HeuristicLabServicesHiveCommonPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/HeuristicLabServicesHiveCommonPlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/HeuristicLabServicesHiveCommonPlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Services.Hive.Common {
+ [Plugin("HeuristicLab.Services.Hive.Common", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Services.Hive.Common-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabServicesHiveCommonPlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/MessageContainer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/MessageContainer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/MessageContainer.cs (revision 5050)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Services.Hive.Common {
+ ///
+ /// The MessageContainer is a container class for Messages. Its two parts are:
+ /// the actual message itself and the JobId, refered by the message
+ ///
+ [StorableClass]
+ [Serializable]
+ public class MessageContainer : IDeepCloneable {
+
+ public enum MessageType {
+ FetchJob,
+ AbortJob,
+ JobAborted,
+ FinishedJob,
+ NoMessage,
+ SnapshotReady,
+ Shutdown,
+ JobFailed,
+ UptimeLimitDisconnect,
+ UpdateCalendar,
+ AddChildJob,
+ PauseJob,
+ GetChildJobs,
+ DeleteChildJobs,
+
+ ///
+ /// Slave should add itself
+ ///
+ AddSlaveInfo
+ };
+
+ [Storable]
+ public MessageType Message { get; set; }
+ [Storable]
+ public Guid JobId { get; set; }
+
+ protected MessageContainer() { }
+ public MessageContainer(MessageType message) {
+ Message = message;
+ JobId = Guid.Empty;
+ }
+ public MessageContainer(MessageType message, Guid jobId) {
+ Message = message;
+ JobId = jobId;
+ }
+ protected MessageContainer(MessageContainer original, Cloner cloner) {
+ cloner.RegisterClonedObject(original, this);
+ this.Message = original.Message;
+ this.JobId = original.JobId;
+ }
+ public virtual IDeepCloneable Clone(Cloner cloner) {
+ return new MessageContainer(this, cloner);
+ }
+ public object Clone() {
+ return Clone(new Cloner());
+ }
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/Properties/AssemblyInfo.cs.frame (revision 5050)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.Hive.Common")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2010 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ad5abe86-0b5c-4c1b-b861-acc62e4ee894")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/ServiceContracts/IHiveService.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/ServiceContracts/IHiveService.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/ServiceContracts/IHiveService.cs (revision 5050)
@@ -0,0 +1,180 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.ServiceModel;
+using System.IO;
+using HeuristicLab.Services.Hive.Common.DataTransfer;
+using System.Net.Security;
+
+namespace HeuristicLab.Services.Hive.Common.ServiceContracts {
+
+ [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+ public interface IHiveService {
+
+ #region Job Methods
+ [OperationContract]
+ Guid AddJob(Job job, JobData jobData);
+
+ [OperationContract]
+ Guid AddChildJob(Guid parentJobId, Job job, JobData jobData);
+
+ [OperationContract] // formerly GetJobById
+ Job GetJob(Guid jobId);
+
+ [OperationContract] // formerly GetAllJobs
+ IEnumerable GetJobs();
+
+ [OperationContract] // formerly GetJobResults
+ IEnumerable GetLightweightJobs(IEnumerable jobIds);
+
+ [OperationContract] // formerly GetChildJobResults
+ IEnumerable GetLightweightChildJobs(Guid? parentJobId, bool recursive, bool includeParent);
+
+ [OperationContract] // formerly GetLastSerializedResult
+ JobData GetJobData(Guid jobId);
+
+ [OperationContract]
+ Stream GetJobDataStreamed(Guid jobId);
+
+ [OperationContract]
+ void UpdateJob(Job jobDto, JobData jobDataDto);
+
+ [OperationContract] // formerly StoreFinishedJobResultStreamed
+ void UpdateJobDataStreamed(Stream stream);
+
+ [OperationContract]
+ void DeleteChildJobs(Guid parentJobId);
+
+ [OperationContract] // new method: appropriate job is choosen and set to 'calculating'. the slave is responsible for requesting the jobData. Server should wait some timeout until he redistributes the job
+ Job AquireJob(Guid slaveId);
+
+ //[OperationContract] // dump?
+ //Job GetJobByIdWithDetails(Guid jobId);
+
+ //[OperationContract] dump?
+ //Job AddNewJob(JobData job);
+
+ //[OperationContract]
+ //void RemoveJob(Guid jobId);
+
+ //[OperationContract] // GetJobForCalculation (was this used?
+ //Job GetJob(Guid slaveId);
+
+ //[OperationContract] --> replaced by UpdateJob
+ //void StoreFinishedJobResult(Guid slaveId, Guid jobId, byte[] result, TimeSpan executionTime, string exception);
+
+ //[OperationContract] dump this! a slave should just check if job is still offline, if so it can submit the finished job, otherwise throw away! its a rare case that a slave reawakes with a finished job
+ //void IsJobStillNeeded(Guid jobId);
+
+ //[OperationContract] // dump?
+ //Job AddJobWithGroupStrings(JobData jobObj, IEnumerable groups);
+ #endregion
+
+
+ #region Job Control Methods
+ [OperationContract]
+ void AbortJob(Guid jobId);
+
+ [OperationContract]
+ Job PauseJob(Guid jobId);
+ #endregion
+
+ #region HiveExperiment Methods
+ [OperationContract]
+ HiveExperiment GetHiveExperiment(Guid id);
+
+ ///
+ /// Returns all experiments for the current user
+ ///
+ [OperationContract]
+ IEnumerable GetHiveExperiments();
+
+ [OperationContract]
+ Guid AddHiveExperiment(HiveExperiment hiveExperimentDto);
+
+ [OperationContract]
+ void UpdateHiveExperiment(HiveExperiment hiveExperimentDto);
+
+ [OperationContract]
+ void DeleteHiveExperiment(Guid hiveExperimentId);
+ #endregion
+
+ #region Login Methods
+ // rename "Login"-methods to "Register" or "SayHello", since its only purpose is to send Slave-Info (is Login() should not be used anymore)
+ ///
+ /// Method can be used to check if security credentials are valid, but it does not do anything
+ ///
+ ///
+ //[OperationContract]
+ //void Login();
+ /////
+ ///// This method registers the slave and marks it as online
+ /////
+ //[OperationContract]
+ //void Login(Slave slave);
+ //[OperationContract]
+ //void Logout(Guid clientId);
+ #endregion
+
+ #region Heartbeat Methods
+ [OperationContract]
+ List ProcessHeartbeat(Heartbeat heartbeat);
+ #endregion
+
+ #region Plugin Methods
+ [OperationContract]
+ IEnumerable GetPluginDatas(List pluginIds);
+ [OperationContract]
+ Stream GetStreamedPluginDatas(List pluginIds);
+ [OperationContract]
+ IEnumerable GetAvailablePlugins();
+ [OperationContract]
+ Guid AddPlugin(Plugin plugin, List pluginData);
+ #endregion
+
+ #region Calendar Methods
+ [OperationContract]
+ IEnumerable GetCalendar(Guid slaveId);
+ [OperationContract]
+ void SetCalendarStatus(Guid clientId, CalendarState state);
+ [OperationContract]
+ IEnumerable GetUptimeCalendarForResource(Guid guid);
+ [OperationContract]
+ void SetUptimeCalendarForResource(Guid guid, IEnumerable appointments, bool isForced);
+ #endregion
+
+ #region Slave Methods
+ [OperationContract]
+ Guid AddSlave(Slave slave);
+
+ [OperationContract]
+ Guid AddSlaveGroup(SlaveGroup slaveGroup);
+
+ [OperationContract]
+ IEnumerable GetSlaves();
+
+ [OperationContract]
+ //[ServiceKnownType(typeof(Resource))] - not sure about those
+ //[ServiceKnownType(typeof(Slave))]
+ //[ServiceKnownType(typeof(SlaveGroup))]
+ IEnumerable GetSlaveGroups();
+
+ [OperationContract]
+ void DeleteSlaveGroup(Guid clientGroupId);
+
+ [OperationContract]
+ //[ServiceKnownType(typeof(Resource))]
+ //[ServiceKnownType(typeof(Slave))]
+ //[ServiceKnownType(typeof(SlaveGroup))]
+ void AddResourceToGroup(Guid slaveGroupId, Resource resource);
+
+ [OperationContract]
+ void RemoveResourceFromGroup(Guid slaveGroupId, Guid resourceId);
+
+ [OperationContract]
+ void UpdateSlave(Slave slave);
+ #endregion
+
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/Convert.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/Convert.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/Convert.cs (revision 5050)
@@ -0,0 +1,199 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see .
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
+using System;
+
+namespace HeuristicLab.Services.Hive.DataAccess {
+ public static class Convert {
+ #region Job
+ public static DT.Job ToDto(Job source) {
+ if (source == null) return null;
+ return new DT.Job {
+ Id = source.JobId,
+ CoresNeeded = source.CoresNeeded,
+ DateCalculated = source.DateCalculated,
+ DateCreated = source.DateCreated,
+ DateFinished = source.DateFinished,
+ Exception = source.Exception,
+ ExecutionTime = source.ExecutionTime,
+ MemoryNeeded = source.MemoryNeeded,
+ ParentJobId = source.ParentJobId,
+ Priority = source.Priority,
+ ProjectId = source.ProjectId,
+ SlaveId = source.SlaveId,
+ JobState = source.JobState,
+ UserId = source.UserId,
+ PluginsNeededIds = source.RequiredPlugins.Select(x => x.PluginId).ToList()
+ };
+ }
+ public static Job ToEntity(DT.Job source) {
+ if (source == null) return null;
+ var entity = new Job(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.Job source, Job target) {
+ if ((source != null) && (target != null)) {
+ target.JobId = source.Id;
+ target.CoresNeeded = source.CoresNeeded;
+ target.DateCalculated = source.DateCalculated;
+ target.DateCreated = source.DateCreated;
+ target.DateFinished = source.DateFinished;
+ target.Exception = source.Exception;
+ target.ExecutionTime = source.ExecutionTime;
+ target.MemoryNeeded = source.MemoryNeeded;
+ target.ParentJobId = source.ParentJobId;
+ target.Priority = source.Priority;
+ target.ProjectId = source.ProjectId;
+ target.SlaveId = source.SlaveId;
+ target.JobState = source.JobState;
+ target.UserId = source.UserId;
+// target.RequiredPlugins = db.Plugins.Select(x => source.PluginsNeededIds.Contains(x.PluginId)); - this is difficult
+ }
+ }
+ #endregion
+
+ #region JobData
+ public static DT.JobData ToDto(JobData source) {
+ if (source == null) return null;
+ return new DT.JobData { JobId = source.JobId, Data = source.Data.ToArray() };
+ }
+ public static JobData ToEntity(DT.JobData source) {
+ if (source == null) return null;
+ var entity = new JobData(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.JobData source, JobData target) {
+ if ((source != null) && (target != null)) {
+ target.JobId = source.JobId; target.Data = new Binary(source.Data);
+ }
+ }
+ #endregion
+
+ #region HiveExperiment
+ public static DT.HiveExperiment ToDto(HiveExperiment source) {
+ if (source == null) return null;
+ return new DT.HiveExperiment { Id = source.HiveExperimentId, Description = source.Description, Name = source.Name, RootJobId = source.RootJobId, UserId = source.UserId };
+ }
+ public static HiveExperiment ToEntity(DT.HiveExperiment source) {
+ if (source == null) return null;
+ var entity = new HiveExperiment(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.HiveExperiment source, HiveExperiment target) {
+ if ((source != null) && (target != null)) {
+ target.HiveExperimentId = source.Id; target.Description = source.Description; target.Name = source.Name; target.RootJobId = source.RootJobId; target.UserId = source.UserId;
+ }
+ }
+ #endregion
+
+ #region Plugin
+ public static DT.Plugin ToDto(Plugin source) {
+ if (source == null) return null;
+ return new DT.Plugin { Id = source.PluginId, Name = source.Name, Version = new Version(source.Version) };
+ }
+ public static Plugin ToEntity(DT.Plugin source) {
+ if (source == null) return null;
+ var entity = new Plugin(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.Plugin source, Plugin target) {
+ if ((source != null) && (target != null)) {
+ target.PluginId = source.Id; target.Name = source.Name; target.Version = source.Version.ToString();
+ }
+ }
+ #endregion
+
+ #region PluginData
+ public static DT.PluginData ToDto(PluginData source) {
+ if (source == null) return null;
+ return new DT.PluginData { PluginId = source.PluginId, Data = source.Data.ToArray() };
+ }
+ public static PluginData ToEntity(DT.PluginData source) {
+ if (source == null) return null;
+ var entity = new PluginData(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.PluginData source, PluginData target) {
+ if ((source != null) && (target != null)) {
+ target.PluginId = source.PluginId; target.Data = new Binary(source.Data);
+ }
+ }
+ #endregion
+
+ #region Slave
+ public static DT.Slave ToDto(Slave source) {
+ if (source == null) return null;
+ return new DT.Slave { Id = source.ResourceId, CalendarSyncState = source.CalendarSyncState, Cores = source.Cores, CpuSpeed = source.CpuSpeed, FreeCores = source.FreeCores, FreeMemory = source.FreeMemory, IsAllowedToCalculate = source.IsAllowedToCalculate, Memory = source.Memory, Name = source.Name, SlaveConfigId = source.SlaveConfigId, SlaveState = source.SlaveState };
+ }
+ public static Slave ToEntity(DT.Slave source) {
+ if (source == null) return null;
+ var entity = new Slave(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.Slave source, Slave target) {
+ if ((source != null) && (target != null)) {
+ target.ResourceId = source.Id; target.CalendarSyncState = source.CalendarSyncState; target.Cores = source.Cores; target.CpuSpeed = source.CpuSpeed; target.FreeCores = source.FreeCores; target.FreeMemory = source.FreeMemory; target.IsAllowedToCalculate = source.IsAllowedToCalculate; target.Memory = source.Memory; target.Name = source.Name; target.SlaveConfigId = source.SlaveConfigId; target.SlaveState = source.SlaveState;
+ }
+ }
+ #endregion
+
+ #region SlaveGroup
+ public static DT.SlaveGroup ToDto(SlaveGroup source) {
+ if (source == null) return null;
+ return new DT.SlaveGroup { Id = source.ResourceId, Name = source.Name, ChildResourcesIds = source.SlaveGroup_Resources_Children.Select(x => x.ResourceId).ToList(), ParentResourcesIds = source.SlaveGroup_Resources_Parents.Select(x => x.ResourceId).ToList() };
+ }
+ public static SlaveGroup ToEntity(DT.SlaveGroup source) {
+ if (source == null) return null;
+ var entity = new SlaveGroup(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.SlaveGroup source, SlaveGroup target) {
+ if ((source != null) && (target != null)) {
+ target.ResourceId = source.Id;
+ target.Name = source.Name;
+ //target.SlaveGroup_Resources_Children = // TODO: see how working with groups will work, then decide how to handle enumerations in here
+ //target.SlaveGroup_Resources_Parents =
+ }
+ }
+ #endregion
+
+ #region Resource
+ public static DT.Resource ToDto(Resource source) {
+ if (source == null) return null;
+ return new DT.Resource { Id = source.ResourceId, Name = source.Name };
+ }
+ public static Resource ToEntity(DT.Resource source) {
+ if (source == null) return null;
+ var entity = new Resource(); ToEntity(source, entity);
+ return entity;
+ }
+ public static void ToEntity(DT.Resource source, Resource target) {
+ if ((source != null) && (target != null)) {
+ target.ResourceId = source.Id; target.Name = source.Name;
+ }
+ }
+ #endregion
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLab.Services.Hive.DataAccess-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLab.Services.Hive.DataAccess-3.4.csproj (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLab.Services.Hive.DataAccess-3.4.csproj (revision 5050)
@@ -0,0 +1,143 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}
+ Library
+ Properties
+ HeuristicLab.Services.Hive.DataAccess
+ HeuristicLab.Services.Hive.DataAccess-3.4
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+
+
+ HeuristicLab.snk
+
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll
+
+
+ ..\..\..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll
+
+
+ False
+ ..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Tracing-3.3.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HiveDataContext.dbml
+
+
+ True
+ True
+ HiveDataContext.dbml
+
+
+
+
+
+ True
+ True
+ Settings.settings
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+ MSLinqToSQLGenerator
+ HiveDataContext.designer.cs
+ Designer
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+ HiveDataContext.dbml
+
+
+
+
+ {14424A16-48D4-445E-80BF-DDF617548BBB}
+ HeuristicLab.Services.Hive.Common-3.3
+
+
+
+
+
+
+
+
+ set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd
+
+
+ set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLabServicesHiveDataAccessPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLabServicesHiveDataAccessPlugin.cs.frame (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HeuristicLabServicesHiveDataAccessPlugin.cs.frame (revision 5050)
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Services.Hive.DataAccess {
+ [Plugin("HeuristicLab.Services.Hive.DataAccess", "3.4.0.$WCREV$")]
+ [PluginFile("HeuristicLab.Services.Hive.DataAccess-3.4.dll", PluginFileType.Assembly)]
+ [PluginDependency("HeuristicLab.Common", "3.3")]
+ [PluginDependency("HeuristicLab.Core", "3.3")]
+ [PluginDependency("HeuristicLab.Persistence", "3.3")]
+ public class HeuristicLabServicesHiveDataAccessPlugin : PluginBase {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDao.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDao.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDao.cs (revision 5050)
@@ -0,0 +1,380 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Linq.Expressions;
+
+namespace HeuristicLab.Services.Hive.DataAccess {
+ using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
+ using HeuristicLab.Services.Hive.Common.DataTransfer;
+ using HeuristicLab.Services.Hive.DataAccess.Properties;
+
+ public class HiveDao : IHiveDao {
+ public static HiveDataContext CreateContext() {
+ return new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
+ }
+
+ public HiveDao() {
+ }
+
+ #region Job Methods
+ public DT.Job GetJob(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.Jobs.SingleOrDefault(x => x.JobId == id));
+ }
+ }
+
+ public IEnumerable GetJobs(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.Jobs.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddJob(DT.Job dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.Jobs.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.JobId;
+ }
+ }
+
+ public void UpdateJob(DT.Job dto) {
+ using (var db = CreateContext()) {
+ var entity = db.Jobs.FirstOrDefault(x => x.JobId == dto.Id);
+ if (entity == null) db.Jobs.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeleteJob(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.Jobs.FirstOrDefault(x => x.JobId == id);
+ if (entity != null) db.Jobs.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public IEnumerable GetAvailableParentJobs(Guid slaveId) {
+ using (var db = CreateContext()) {
+ // todo: slaveId is unused!
+ var query = from ar in db.AssignedResources
+ where ar.Job.JobState == JobState.WaitingForChildJobs &&
+ (from child in db.Jobs
+ where child.ParentJobId == ar.Job.JobId
+ select child.JobState == JobState.Finished).All(x => x) &&
+ (from child in db.Jobs // avoid returning WaitForChildJobs jobs where no child-jobs exist (yet)
+ where child.ParentJobId == ar.Job.JobId
+ select child).Count() > 0
+ orderby ar.Job.Priority descending
+ select Convert.ToDto(ar.Job);
+ return query;
+ }
+ }
+
+ public IEnumerable GetWaitingJobs(DT.Slave slave) {
+ using (var db = CreateContext()) {
+ var query = from j in db.Jobs
+ where j.JobState == JobState.Waiting && j.CoresNeeded <= slave.FreeCores && j.MemoryNeeded <= slave.FreeMemory
+ orderby j.Priority descending
+ select Convert.ToDto(j);
+ return query.Union(GetAvailableParentJobs(slave.Id)).OrderByDescending(x => x.Priority).ToArray();
+ }
+ }
+ #endregion
+
+ #region JobData Methods
+
+ public DT.JobData GetJobData(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.JobDatas.SingleOrDefault(x => x.JobId == id));
+ }
+ }
+
+ public IEnumerable GetJobDatas(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.JobDatas.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddJobData(DT.JobData dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.JobDatas.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.JobId;
+ }
+ }
+
+ public void UpdateJobData(DT.JobData dto) {
+ using (var db = CreateContext()) {
+ var entity = db.JobDatas.FirstOrDefault(x => x.JobId == dto.JobId);
+ if (entity == null) db.JobDatas.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeleteJobData(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.JobDatas.FirstOrDefault(x => x.JobId == id); // check if all the byte[] is loaded into memory here. otherwise work around to delete without loading it
+ if (entity != null) db.JobDatas.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region HiveExperiment Methods
+ public DT.HiveExperiment GetHiveExperiment(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.HiveExperiments.SingleOrDefault(x => x.HiveExperimentId == id));
+ }
+ }
+
+ public IEnumerable GetHiveExperiments(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.HiveExperiments.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddHiveExperiment(DT.HiveExperiment dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.HiveExperiments.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.HiveExperimentId;
+ }
+ }
+
+ public void UpdateHiveExperiment(DT.HiveExperiment dto) {
+ using (var db = CreateContext()) {
+ var entity = db.HiveExperiments.FirstOrDefault(x => x.HiveExperimentId == dto.Id);
+ if (entity == null) db.HiveExperiments.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeleteHiveExperiment(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.HiveExperiments.FirstOrDefault(x => x.HiveExperimentId == id);
+ if (entity != null) db.HiveExperiments.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region Plugin Methods
+ public DT.Plugin GetPlugin(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.Plugins.SingleOrDefault(x => x.PluginId == id));
+ }
+ }
+
+ public IEnumerable GetPlugins(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.Plugins.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddPlugin(DT.Plugin dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.Plugins.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.PluginId;
+ }
+ }
+
+ public void UpdatePlugin(DT.Plugin dto) {
+ using (var db = CreateContext()) {
+ var entity = db.Plugins.FirstOrDefault(x => x.PluginId == dto.Id);
+ if (entity == null) db.Plugins.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeletePlugin(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.Plugins.FirstOrDefault(x => x.PluginId == id);
+ if (entity != null) db.Plugins.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region PluginData Methods
+
+ public DT.PluginData GetPluginData(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.PluginDatas.SingleOrDefault(x => x.PluginId == id));
+ }
+ }
+
+ public IEnumerable GetPluginDatas(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.PluginDatas.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddPluginData(DT.PluginData dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.PluginDatas.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.PluginId;
+ }
+ }
+
+ public void UpdatePluginData(DT.PluginData dto) {
+ using (var db = CreateContext()) {
+ var entity = db.PluginDatas.FirstOrDefault(x => x.PluginId == dto.PluginId);
+ if (entity == null) db.PluginDatas.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeletePluginData(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.PluginDatas.FirstOrDefault(x => x.PluginId == id); // check if all the byte[] is loaded into memory here. otherwise work around to delete without loading it
+ if (entity != null) db.PluginDatas.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region Slave Methods
+ public DT.Slave GetSlave(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.Resources.OfType().SingleOrDefault(x => x.ResourceId == id));
+ }
+ }
+
+ public IEnumerable GetSlaves(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.Resources.OfType().Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddSlave(DT.Slave dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.Resources.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.ResourceId;
+ }
+ }
+
+ public void UpdateSlave(DT.Slave dto) {
+ using (var db = CreateContext()) {
+ var entity = db.Resources.OfType().FirstOrDefault(x => x.ResourceId == dto.Id);
+ if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeleteSlave(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.Resources.OfType().FirstOrDefault(x => x.ResourceId == id);
+ if (entity != null) db.Resources.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region SlaveGroup Methods
+ public DT.SlaveGroup GetSlaveGroup(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.Resources.OfType().SingleOrDefault(x => x.ResourceId == id));
+ }
+ }
+
+ public IEnumerable GetSlaveGroups(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.Resources.OfType().Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddSlaveGroup(DT.SlaveGroup dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.Resources.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.ResourceId;
+ }
+ }
+
+ public void UpdateSlaveGroup(DT.SlaveGroup dto) {
+ using (var db = CreateContext()) {
+ var entity = db.Resources.OfType().FirstOrDefault(x => x.ResourceId == dto.Id);
+ if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeleteSlaveGroup(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.Resources.OfType().FirstOrDefault(x => x.ResourceId == id);
+ if (entity != null) db.Resources.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region Resource Methods
+ public DT.Resource GetResource(Guid id) {
+ using (var db = CreateContext()) {
+ return Convert.ToDto(db.Resources.SingleOrDefault(x => x.ResourceId == id));
+ }
+ }
+
+ public IEnumerable GetResources(Expression> predicate) {
+ using (var db = CreateContext()) {
+ return db.Resources.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
+ }
+ }
+
+ public Guid AddResource(DT.Resource dto) {
+ using (var db = CreateContext()) {
+ var entity = Convert.ToEntity(dto);
+ db.Resources.InsertOnSubmit(entity);
+ db.SubmitChanges();
+ return entity.ResourceId;
+ }
+ }
+
+ public void UpdateResource(DT.Resource dto) {
+ using (var db = CreateContext()) {
+ var entity = db.Resources.FirstOrDefault(x => x.ResourceId == dto.Id);
+ if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
+ else Convert.ToEntity(dto, entity);
+ db.SubmitChanges();
+ }
+ }
+
+ public void DeleteResource(Guid id) {
+ using (var db = CreateContext()) {
+ var entity = db.Resources.FirstOrDefault(x => x.ResourceId == id);
+ if (entity != null) db.Resources.DeleteOnSubmit(entity);
+ db.SubmitChanges();
+ }
+ }
+ #endregion
+
+ #region Authorization Methods
+ public bool IsUserAuthorizedForJobs(Guid userId, params Guid[] jobIds) {
+ using (var db = CreateContext()) {
+ var userIds = from job in db.Jobs // this needs to be fast!
+ where jobIds.Contains(job.JobId)
+ select job.UserId;
+ return userIds.All(x => x == userId);
+ }
+ }
+ #endregion
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.cs (revision 5050)
@@ -0,0 +1,4 @@
+namespace HeuristicLab.Services.Hive.DataAccess {
+ partial class HiveDataContext {
+ }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.dbml
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.dbml (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.dbml (revision 5050)
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.dbml.layout
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.dbml.layout (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.dbml.layout (revision 5050)
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.designer.cs (revision 5050)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDataContext.designer.cs (revision 5050)
@@ -0,0 +1,3192 @@
+#pragma warning disable 1591
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.1
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Services.Hive.DataAccess
+{
+ using System.Data.Linq;
+ using System.Data.Linq.Mapping;
+ using System.Data;
+ using System.Collections.Generic;
+ using System.Reflection;
+ using System.Linq;
+ using System.Linq.Expressions;
+ using System.ComponentModel;
+ using System;
+
+
+ [global::System.Data.Linq.Mapping.DatabaseAttribute(Name="HeuristicLab.Hive")]
+ public partial class HiveDataContext : System.Data.Linq.DataContext
+ {
+
+ private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
+
+ #region Extensibility Method Definitions
+ partial void OnCreated();
+ partial void InsertAssignedResource(AssignedResource instance);
+ partial void UpdateAssignedResource(AssignedResource instance);
+ partial void DeleteAssignedResource(AssignedResource instance);
+ partial void InsertUptimeStatistic(UptimeStatistic instance);
+ partial void UpdateUptimeStatistic(UptimeStatistic instance);
+ partial void DeleteUptimeStatistic(UptimeStatistic instance);
+ partial void InsertSlaveConfig(SlaveConfig instance);
+ partial void UpdateSlaveConfig(SlaveConfig instance);
+ partial void DeleteSlaveConfig(SlaveConfig instance);
+ partial void InsertSlaveGroup_Resource(SlaveGroup_Resource instance);
+ partial void UpdateSlaveGroup_Resource(SlaveGroup_Resource instance);
+ partial void DeleteSlaveGroup_Resource(SlaveGroup_Resource instance);
+ partial void InsertPlugin(Plugin instance);
+ partial void UpdatePlugin(Plugin instance);
+ partial void DeletePlugin(Plugin instance);
+ partial void InsertProject(Project instance);
+ partial void UpdateProject(Project instance);
+ partial void DeleteProject(Project instance);
+ partial void InsertRequiredPlugin(RequiredPlugin instance);
+ partial void UpdateRequiredPlugin(RequiredPlugin instance);
+ partial void DeleteRequiredPlugin(RequiredPlugin instance);
+ partial void InsertResource(Resource instance);
+ partial void UpdateResource(Resource instance);
+ partial void DeleteResource(Resource instance);
+ partial void InsertJob(Job instance);
+ partial void UpdateJob(Job instance);
+ partial void DeleteJob(Job instance);
+ partial void InsertUptimeCalendar(UptimeCalendar instance);
+ partial void UpdateUptimeCalendar(UptimeCalendar instance);
+ partial void DeleteUptimeCalendar(UptimeCalendar instance);
+ partial void InsertHiveExperiment(HiveExperiment instance);
+ partial void UpdateHiveExperiment(HiveExperiment instance);
+ partial void DeleteHiveExperiment(HiveExperiment instance);
+ partial void InsertJobData(JobData instance);
+ partial void UpdateJobData(JobData instance);
+ partial void DeleteJobData(JobData instance);
+ #endregion
+
+ public HiveDataContext(string connection) :
+ base(connection, mappingSource)
+ {
+ OnCreated();
+ }
+
+ public HiveDataContext(System.Data.IDbConnection connection) :
+ base(connection, mappingSource)
+ {
+ OnCreated();
+ }
+
+ public HiveDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
+ base(connection, mappingSource)
+ {
+ OnCreated();
+ }
+
+ public HiveDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
+ base(connection, mappingSource)
+ {
+ OnCreated();
+ }
+
+ public System.Data.Linq.Table AssignedResources
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table UptimeStatistics
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table SlaveConfigs
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table SlaveGroup_Resources
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table Plugins
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table Projects
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table RequiredPlugins
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table Resources
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table Jobs
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table UptimeCalendars
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table HiveExperiments
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table JobDatas
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+
+ public System.Data.Linq.Table PluginDatas
+ {
+ get
+ {
+ return this.GetTable();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.AssignedResources")]
+ public partial class AssignedResource : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _ResourceId;
+
+ private System.Guid _JobId;
+
+ private System.Guid _AssignedRessourcesId;
+
+ private EntityRef _Resource;
+
+ private EntityRef _Job;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnResourceIdChanging(System.Guid value);
+ partial void OnResourceIdChanged();
+ partial void OnJobIdChanging(System.Guid value);
+ partial void OnJobIdChanged();
+ partial void OnAssignedRessourcesIdChanging(System.Guid value);
+ partial void OnAssignedRessourcesIdChanged();
+ #endregion
+
+ public AssignedResource()
+ {
+ this._Resource = default(EntityRef);
+ this._Job = default(EntityRef);
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ResourceId", DbType="UniqueIdentifier NOT NULL")]
+ public System.Guid ResourceId
+ {
+ get
+ {
+ return this._ResourceId;
+ }
+ set
+ {
+ if ((this._ResourceId != value))
+ {
+ if (this._Resource.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnResourceIdChanging(value);
+ this.SendPropertyChanging();
+ this._ResourceId = value;
+ this.SendPropertyChanged("ResourceId");
+ this.OnResourceIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_JobId", DbType="UniqueIdentifier NOT NULL")]
+ public System.Guid JobId
+ {
+ get
+ {
+ return this._JobId;
+ }
+ set
+ {
+ if ((this._JobId != value))
+ {
+ if (this._Job.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnJobIdChanging(value);
+ this.SendPropertyChanging();
+ this._JobId = value;
+ this.SendPropertyChanged("JobId");
+ this.OnJobIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_AssignedRessourcesId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+ public System.Guid AssignedRessourcesId
+ {
+ get
+ {
+ return this._AssignedRessourcesId;
+ }
+ set
+ {
+ if ((this._AssignedRessourcesId != value))
+ {
+ this.OnAssignedRessourcesIdChanging(value);
+ this.SendPropertyChanging();
+ this._AssignedRessourcesId = value;
+ this.SendPropertyChanged("AssignedRessourcesId");
+ this.OnAssignedRessourcesIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Resource_AssignedResource", Storage="_Resource", ThisKey="ResourceId", OtherKey="ResourceId", IsForeignKey=true, DeleteRule="CASCADE")]
+ public Resource Resource
+ {
+ get
+ {
+ return this._Resource.Entity;
+ }
+ set
+ {
+ Resource previousValue = this._Resource.Entity;
+ if (((previousValue != value)
+ || (this._Resource.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._Resource.Entity = null;
+ previousValue.AssignedResources.Remove(this);
+ }
+ this._Resource.Entity = value;
+ if ((value != null))
+ {
+ value.AssignedResources.Add(this);
+ this._ResourceId = value.ResourceId;
+ }
+ else
+ {
+ this._ResourceId = default(System.Guid);
+ }
+ this.SendPropertyChanged("Resource");
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Job_AssignedResource", Storage="_Job", ThisKey="JobId", OtherKey="JobId", IsForeignKey=true, DeleteRule="CASCADE")]
+ public Job Job
+ {
+ get
+ {
+ return this._Job.Entity;
+ }
+ set
+ {
+ Job previousValue = this._Job.Entity;
+ if (((previousValue != value)
+ || (this._Job.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._Job.Entity = null;
+ previousValue.AssignedResources.Remove(this);
+ }
+ this._Job.Entity = value;
+ if ((value != null))
+ {
+ value.AssignedResources.Add(this);
+ this._JobId = value.JobId;
+ }
+ else
+ {
+ this._JobId = default(System.Guid);
+ }
+ this.SendPropertyChanged("Job");
+ }
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.UptimeStatistics")]
+ public partial class UptimeStatistic : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _UptimeStatisticsId;
+
+ private System.DateTime _Login;
+
+ private System.DateTime _Logout;
+
+ private System.Guid _ResourceId;
+
+ private EntityRef _Slave;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnUptimeStatisticsIdChanging(System.Guid value);
+ partial void OnUptimeStatisticsIdChanged();
+ partial void OnLoginChanging(System.DateTime value);
+ partial void OnLoginChanged();
+ partial void OnLogoutChanging(System.DateTime value);
+ partial void OnLogoutChanged();
+ partial void OnResourceIdChanging(System.Guid value);
+ partial void OnResourceIdChanged();
+ #endregion
+
+ public UptimeStatistic()
+ {
+ this._Slave = default(EntityRef);
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UptimeStatisticsId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+ public System.Guid UptimeStatisticsId
+ {
+ get
+ {
+ return this._UptimeStatisticsId;
+ }
+ set
+ {
+ if ((this._UptimeStatisticsId != value))
+ {
+ this.OnUptimeStatisticsIdChanging(value);
+ this.SendPropertyChanging();
+ this._UptimeStatisticsId = value;
+ this.SendPropertyChanged("UptimeStatisticsId");
+ this.OnUptimeStatisticsIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Login", DbType="DateTime")]
+ public System.DateTime Login
+ {
+ get
+ {
+ return this._Login;
+ }
+ set
+ {
+ if ((this._Login != value))
+ {
+ this.OnLoginChanging(value);
+ this.SendPropertyChanging();
+ this._Login = value;
+ this.SendPropertyChanged("Login");
+ this.OnLoginChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Logout", DbType="DateTime")]
+ public System.DateTime Logout
+ {
+ get
+ {
+ return this._Logout;
+ }
+ set
+ {
+ if ((this._Logout != value))
+ {
+ this.OnLogoutChanging(value);
+ this.SendPropertyChanging();
+ this._Logout = value;
+ this.SendPropertyChanged("Logout");
+ this.OnLogoutChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ResourceId", DbType="UniqueIdentifier")]
+ public System.Guid ResourceId
+ {
+ get
+ {
+ return this._ResourceId;
+ }
+ set
+ {
+ if ((this._ResourceId != value))
+ {
+ if (this._Slave.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnResourceIdChanging(value);
+ this.SendPropertyChanging();
+ this._ResourceId = value;
+ this.SendPropertyChanged("ResourceId");
+ this.OnResourceIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Slave_UptimeStatistic", Storage="_Slave", ThisKey="ResourceId", OtherKey="ResourceId", IsForeignKey=true, DeleteRule="SET NULL")]
+ public Slave Slave
+ {
+ get
+ {
+ return this._Slave.Entity;
+ }
+ set
+ {
+ Slave previousValue = this._Slave.Entity;
+ if (((previousValue != value)
+ || (this._Slave.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._Slave.Entity = null;
+ previousValue.UptimeStatistics.Remove(this);
+ }
+ this._Slave.Entity = value;
+ if ((value != null))
+ {
+ value.UptimeStatistics.Add(this);
+ this._ResourceId = value.ResourceId;
+ }
+ else
+ {
+ this._ResourceId = default(System.Guid);
+ }
+ this.SendPropertyChanged("Slave");
+ }
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.SlaveConfig")]
+ public partial class SlaveConfig : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _SlaveConfigId;
+
+ private System.Xml.Linq.XElement _UpDownTimeCalendar;
+
+ private System.Nullable _HeartBeatIntervall;
+
+ private EntitySet _Slaves;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnSlaveConfigIdChanging(System.Guid value);
+ partial void OnSlaveConfigIdChanged();
+ partial void OnUpDownTimeCalendarChanging(System.Xml.Linq.XElement value);
+ partial void OnUpDownTimeCalendarChanged();
+ partial void OnHeartBeatIntervallChanging(System.Nullable value);
+ partial void OnHeartBeatIntervallChanged();
+ #endregion
+
+ public SlaveConfig()
+ {
+ this._Slaves = new EntitySet(new Action(this.attach_Slaves), new Action(this.detach_Slaves));
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_SlaveConfigId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+ public System.Guid SlaveConfigId
+ {
+ get
+ {
+ return this._SlaveConfigId;
+ }
+ set
+ {
+ if ((this._SlaveConfigId != value))
+ {
+ this.OnSlaveConfigIdChanging(value);
+ this.SendPropertyChanging();
+ this._SlaveConfigId = value;
+ this.SendPropertyChanged("SlaveConfigId");
+ this.OnSlaveConfigIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UpDownTimeCalendar", DbType="Xml", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+ public System.Xml.Linq.XElement UpDownTimeCalendar
+ {
+ get
+ {
+ return this._UpDownTimeCalendar;
+ }
+ set
+ {
+ if ((this._UpDownTimeCalendar != value))
+ {
+ this.OnUpDownTimeCalendarChanging(value);
+ this.SendPropertyChanging();
+ this._UpDownTimeCalendar = value;
+ this.SendPropertyChanged("UpDownTimeCalendar");
+ this.OnUpDownTimeCalendarChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_HeartBeatIntervall", DbType="Int")]
+ public System.Nullable HeartBeatIntervall
+ {
+ get
+ {
+ return this._HeartBeatIntervall;
+ }
+ set
+ {
+ if ((this._HeartBeatIntervall != value))
+ {
+ this.OnHeartBeatIntervallChanging(value);
+ this.SendPropertyChanging();
+ this._HeartBeatIntervall = value;
+ this.SendPropertyChanged("HeartBeatIntervall");
+ this.OnHeartBeatIntervallChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="SlaveConfig_Slave", Storage="_Slaves", ThisKey="SlaveConfigId", OtherKey="SlaveConfigId")]
+ public EntitySet Slaves
+ {
+ get
+ {
+ return this._Slaves;
+ }
+ set
+ {
+ this._Slaves.Assign(value);
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ private void attach_Slaves(Slave entity)
+ {
+ this.SendPropertyChanging();
+ entity.SlaveConfig = this;
+ }
+
+ private void detach_Slaves(Slave entity)
+ {
+ this.SendPropertyChanging();
+ entity.SlaveConfig = null;
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.SlaveGroup_Resource")]
+ public partial class SlaveGroup_Resource : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _SlaveGroup_RessourceId;
+
+ private System.Guid _SlaveGroupId;
+
+ private System.Guid _ResourceId;
+
+ private EntityRef _SlaveGroup;
+
+ private EntityRef _Resource;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnSlaveGroup_RessourceIdChanging(System.Guid value);
+ partial void OnSlaveGroup_RessourceIdChanged();
+ partial void OnSlaveGroupIdChanging(System.Guid value);
+ partial void OnSlaveGroupIdChanged();
+ partial void OnResourceIdChanging(System.Guid value);
+ partial void OnResourceIdChanged();
+ #endregion
+
+ public SlaveGroup_Resource()
+ {
+ this._SlaveGroup = default(EntityRef);
+ this._Resource = default(EntityRef);
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_SlaveGroup_RessourceId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+ public System.Guid SlaveGroup_RessourceId
+ {
+ get
+ {
+ return this._SlaveGroup_RessourceId;
+ }
+ set
+ {
+ if ((this._SlaveGroup_RessourceId != value))
+ {
+ this.OnSlaveGroup_RessourceIdChanging(value);
+ this.SendPropertyChanging();
+ this._SlaveGroup_RessourceId = value;
+ this.SendPropertyChanged("SlaveGroup_RessourceId");
+ this.OnSlaveGroup_RessourceIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_SlaveGroupId", DbType="UniqueIdentifier NOT NULL")]
+ public System.Guid SlaveGroupId
+ {
+ get
+ {
+ return this._SlaveGroupId;
+ }
+ set
+ {
+ if ((this._SlaveGroupId != value))
+ {
+ if (this._SlaveGroup.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnSlaveGroupIdChanging(value);
+ this.SendPropertyChanging();
+ this._SlaveGroupId = value;
+ this.SendPropertyChanged("SlaveGroupId");
+ this.OnSlaveGroupIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ResourceId", DbType="UniqueIdentifier NOT NULL")]
+ public System.Guid ResourceId
+ {
+ get
+ {
+ return this._ResourceId;
+ }
+ set
+ {
+ if ((this._ResourceId != value))
+ {
+ if (this._Resource.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnResourceIdChanging(value);
+ this.SendPropertyChanging();
+ this._ResourceId = value;
+ this.SendPropertyChanged("ResourceId");
+ this.OnResourceIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="SlaveGroup_SlaveGroup_Resource", Storage="_SlaveGroup", ThisKey="SlaveGroupId", OtherKey="ResourceId", IsForeignKey=true)]
+ public SlaveGroup SlaveGroup
+ {
+ get
+ {
+ return this._SlaveGroup.Entity;
+ }
+ set
+ {
+ SlaveGroup previousValue = this._SlaveGroup.Entity;
+ if (((previousValue != value)
+ || (this._SlaveGroup.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._SlaveGroup.Entity = null;
+ previousValue.SlaveGroup_Resources_Children.Remove(this);
+ }
+ this._SlaveGroup.Entity = value;
+ if ((value != null))
+ {
+ value.SlaveGroup_Resources_Children.Add(this);
+ this._SlaveGroupId = value.ResourceId;
+ }
+ else
+ {
+ this._SlaveGroupId = default(System.Guid);
+ }
+ this.SendPropertyChanged("SlaveGroup");
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Resource_SlaveGroup_Resource", Storage="_Resource", ThisKey="ResourceId", OtherKey="ResourceId", IsForeignKey=true, DeleteRule="CASCADE")]
+ public Resource Resource
+ {
+ get
+ {
+ return this._Resource.Entity;
+ }
+ set
+ {
+ Resource previousValue = this._Resource.Entity;
+ if (((previousValue != value)
+ || (this._Resource.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._Resource.Entity = null;
+ previousValue.SlaveGroup_Resources_Parents.Remove(this);
+ }
+ this._Resource.Entity = value;
+ if ((value != null))
+ {
+ value.SlaveGroup_Resources_Parents.Add(this);
+ this._ResourceId = value.ResourceId;
+ }
+ else
+ {
+ this._ResourceId = default(System.Guid);
+ }
+ this.SendPropertyChanged("Resource");
+ }
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Plugin")]
+ public partial class Plugin : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _PluginId;
+
+ private string _Name;
+
+ private string _Version;
+
+ private EntitySet _RequiredPlugins;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnPluginIdChanging(System.Guid value);
+ partial void OnPluginIdChanged();
+ partial void OnNameChanging(string value);
+ partial void OnNameChanged();
+ partial void OnVersionChanging(string value);
+ partial void OnVersionChanged();
+ #endregion
+
+ public Plugin()
+ {
+ this._RequiredPlugins = new EntitySet(new Action(this.attach_RequiredPlugins), new Action(this.detach_RequiredPlugins));
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_PluginId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+ public System.Guid PluginId
+ {
+ get
+ {
+ return this._PluginId;
+ }
+ set
+ {
+ if ((this._PluginId != value))
+ {
+ this.OnPluginIdChanging(value);
+ this.SendPropertyChanging();
+ this._PluginId = value;
+ this.SendPropertyChanged("PluginId");
+ this.OnPluginIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="VarChar(MAX)", CanBeNull=false)]
+ public string Name
+ {
+ get
+ {
+ return this._Name;
+ }
+ set
+ {
+ if ((this._Name != value))
+ {
+ this.OnNameChanging(value);
+ this.SendPropertyChanging();
+ this._Name = value;
+ this.SendPropertyChanged("Name");
+ this.OnNameChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Version", DbType="VarChar(MAX)", CanBeNull=false)]
+ public string Version
+ {
+ get
+ {
+ return this._Version;
+ }
+ set
+ {
+ if ((this._Version != value))
+ {
+ this.OnVersionChanging(value);
+ this.SendPropertyChanging();
+ this._Version = value;
+ this.SendPropertyChanged("Version");
+ this.OnVersionChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Plugin_RequiredPlugin", Storage="_RequiredPlugins", ThisKey="PluginId", OtherKey="PluginId")]
+ public EntitySet RequiredPlugins
+ {
+ get
+ {
+ return this._RequiredPlugins;
+ }
+ set
+ {
+ this._RequiredPlugins.Assign(value);
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ private void attach_RequiredPlugins(RequiredPlugin entity)
+ {
+ this.SendPropertyChanging();
+ entity.Plugin = this;
+ }
+
+ private void detach_RequiredPlugins(RequiredPlugin entity)
+ {
+ this.SendPropertyChanging();
+ entity.Plugin = null;
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Project")]
+ public partial class Project : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _ProjectId;
+
+ private string _Name;
+
+ private EntitySet _Jobs;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnProjectIdChanging(System.Guid value);
+ partial void OnProjectIdChanged();
+ partial void OnNameChanging(string value);
+ partial void OnNameChanged();
+ #endregion
+
+ public Project()
+ {
+ this._Jobs = new EntitySet(new Action(this.attach_Jobs), new Action(this.detach_Jobs));
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ProjectId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true)]
+ public System.Guid ProjectId
+ {
+ get
+ {
+ return this._ProjectId;
+ }
+ set
+ {
+ if ((this._ProjectId != value))
+ {
+ this.OnProjectIdChanging(value);
+ this.SendPropertyChanging();
+ this._ProjectId = value;
+ this.SendPropertyChanged("ProjectId");
+ this.OnProjectIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="VarChar(MAX)", CanBeNull=false)]
+ public string Name
+ {
+ get
+ {
+ return this._Name;
+ }
+ set
+ {
+ if ((this._Name != value))
+ {
+ this.OnNameChanging(value);
+ this.SendPropertyChanging();
+ this._Name = value;
+ this.SendPropertyChanged("Name");
+ this.OnNameChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Project_Job", Storage="_Jobs", ThisKey="ProjectId", OtherKey="ProjectId")]
+ public EntitySet Jobs
+ {
+ get
+ {
+ return this._Jobs;
+ }
+ set
+ {
+ this._Jobs.Assign(value);
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
+ private void attach_Jobs(Job entity)
+ {
+ this.SendPropertyChanging();
+ entity.Project = this;
+ }
+
+ private void detach_Jobs(Job entity)
+ {
+ this.SendPropertyChanging();
+ entity.Project = null;
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.RequiredPlugins")]
+ public partial class RequiredPlugin : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ private System.Guid _RequiredPluginId;
+
+ private System.Guid _JobId;
+
+ private System.Guid _PluginId;
+
+ private EntityRef _PluginInfo;
+
+ private EntityRef _Job;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnRequiredPluginIdChanging(System.Guid value);
+ partial void OnRequiredPluginIdChanged();
+ partial void OnJobIdChanging(System.Guid value);
+ partial void OnJobIdChanged();
+ partial void OnPluginIdChanging(System.Guid value);
+ partial void OnPluginIdChanged();
+ #endregion
+
+ public RequiredPlugin()
+ {
+ this._PluginInfo = default(EntityRef);
+ this._Job = default(EntityRef);
+ OnCreated();
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_RequiredPluginId", AutoSync=AutoSync.OnInsert, DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
+ public System.Guid RequiredPluginId
+ {
+ get
+ {
+ return this._RequiredPluginId;
+ }
+ set
+ {
+ if ((this._RequiredPluginId != value))
+ {
+ this.OnRequiredPluginIdChanging(value);
+ this.SendPropertyChanging();
+ this._RequiredPluginId = value;
+ this.SendPropertyChanged("RequiredPluginId");
+ this.OnRequiredPluginIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_JobId", DbType="UniqueIdentifier NOT NULL")]
+ public System.Guid JobId
+ {
+ get
+ {
+ return this._JobId;
+ }
+ set
+ {
+ if ((this._JobId != value))
+ {
+ if (this._Job.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnJobIdChanging(value);
+ this.SendPropertyChanging();
+ this._JobId = value;
+ this.SendPropertyChanged("JobId");
+ this.OnJobIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_PluginId", DbType="UniqueIdentifier NOT NULL")]
+ public System.Guid PluginId
+ {
+ get
+ {
+ return this._PluginId;
+ }
+ set
+ {
+ if ((this._PluginId != value))
+ {
+ if (this._PluginInfo.HasLoadedOrAssignedValue)
+ {
+ throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+ }
+ this.OnPluginIdChanging(value);
+ this.SendPropertyChanging();
+ this._PluginId = value;
+ this.SendPropertyChanged("PluginId");
+ this.OnPluginIdChanged();
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Plugin_RequiredPlugin", Storage="_PluginInfo", ThisKey="PluginId", OtherKey="PluginId", IsForeignKey=true, DeleteRule="CASCADE")]
+ public Plugin Plugin
+ {
+ get
+ {
+ return this._PluginInfo.Entity;
+ }
+ set
+ {
+ Plugin previousValue = this._PluginInfo.Entity;
+ if (((previousValue != value)
+ || (this._PluginInfo.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._PluginInfo.Entity = null;
+ previousValue.RequiredPlugins.Remove(this);
+ }
+ this._PluginInfo.Entity = value;
+ if ((value != null))
+ {
+ value.RequiredPlugins.Add(this);
+ this._PluginId = value.PluginId;
+ }
+ else
+ {
+ this._PluginId = default(System.Guid);
+ }
+ this.SendPropertyChanged("Plugin");
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Job_RequiredPlugin", Storage="_Job", ThisKey="JobId", OtherKey="JobId", IsForeignKey=true)]
+ public Job Job
+ {
+ get
+ {
+ return this._Job.Entity;
+ }
+ set
+ {
+ Job previousValue = this._Job.Entity;
+ if (((previousValue != value)
+ || (this._Job.HasLoadedOrAssignedValue == false)))
+ {
+ this.SendPropertyChanging();
+ if ((previousValue != null))
+ {
+ this._Job.Entity = null;
+ previousValue.RequiredPlugins.Remove(this);
+ }
+ this._Job.Entity = value;
+ if ((value != null))
+ {
+ value.RequiredPlugins.Add(this);
+ this._JobId = value.JobId;
+ }
+ else
+ {
+ this._JobId = default(System.Guid);
+ }
+ this.SendPropertyChanged("Job");
+ }
+ }
+ }
+
+ public event PropertyChangingEventHandler PropertyChanging;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void SendPropertyChanging()
+ {
+ if ((this.PropertyChanging != null))
+ {
+ this.PropertyChanging(this, emptyChangingEventArgs);
+ }
+ }
+
+ protected virtual void SendPropertyChanged(String propertyName)
+ {
+ if ((this.PropertyChanged != null))
+ {
+ this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+ }
+
+ [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Resource")]
+ [global::System.Data.Linq.Mapping.InheritanceMappingAttribute(Code="RESOURCE", Type=typeof(Resource))]
+ [global::System.Data.Linq.Mapping.InheritanceMappingAttribute(Code="Slave", Type=typeof(Slave), IsDefault=true)]
+ [global::System.Data.Linq.Mapping.InheritanceMappingAttribute(Code="GROUP", Type=typeof(SlaveGroup))]
+ public partial class Resource : INotifyPropertyChanging, INotifyPropertyChanged
+ {
+
+ private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+
+ protected System.Guid _ResourceId;
+
+ private string _Name;
+
+ private string _ResourceType;
+
+ private EntitySet _AssignedResources;
+
+ private EntitySet _SlaveGroup_Resources_Parents;
+
+ private EntitySet _UptimeCalendars;
+
+ #region Extensibility Method Definitions
+ partial void OnLoaded();
+ partial void OnValidate(System.Data.Linq.ChangeAction action);
+ partial void OnCreated();
+ partial void OnResourceIdChanging(System.Guid value);
+ partial void OnResourceIdChanged();
+ partial void OnNameChanging(string value);
+ partial void OnNameChanged();
+ partial void OnResourceTypeChanging(string value);
+ partial void OnResourceTypeChanged();
+ #endregion
+
+ public Resource()
+ {
+ this._AssignedResources = new EntitySet(new Action(this.attach_AssignedResources), new Action