diff --git a/Duplicati.sln b/Duplicati.sln
index 6719e81e5..fad895c86 100644
--- a/Duplicati.sln
+++ b/Duplicati.sln
@@ -55,11 +55,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.S
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.GoogleDocs", "Duplicati\Library\Backend\GoogleDocs\Duplicati.Library.Backend.GoogleDocs.csproj", "{42C91180-11EB-4590-82EA-80FE9D4DEBEC}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Scheduler.Data", "Duplicati\Scheduler\Data\Duplicati.Scheduler.Data.csproj", "{C8F0DD19-E242-4E9C-A707-2FFADE8D7970}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Scheduler", "Duplicati\Scheduler\Duplicati.Scheduler.csproj", "{D1D503E8-5CF7-413B-81FB-403D65B43AAB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utility", "Utility\Utility.csproj", "{0E3DF716-5657-4B51-9BF2-3791880930E1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.RunBackup", "Duplicati\RunBackup\Duplicati.RunBackup.csproj", "{520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}"
+EndProject
Global
- GlobalSection(SubversionScc) = preSolution
- Svn-Managed = True
- Manager = AnkhSVN - Subversion Support for Visual Studio
- EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
@@ -527,8 +531,72 @@ Global
{42C91180-11EB-4590-82EA-80FE9D4DEBEC}.Test|Mixed Platforms.ActiveCfg = Release|Any CPU
{42C91180-11EB-4590-82EA-80FE9D4DEBEC}.Test|Mixed Platforms.Build.0 = Release|Any CPU
{42C91180-11EB-4590-82EA-80FE9D4DEBEC}.Test|x86.ActiveCfg = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Release|x86.ActiveCfg = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Test|Any CPU.ActiveCfg = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Test|Any CPU.Build.0 = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Test|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Test|Mixed Platforms.Build.0 = Release|Any CPU
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}.Test|x86.ActiveCfg = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Release|x86.ActiveCfg = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Test|Any CPU.ActiveCfg = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Test|Any CPU.Build.0 = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Test|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Test|Mixed Platforms.Build.0 = Release|Any CPU
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}.Test|x86.ActiveCfg = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Release|x86.ActiveCfg = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Test|Any CPU.ActiveCfg = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Test|Any CPU.Build.0 = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Test|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Test|Mixed Platforms.Build.0 = Release|Any CPU
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}.Test|x86.ActiveCfg = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Release|x86.ActiveCfg = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Test|Any CPU.ActiveCfg = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Test|Any CPU.Build.0 = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Test|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Test|Mixed Platforms.Build.0 = Release|Any CPU
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}.Test|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(SubversionScc) = preSolution
+ Svn-Managed = True
+ Manager = AnkhSVN - Subversion Support for Visual Studio
+ EndGlobalSection
EndGlobal
diff --git a/Duplicati/RunBackup/AppendLog.cs b/Duplicati/RunBackup/AppendLog.cs
new file mode 100644
index 000000000..201b3a34d
--- /dev/null
+++ b/Duplicati/RunBackup/AppendLog.cs
@@ -0,0 +1,170 @@
+#region Disclaimer / License
+// Copyright (C) 2011, Kenneth Skovhede
+// http://www.hexad.dk, opensource@hexad.dk
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+//
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Linq;
+using System.Text;
+
+namespace Duplicati.Library.Logging
+{
+ ///
+ /// Writes log messages to a file, file is opened, appended and closed each write
+ ///
+ public class AppendLog : ILog, IDisposable
+ {
+ // Using a colon followed by a ETX will make this easier to parse, yet still readable
+ public static string Separator = ":" + (char)3;
+ // Use the round-trip date formatter
+ public const string DateFormat = "o";
+ // The name of the file
+ public string LogFileName { get; set; }
+ // Just a little extra to put in the messages
+ private string itsNote = string.Empty;
+ ///
+ /// Constructs a new log destination, writing to the Log database
+ ///
+ /// The file to write to
+ public AppendLog(string aFileName, string aNote)
+ {
+ LogFileName = aFileName;
+ itsNote = aNote;
+ }
+ ///
+ /// Returns a DateTime given a log date or DateTime.MaxValue if can not parse
+ ///
+ /// Log date
+ /// DateTime or DateTime.MaxValue if can not parse
+ public static DateTime ParseLogDate(string aLogDate)
+ {
+ DateTime Result = DateTime.MaxValue;
+ DateTime.TryParse(aLogDate, null, System.Globalization.DateTimeStyles.RoundtripKind, out Result);
+ return Result;
+ }
+ ///
+ /// Represents a log entry as a class
+ ///
+ public class LogEntry
+ {
+ public DateTime Date { get; set; }
+ public string Job { get; set; }
+ public Duplicati.Library.Logging.LogMessageType Type { get; set; }
+ public string Message { get; set; }
+ public string ExMessage { get; set; }
+ public LogEntry(string aLine)
+ {
+ string[] Parts = aLine.Split(new string[] { Duplicati.Library.Logging.AppendLog.Separator }, StringSplitOptions.None);
+ if (Parts.Length < 5) return;
+ Date = Duplicati.Library.Logging.AppendLog.ParseLogDate(Parts[0]);
+ Job = Parts[1];
+ Type = (Duplicati.Library.Logging.LogMessageType)System.Enum.Parse(typeof(Duplicati.Library.Logging.LogMessageType), Parts[2]);
+ Message = Parts[3];
+ ExMessage = Parts[4];
+ }
+ }
+ ///
+ /// Convert a log file into a XML
+ ///
+ /// Log file name
+ /// XML text
+ public static string LogFileToXML(string aLogFile)
+ {
+ var Parser = from string Line in System.IO.File.ReadAllLines(aLogFile) select new LogEntry(Line);
+ System.Xml.Linq.XElement XML = new System.Xml.Linq.XElement("Log",
+ from LogEntry qL in Parser
+ select new System.Xml.Linq.XElement("Log",
+ new System.Xml.Linq.XAttribute("File", System.IO.Path.GetFileName(aLogFile)),
+ new System.Xml.Linq.XElement("Date", qL.Date),
+ new System.Xml.Linq.XElement("Job", qL.Job),
+ new System.Xml.Linq.XElement("Type", qL.Type),
+ new System.Xml.Linq.XElement("Message", qL.Message),
+ new System.Xml.Linq.XElement("ExMessage", qL.ExMessage)
+ ));
+ return XML.ToString();
+ }
+ ///
+ /// A bindable list of log entries
+ ///
+ public class LogList : System.ComponentModel.BindingList
+ {
+ public LogList(string[] aContents)
+ : base((from string qS in aContents select new Duplicati.Library.Logging.AppendLog.LogEntry(qS)).ToArray())
+ {
+ }
+ }
+ #region ILog Members
+ ///
+ /// The function called when a message is logged
+ ///
+ /// The message logged
+ /// The type of message logged
+ /// An exception, may be null
+ public virtual void WriteMessage(string aMessage, Duplicati.Library.Logging.LogMessageType aType, Exception aException)
+ {
+ // Never, I don't care what
+ if (aType == LogMessageType.Profiling) return;
+ if (aMessage.Contains("is partial from byte offset")) return; // Silly message confuses users
+ // Multiple messages may be sent separated by newline
+ foreach(string Line in aMessage.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
+ {
+ string Message = string.Join(Separator, new string[]
+ {
+ DateTime.Now.ToString(DateFormat),
+ itsNote,
+ aType.ToString(),
+ Line,
+ aException == null ? string.Empty : aException.ToString()
+ });
+ bool OK = false;
+ try
+ {
+ System.IO.File.AppendAllText(LogFileName, Message + "\r\n"); // Just for notepad...
+ OK = true;
+ }
+ catch (Exception Ex)
+ {
+ Console.WriteLine(LogFileName+":"+Ex.ToString());
+ }
+ if (!OK)
+ Console.WriteLine(Message);
+ }
+ if (EventLogged != null) EventLogged(aMessage, aType, aException);
+ }
+
+ ///
+ /// An event that is raised when a message is logged
+ ///
+ public event EventLoggedDelgate EventLogged;
+
+ #endregion
+
+ #region IDisposable Members
+
+ ///
+ /// Frees up all internally held resources
+ ///
+ public void Dispose()
+ {
+ }
+
+ #endregion
+ }
+}
diff --git a/Duplicati/RunBackup/Duplicati.RunBackup.csproj b/Duplicati/RunBackup/Duplicati.RunBackup.csproj
new file mode 100644
index 000000000..6f8244ae7
--- /dev/null
+++ b/Duplicati/RunBackup/Duplicati.RunBackup.csproj
@@ -0,0 +1,174 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}
+ WinExe
+ Properties
+ Duplicati.RunBackup
+ Duplicati.RunBackup
+ v3.5
+ 512
+ Duplicati.RunBackup.Program
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Backend.File.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Backend.FTP.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Compression.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.DynamicLoader.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Logging.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Main.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Utility.dll
+
+
+
+ 3.5
+
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+ True
+ True
+ Settings.settings
+
+
+
+
+
+
+
+
+
+ Notifier.cs
+
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+ False
+ .NET Framework Client Profile
+ false
+
+
+ False
+ .NET Framework 2.0 %28x86%29
+ false
+
+
+ False
+ .NET Framework 3.0 %28x86%29
+ false
+
+
+ False
+ .NET Framework 3.5
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ true
+
+
+ False
+ SQL Server Compact 3.5
+ true
+
+
+ False
+ Windows Installer 3.1
+ true
+
+
+
+
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}
+ Utility
+
+
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}
+ Duplicati.Scheduler.Data
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/RunBackup/Duplicati.RunBackup.csproj.user b/Duplicati/RunBackup/Duplicati.RunBackup.csproj.user
new file mode 100644
index 000000000..6823ec93a
--- /dev/null
+++ b/Duplicati/RunBackup/Duplicati.RunBackup.csproj.user
@@ -0,0 +1,21 @@
+
+
+ test DryRun
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ en-US
+ false
+
+
\ No newline at end of file
diff --git a/Duplicati/RunBackup/Notifier.cs b/Duplicati/RunBackup/Notifier.cs
new file mode 100644
index 000000000..cb4390cc9
--- /dev/null
+++ b/Duplicati/RunBackup/Notifier.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.RunBackup
+{
+ ///
+ /// Put that pesky little icon in the system tray
+ ///
+ public partial class Notifier : IDisposable
+ {
+ private System.Windows.Forms.NotifyIcon itsNotifyIcon;
+ public Notifier()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Notifier));
+ itsNotifyIcon = new System.Windows.Forms.NotifyIcon()
+ {
+ Icon = ((System.Drawing.Icon)(resources.GetObject("NotifyIcon.Icon"))),
+ Text = "Backup",
+ Visible = true,
+ };
+ itsNotifyIcon.Click += new EventHandler(itsNotifyIcon_Click);
+ }
+
+ void itsNotifyIcon_Click(object sender, EventArgs e)
+ {
+ }
+
+ public void Dispose()
+ {
+ itsNotifyIcon.Visible = false; // Dern thing will not die.
+ itsNotifyIcon.Dispose();
+ }
+ }
+}
diff --git a/Duplicati/RunBackup/Notifier.resx b/Duplicati/RunBackup/Notifier.resx
new file mode 100644
index 000000000..c0db9e23e
--- /dev/null
+++ b/Duplicati/RunBackup/Notifier.resx
@@ -0,0 +1,627 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/RunBackup/Options.cs b/Duplicati/RunBackup/Options.cs
new file mode 100644
index 000000000..04ff25cf2
--- /dev/null
+++ b/Duplicati/RunBackup/Options.cs
@@ -0,0 +1,163 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+
+namespace Duplicati.RunBackup
+{
+ ///
+ /// Manipulate Options to be Duplicati ready
+ ///
+ public class Options : Dictionary
+ {
+ ///
+ /// The backup destination
+ ///
+ public string Target { get; set; }
+ ///
+ /// The backup source URI
+ ///
+ public string[] Source { get; set; }
+ ///
+ /// How long to keep log files (==0 = forever)
+ ///
+ public int LogFileMaxAgeDays { get; set; }
+ ///
+ /// Is this backup 'full', false = 'incremental'
+ ///
+ public bool Full { get; set; }
+ ///
+ /// Results from attempted mapping of network drives
+ ///
+ public string MapResults { get; set; }
+ ///
+ /// The Checksum
+ ///
+ public byte[] Checksum { get; private set; }
+ ///
+ /// CheckMod
+ ///
+ public string CheckMod { get; private set; }
+ ///
+ /// Parse Options ready for Duplicati backup run
+ ///
+ /// Job name
+ /// Job database XML file name
+ public Options(string aJob, string aXML)
+ {
+ // Get options from XML
+ using (Duplicati.Scheduler.Data.SchedulerDataSet sds = new Duplicati.Scheduler.Data.SchedulerDataSet())
+ {
+ // Let this throw...
+ Exception Ex = sds.Load(aXML); // Load database from XML
+ if (Ex != null) Library.Logging.Log.WriteMessage(aXML + ":" + Ex.Message, Duplicati.Library.Logging.LogMessageType.Error);
+ // Find the job
+ Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow Row = sds.Jobs.FindByName(aJob);
+ if (Row == null) throw new ArgumentException("No such job: " + aJob);
+ // Get source, destination, options
+ Target = Row.Destination;
+ Source = Row.Source.Split(System.IO.Path.PathSeparator);
+ foreach (KeyValuePair kvp in sds.Jobs.GetOptions(aJob))
+ this.Add(kvp.Key, kvp.Value);
+ // Get that log limit
+ LogFileMaxAgeDays = sds.Settings.Values.LogFileAgeDays;
+ // Look for the log file
+ if (this.ContainsKey("log-file"))
+ this.Remove("log-file");
+ // Map network drives
+ if (Row.MapDrives)
+ {
+ foreach (Duplicati.Scheduler.Data.SchedulerDataSet.DriveMapsRow dRow in Row.GetDriveMapsRows())
+ {
+ System.IO.DriveInfo di = new System.IO.DriveInfo(dRow.DriveLetter);
+ if (di != null && !di.IsReady)
+ MapResults += Utility.User.Run("net.exe", "use " + di.Name + ' ' + dRow.UNC) + '\n';
+ }
+ }
+ // Take care of the filters
+ if (!string.IsNullOrEmpty(Row.Filter))
+ this["filter"] = ProcessFilter(Row.Filter);
+ this["full-if-sourcefolder-changed"] = true.ToString();
+ // OK, deal with the 'FULL'
+ if (this.ContainsKey("full"))
+ Full = bool.Parse(this["full"]);
+ else if (Row.FullOnly || (Row.FullRepeatDays <= 0 && Row.FullAfterN <= 0))
+ Full = true;
+ else
+ Full = IsFull(aJob, Row.FullAfterN, Row.FullRepeatDays);
+ this["full"] = Full.ToString();
+ this["full-if-sourcefolder-changed"] = true.ToString();
+ if (this.ContainsKey("Destination")) this.Remove("Destination");
+ if (Row.MaxAgeDays > 0)
+ this["delete-older-than"] = Row.MaxAgeDays.ToString() + 'd';
+ if (Row.MaxFulls > 0)
+ this["delete-all-but-n-full"] = Row.MaxFulls.ToString();
+ if (Row.AutoCleanup || Row.MaxAgeDays > 0 || Row.MaxFulls > 0)
+ {
+ this["auto-cleanup"] = true.ToString();
+ this["force"] = true.ToString();
+ }
+ this["encryption-module"] = this.CheckMod = Row.CheckMod;
+ if (!this.ContainsKey("volsize")) this["volsize"] = "50MB";
+ }
+ this["log-level"] = Duplicati.Library.Logging.Log.LogLevel.ToString(); // Don't mess with the log level.
+ // uh hmmm
+ if (this.ContainsKey("Checksum"))
+ {
+ Checksum = System.Convert.FromBase64String(this["Checksum"]);
+ // Unprotect will only work if process is the same user as it was protected; which this one should be.
+ this["passphrase"] = System.Text.ASCIIEncoding.ASCII.GetString(Utility.Tools.Unprotect(this.Checksum));
+ this.Remove("Checksum");
+ }
+ }
+ ///
+ /// Determine if this is a full backup by looking back
+ ///
+ ///
+ /// This looks in the history database at the last full backup for this job.
+ /// If that date is older than the aRepeatDays parameter, then the backup is full.
+ /// If not and the aNumberRuns parameter is zero, the backup is full
+ /// If not the backup is full if the number of runs since the last full run is greater than aNumberRuns
+ ///
+ /// Job name
+ /// The number of incremental runs before a full (0=infinate)
+ /// The number of days between full runs
+ /// true 'full', false = 'incremental'
+ public static bool IsFull(string aJob, int aNumberRuns, int aRepeatDays)
+ {
+ bool Result = true;
+ try
+ {
+ // Get the history file
+ Duplicati.Scheduler.Data.HistoryDataSet hds = new Duplicati.Scheduler.Data.HistoryDataSet();
+ hds.Load();
+ // Get the last full run
+ DateTime LastFull = hds.History.LastFull(aJob);
+ // If it is past the number of days, it is full
+ if (LastFull.AddDays(aRepeatDays) >= DateTime.Now) return true;
+ // Always full of NumberRuns == 0
+ if (aNumberRuns <= 0) return true;
+ // Otherwise if the number of incremental is greater than the number of runs...
+ return (hds.History.NumberSinceLastFull(aJob, LastFull) > aNumberRuns);
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex); // Ignore errors just return true
+ }
+ return Result;
+ }
+ ///
+ /// Turns filters in the "[+-]filter;..." format to Duplicati "[ei]:filter;..." format
+ ///
+ /// "[+-]filter;..." formatted filters
+ /// Duplicati "[ei]:filter;..." format filters
+ public static string ProcessFilter(string aFilterString)
+ {
+ return string.IsNullOrEmpty(aFilterString) ? string.Empty :
+ ("\0" + aFilterString) // Leading null is so 1st line will match
+ .Replace("\0-", System.IO.Path.PathSeparator.ToString() + "e:")
+ .Replace("\0+", System.IO.Path.PathSeparator.ToString() + "i:");
+ }
+
+ }
+}
diff --git a/Duplicati/RunBackup/Pipe.cs b/Duplicati/RunBackup/Pipe.cs
new file mode 100644
index 000000000..b79d0e1e7
--- /dev/null
+++ b/Duplicati/RunBackup/Pipe.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Diagnostics;
+
+namespace Duplicati.RunBackup
+{
+ public static class Pipe
+ {
+ // Use ETX as a seperator in the pipe, makes for easy parsing
+ public const char Separator = (char)3;
+ // This lock is probably not necessary... Locks the pipe
+ private static object Locker = new object();
+ // The Pipe
+ private static System.IO.Pipes.NamedPipeClientStream itsPipe = null;
+ // The Pipe's stream
+ private static System.IO.StreamWriter itsPipeWriter = null;
+ // Just pack up a PROGRESS command all ready for the service and send it out stdout.
+ // Try to connect to the named pipe server, if not, don't try again for 5 seconds.
+ public static void OperationProgress(Duplicati.Library.Main.Interface aCaller,
+ Duplicati.Library.Main.DuplicatiOperation aOperation,
+ Duplicati.Library.Main.DuplicatiOperationMode aSpecificOperation,
+ int aProgress, int aSubprogress, string aMessage, string aSubmessage)
+ {
+ // Progress has come, make sure the pipe is ready
+ if (itsPipe != null && itsPipeWriter != null && itsPipe.IsConnected)
+ {
+ try
+ {
+ lock (Locker)
+ {
+ // Package the event up into a null-terminated list for easy disassembly later
+ itsPipeWriter.WriteLine(string.Join(Separator.ToString(), new string[]
+ {
+ "PROGRESS", Program.Job, aOperation.ToString(), aSpecificOperation.ToString(),
+ aProgress.ToString(), aMessage, aSubprogress.ToString(), aSubmessage
+ }));
+ }
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ }
+ // A handy parser class
+ public class ProgressArguments
+ {
+ public bool OK = false;
+ public string Job { get; set; }
+ public string Operation { get; set; }
+ public string SpecificOperation { get; set; }
+ public string Caller { get; set; }
+ public int Progress { get; set; }
+ public int SubProgress { get; set; }
+ public string Message { get; set; }
+ public string SubMessage { get; set; }
+ public ProgressArguments(string aCommand)
+ {
+ string[] Parts = aCommand.Split(Separator);
+ if (Parts.Length != 8 && Parts[0] != "PROGRESS") return;
+ Job = Parts[1];
+ Operation = Parts[2];
+ SpecificOperation = Parts[3];
+ Progress = int.Parse(Parts[4]);
+ Message = Parts[5];
+ SubProgress = int.Parse(Parts[6]);
+ SubMessage = Parts[7];
+ OK = true;
+ }
+ }
+ // Just keep trying to connect (in the background).
+ public static void Connecter()
+ {
+ // I guess that makes this a "pipe thread".
+ new System.Threading.Thread(new System.Threading.ThreadStart(Thread)) { Name = Program.ClientThreadName, IsBackground = true }
+ .Start();
+ }
+ private static void Thread()
+ {
+ string PipeName = Utility.NamedPipeServerStream.MakePipeName(Program.PipeBaseName, Utility.User.UserName, System.IO.Pipes.PipeDirection.In);
+ while (true)
+ {
+ lock (Locker) itsPipe = new System.IO.Pipes.NamedPipeClientStream(".", PipeName, System.IO.Pipes.PipeDirection.Out);
+ Debug.WriteLine("Looking for out pipe: " + PipeName);
+ using (itsPipe)
+ {
+ try { itsPipe.Connect(5000); }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ Debug.WriteLine("Connected = " + itsPipe.IsConnected.ToString());
+ if (itsPipe.IsConnected)
+ {
+ using (itsPipeWriter = new System.IO.StreamWriter(itsPipe) { AutoFlush = true })
+ {
+ try
+ {
+ while (itsPipe.IsConnected)
+ System.Threading.Thread.Sleep(1000);
+ }
+ catch { } // It's a broken pipe...
+ }
+ }
+ // itsPipe.Close();
+ }
+ }
+ }
+ }
+}
diff --git a/Duplicati/RunBackup/Properties/AssemblyInfo.cs b/Duplicati/RunBackup/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..d91366da9
--- /dev/null
+++ b/Duplicati/RunBackup/Properties/AssemblyInfo.cs
@@ -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("Duplicati.RunBackup")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Duplicati.RunBackup")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[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("b6aa9aa5-b7ed-4cce-ba40-13960a7e5bcf")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Duplicati/RunBackup/Properties/Settings.Designer.cs b/Duplicati/RunBackup/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..6cb47f676
--- /dev/null
+++ b/Duplicati/RunBackup/Properties/Settings.Designer.cs
@@ -0,0 +1,56 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4961
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Duplicati.RunBackup.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+ internal 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.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
+ [global::System.Configuration.DefaultSettingValueAttribute("Data Source=kenb-PC\\SQLEXPRESS;Integrated Security=True")]
+ public string ConnectionString {
+ get {
+ return ((string)(this["ConnectionString"]));
+ }
+ }
+
+ [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
+ [global::System.Configuration.DefaultSettingValueAttribute("Data Source=kenb-PC\\SQLEXPRESS;Initial Catalog=model;Integrated Security=True")]
+ public string modelConnectionString {
+ get {
+ return ((string)(this["modelConnectionString"]));
+ }
+ }
+
+ [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
+ [global::System.Configuration.DefaultSettingValueAttribute("Data Source=kenb-PC\\SQLEXPRESS;Initial Catalog=Backups;Integrated Security=True")]
+ public string BackupsConnectionString {
+ get {
+ return ((string)(this["BackupsConnectionString"]));
+ }
+ }
+ }
+}
diff --git a/Duplicati/RunBackup/Properties/Settings.settings b/Duplicati/RunBackup/Properties/Settings.settings
new file mode 100644
index 000000000..7d8dc0ce6
--- /dev/null
+++ b/Duplicati/RunBackup/Properties/Settings.settings
@@ -0,0 +1,30 @@
+
+
+
+
+
+ <?xml version="1.0" encoding="utf-16"?>
+<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <ConnectionString>Data Source=kenb-PC\SQLEXPRESS;Integrated Security=True</ConnectionString>
+ <ProviderName>System.Data.SqlClient</ProviderName>
+</SerializableConnectionString>
+ Data Source=kenb-PC\SQLEXPRESS;Integrated Security=True
+
+
+ <?xml version="1.0" encoding="utf-16"?>
+<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <ConnectionString>Data Source=kenb-PC\SQLEXPRESS;Initial Catalog=model;Integrated Security=True</ConnectionString>
+ <ProviderName>System.Data.SqlClient</ProviderName>
+</SerializableConnectionString>
+ Data Source=kenb-PC\SQLEXPRESS;Initial Catalog=model;Integrated Security=True
+
+
+ <?xml version="1.0" encoding="utf-16"?>
+<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <ConnectionString>Data Source=kenb-PC\SQLEXPRESS;Initial Catalog=Backups;Integrated Security=True</ConnectionString>
+ <ProviderName>System.Data.SqlClient</ProviderName>
+</SerializableConnectionString>
+ Data Source=kenb-PC\SQLEXPRESS;Initial Catalog=Backups;Integrated Security=True
+
+
+
\ No newline at end of file
diff --git a/Duplicati/RunBackup/RunBackup.cs b/Duplicati/RunBackup/RunBackup.cs
new file mode 100644
index 000000000..e716fff1f
--- /dev/null
+++ b/Duplicati/RunBackup/RunBackup.cs
@@ -0,0 +1,203 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+
+[assembly: System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.RequestMinimum, Name = "FullTrust")]
+namespace Duplicati.RunBackup
+{
+ class Program
+ {
+ ///
+ /// The name of the mother package
+ ///
+ public const string Package = "Duplicati";
+ ///
+ /// Name of application
+ ///
+ public const string Name = "Duplicati.RunBackup";
+ ///
+ /// Root name of named pipe
+ ///
+ public const string PipeBaseName = "Duplicati.Pipe";
+ ///
+ /// Name of the Pipe client listener thread
+ ///
+ public const string ClientThreadName = "Duplicati.PipeClient";
+ ///
+ /// Name of this job
+ ///
+ public static string Job = "";
+ ///
+ /// If set via command line argument "DryRun", no backup is actually made; used for debug
+ ///
+ private static bool itsDryRun = false;
+ ///
+ /// This is basically a very small Duplicati command line that only supports backup.
+ /// This is a console app; but compiled with 'forms' to get rid of the dreaded console window in xp.
+ ///
+ /// Arguments are job name and XML file name
+ static void Main(string[] aArgs)
+ {
+ // Args as a handy list
+ List ArgList = new List(aArgs);
+#if DEBUGUSER
+ if (!Environment.UserInteractive)
+ System.Threading.Thread.Sleep(20000); // Give time to attach debugger
+ if (!Environment.UserName.EndsWith("\\User"))
+ {
+ // TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
+ Utility.Su.Impersonate("User", Environment.UserDomainName, "asd"); // TEST
+ Environment.SetEnvironmentVariable("TMP", "C:\\temp"); // TEST
+ }
+#endif
+ itsDryRun = ArgList.Contains("DryRun"); // Good for debugging
+ if(itsDryRun) ArgList.Remove("DryRun");
+ // The job name
+ Job = ArgList[0];
+ // Be nice
+ System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.BelowNormal;
+ // Get a log file
+ string LogFile = Utility.Tools.LogFileName(Package);
+ using (new Notifier()) // Attempt to put that little thingy in the tray
+ // Create the log
+ using (Duplicati.Library.Logging.AppendLog Log = new Duplicati.Library.Logging.AppendLog(LogFile, Job))
+ {
+ Duplicati.Library.Logging.Log.CurrentLog = Log;
+ // Hard code level to info, deal with filters in the forms level
+ Duplicati.Library.Logging.Log.LogLevel = Duplicati.Library.Logging.LogMessageType.Information;
+ try
+ {
+ // Load the history XML dataset
+ using (Duplicati.Scheduler.Data.HistoryDataSet hds = new Duplicati.Scheduler.Data.HistoryDataSet())
+ {
+ hds.Load();
+ // Create a new history record for this run
+ Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow HistoryRow = hds.History.AddHistoryRow(Job, DateTime.Now, "Backup", true, false, LogFile, new byte[0], string.Empty);
+ // Actually run the job
+ RunBackup(ArgList.ToArray(), HistoryRow);
+ // Just clean out history
+ foreach (Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow Row in
+ from Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow qR in hds.History
+ where !System.IO.File.Exists(qR.LogFileName) select qR)
+ Row.Delete();
+ hds.Save(); // Save the XML (later: make so the whole db need not be loaded (XMLReader)
+ }
+ }
+ catch (Exception Ex) // Log error
+ {
+ Library.Logging.Log.WriteMessage(Ex.Message, Duplicati.Library.Logging.LogMessageType.Error);
+ }
+#if TESTPHONEHOME
+ // Tell big brother
+ Exception phEx = Utility.Tools.TryCatch((Action)delegate() {
+ PhoneHome.Update.Scheduler();
+ PhoneHome.Update.History();
+ PhoneHome.Update.Log(System.IO.File.GetLastWriteTime(LogFile), Duplicati.Library.Logging.AppendLog.LogFileToXML(LogFile));
+ });
+ if (phEx != null)
+ Library.Logging.Log.WriteMessage("Update failed", Duplicati.Library.Logging.LogMessageType.Warning, phEx);
+#endif
+ }
+ // All done, set the log file (filewathers are looking for AttributeChange)
+ System.IO.File.SetAttributes(LogFile, System.IO.FileAttributes.ReadOnly);
+ }
+ private static bool RunBackup(string[] args, Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow aHistoryRow)
+ {
+ // Log the start
+ Library.Logging.Log.WriteMessage(Name + " " + String.Join(" ", args) + (itsDryRun ? " DryRun as" : " as ") + Utility.User.UserName,
+ Duplicati.Library.Logging.LogMessageType.Information);
+
+ // See if the XML file name was on the command line
+ string XML = (args.Length > 1) ? XML = args[1] : Duplicati.Scheduler.Data.SchedulerDataSet.DefaultPath();
+ // Convert our options to Duplicati options
+ Options BackupOptions = new Options(Job, XML);
+ // Complain about any results from the drive mapping
+ if (!string.IsNullOrEmpty(BackupOptions.MapResults))
+ Library.Logging.Log.WriteMessage(BackupOptions.MapResults, Duplicati.Library.Logging.LogMessageType.Information);
+
+ // Get the signature file temp
+ Duplicati.Library.Utility.TempFolder SigTemp = new Duplicati.Library.Utility.TempFolder();
+ string SigThingy = System.IO.Path.Combine(SigTemp, Duplicati.Scheduler.Data.SchedulerDataSet.DefaultName);
+ if (Utility.Tools.NoException((Action)delegate() { System.IO.File.Copy(Duplicati.Scheduler.Data.SchedulerDataSet.DefaultPath(), SigThingy); }))
+ BackupOptions["signature-control-files"] = SigThingy;
+
+ // See if there is a pipe server listening, if so, connect to it for progress messages
+ bool HasPipe = Utility.NamedPipeServerStream.ServerIsUp(
+ Utility.NamedPipeServerStream.MakePipeName(PipeBaseName, Utility.User.UserName, System.IO.Pipes.PipeDirection.In));
+ if (HasPipe) Pipe.Connecter();
+ // Run the dern thing already
+ string Result = "Not started";
+ bool OK = false;
+ if (itsDryRun)
+ {
+ OK = true;
+ Result = "DryRun";
+ if(HasPipe) TestProgress(5); // Just send fake progress
+ }
+ else
+ {
+ try
+ {
+ using (Duplicati.Library.Main.Interface i = new Duplicati.Library.Main.Interface(BackupOptions.Target, BackupOptions))
+ {
+ // Set our events if we have a pipe
+ if (HasPipe)
+ {
+ i.OperationProgress += new Duplicati.Library.Main.OperationProgressEvent(Pipe.OperationProgress);
+ i.OperationCompleted += new Duplicati.Library.Main.OperationProgressEvent(Pipe.OperationProgress);
+ }
+ Result = i.Backup(BackupOptions.Source);
+ }
+ OK = true;
+ }
+ catch (Exception Ex)
+ {
+ // Dang
+ Result = "Error: " + Ex.Message;
+ }
+ }
+ // Log the done.
+ Library.Logging.Log.WriteMessage("Finished: "+(OK?"OK":Result), OK ? Duplicati.Library.Logging.LogMessageType.Information : Duplicati.Library.Logging.LogMessageType.Error);
+ // Put deletions in the log, where they belong.
+ // Deleting backup at 07/06/2011 06:05:21
+ foreach(string Line in Result.Split('\n'))
+ if (Line.StartsWith("Deleting backup at "))
+ Library.Logging.Log.WriteMessage(Line, Duplicati.Library.Logging.LogMessageType.Information);
+ // OK, made it, update the history
+ aHistoryRow.Update("Backup", BackupOptions.Full, OK, Result, BackupOptions.Checksum, BackupOptions.CheckMod);
+ LimitLogFiles(BackupOptions.LogFileMaxAgeDays); // zero has no effect.
+ // woot
+ return OK;
+ }
+ ///
+ /// Delete old log files
+ ///
+ /// Number of days to keep logs (0=always)
+ private static void LimitLogFiles(int aMaxDays)
+ {
+ if (aMaxDays <= 0) return;
+ foreach (string Entry in System.IO.Directory.GetFiles(Utility.Tools.LogFileDirectory(Package), Utility.Tools.LogFileFilter))
+ {
+ if ((DateTime.Now - (new System.IO.FileInfo(Entry).LastWriteTime)).TotalDays > aMaxDays)
+ Utility.Tools.TryCatch((Action)delegate()
+ {
+ System.IO.File.SetAttributes(Entry, System.IO.FileAttributes.Normal);
+ System.IO.File.Delete(Entry);
+ });
+ }
+ }
+ private static void TestProgress(int aSeconds)
+ {
+ Job = "PipeTest";
+ Debug.WriteLine(Job);
+ for (int i = 0; i
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/AdvancedDialog.Designer.cs b/Duplicati/Scheduler/AdvancedDialog.Designer.cs
new file mode 100644
index 000000000..3fc0176a2
--- /dev/null
+++ b/Duplicati/Scheduler/AdvancedDialog.Designer.cs
@@ -0,0 +1,128 @@
+namespace Duplicati.Scheduler
+{
+ partial class AdvancedDialog
+ {
+ ///
+ /// 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 Windows Form 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(AdvancedDialog));
+ this.OrphanCheckBox = new System.Windows.Forms.CheckBox();
+ this.MapCheckBox = new System.Windows.Forms.CheckBox();
+ this.CanButton = new System.Windows.Forms.Button();
+ this.OKButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // OrphanCheckBox
+ //
+ this.OrphanCheckBox.AutoSize = true;
+ this.OrphanCheckBox.Checked = true;
+ this.OrphanCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.OrphanCheckBox.Location = new System.Drawing.Point(13, 28);
+ this.OrphanCheckBox.Name = "OrphanCheckBox";
+ this.OrphanCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.OrphanCheckBox.TabIndex = 0;
+ this.OrphanCheckBox.UseVisualStyleBackColor = true;
+ //
+ // MapCheckBox
+ //
+ this.MapCheckBox.AutoSize = true;
+ this.MapCheckBox.Checked = true;
+ this.MapCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.MapCheckBox.Location = new System.Drawing.Point(13, 82);
+ this.MapCheckBox.Name = "MapCheckBox";
+ this.MapCheckBox.Size = new System.Drawing.Size(305, 23);
+ this.MapCheckBox.TabIndex = 2;
+ this.MapCheckBox.Text = "Map network drives when backups run.";
+ this.MapCheckBox.UseVisualStyleBackColor = true;
+ //
+ // CanButton
+ //
+ this.CanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CanButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CanButton.Location = new System.Drawing.Point(255, 134);
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(75, 31);
+ this.CanButton.TabIndex = 3;
+ this.CanButton.Text = "Cancel";
+ this.CanButton.UseVisualStyleBackColor = true;
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // OKButton
+ //
+ this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OKButton.Location = new System.Drawing.Point(174, 134);
+ this.OKButton.Name = "OKButton";
+ this.OKButton.Size = new System.Drawing.Size(75, 31);
+ this.OKButton.TabIndex = 4;
+ this.OKButton.Text = "OK";
+ this.OKButton.UseVisualStyleBackColor = true;
+ this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(31, 25);
+ this.label1.MaximumSize = new System.Drawing.Size(320, 40);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(294, 38);
+ this.label1.TabIndex = 5;
+ this.label1.Text = "Remove incremental scans that have no corresponding full scan.";
+ //
+ // AdvancedDialog
+ //
+ this.AcceptButton = this.OKButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.Gainsboro;
+ this.CancelButton = this.CanButton;
+ this.ClientSize = new System.Drawing.Size(343, 169);
+ this.ControlBox = false;
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.OKButton);
+ this.Controls.Add(this.CanButton);
+ this.Controls.Add(this.MapCheckBox);
+ this.Controls.Add(this.OrphanCheckBox);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "AdvancedDialog";
+ this.Text = "Advanced";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.CheckBox OrphanCheckBox;
+ private System.Windows.Forms.CheckBox MapCheckBox;
+ private System.Windows.Forms.Button CanButton;
+ private System.Windows.Forms.Button OKButton;
+ private System.Windows.Forms.Label label1;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/AdvancedDialog.cs b/Duplicati/Scheduler/AdvancedDialog.cs
new file mode 100644
index 000000000..8ec0c4ae7
--- /dev/null
+++ b/Duplicati/Scheduler/AdvancedDialog.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// A dialog for lesser / weird settings
+ ///
+ public partial class AdvancedDialog : Form
+ {
+ private bool itsAutoDelete = true;
+ ///
+ /// delete unwanted files after each backup
+ ///
+ public bool AutoDelete { get { return itsAutoDelete; } set { itsAutoDelete = this.OrphanCheckBox.Checked = value; } }
+ private bool itsMap = true;
+ ///
+ /// Map networked drives before backup
+ ///
+ public bool Map { get { return itsMap; } set { itsMap = this.MapCheckBox.Checked = value; } }
+ ///
+ /// Creator
+ ///
+ public AdvancedDialog()
+ {
+ InitializeComponent();
+ }
+
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ itsAutoDelete = this.OrphanCheckBox.Checked;
+ itsMap = this.MapCheckBox.Checked;
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/AdvancedDialog.resx b/Duplicati/Scheduler/AdvancedDialog.resx
new file mode 100644
index 000000000..a3c9b8abc
--- /dev/null
+++ b/Duplicati/Scheduler/AdvancedDialog.resx
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/BackupListDialog.Designer.cs b/Duplicati/Scheduler/BackupListDialog.Designer.cs
new file mode 100644
index 000000000..0a56e9741
--- /dev/null
+++ b/Duplicati/Scheduler/BackupListDialog.Designer.cs
@@ -0,0 +1,134 @@
+namespace Duplicati.Scheduler
+{
+ partial class BackupListDialog
+ {
+ ///
+ /// 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 Windows Form 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(BackupListDialog));
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
+ this.ContentsToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
+ this.progressBar = new System.Windows.Forms.ProgressBar();
+ this.treeView1 = new System.Windows.Forms.TreeView();
+ this.toolStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripLabel1,
+ this.ContentsToolStripButton,
+ this.toolStripSeparator1,
+ this.toolStripLabel2});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.Size = new System.Drawing.Size(563, 25);
+ this.toolStrip1.TabIndex = 0;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // toolStripLabel1
+ //
+ this.toolStripLabel1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripLabel1.Name = "toolStripLabel1";
+ this.toolStripLabel1.Size = new System.Drawing.Size(86, 22);
+ this.toolStripLabel1.Text = "toolStripLabel1";
+ //
+ // ContentsToolStripButton
+ //
+ this.ContentsToolStripButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("ContentsToolStripButton.BackgroundImage")));
+ this.ContentsToolStripButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.ContentsToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.ContentsToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("ContentsToolStripButton.Image")));
+ this.ContentsToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.ContentsToolStripButton.Name = "ContentsToolStripButton";
+ this.ContentsToolStripButton.Size = new System.Drawing.Size(92, 22);
+ this.ContentsToolStripButton.Text = " List Contents ";
+ this.ContentsToolStripButton.Click += new System.EventHandler(this.ContentsToolStripButton_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+ //
+ // toolStripLabel2
+ //
+ this.toolStripLabel2.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripLabel2.Name = "toolStripLabel2";
+ this.toolStripLabel2.Size = new System.Drawing.Size(86, 22);
+ this.toolStripLabel2.Text = "toolStripLabel2";
+ //
+ // progressBar
+ //
+ this.progressBar.Location = new System.Drawing.Point(12, 130);
+ this.progressBar.Name = "progressBar";
+ this.progressBar.Size = new System.Drawing.Size(517, 23);
+ this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+ this.progressBar.TabIndex = 3;
+ //
+ // treeView1
+ //
+ this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.treeView1.Location = new System.Drawing.Point(0, 25);
+ this.treeView1.Name = "treeView1";
+ this.treeView1.Size = new System.Drawing.Size(563, 275);
+ this.treeView1.TabIndex = 4;
+ //
+ // BackupListDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(563, 300);
+ this.Controls.Add(this.treeView1);
+ this.Controls.Add(this.progressBar);
+ this.Controls.Add(this.toolStrip1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "BackupListDialog";
+ this.Text = "Backup files";
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.ToolStripLabel toolStripLabel1;
+ private System.Windows.Forms.ToolStripButton ContentsToolStripButton;
+ private System.Windows.Forms.ProgressBar progressBar;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripLabel toolStripLabel2;
+ private System.Windows.Forms.TreeView treeView1;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/BackupListDialog.cs b/Duplicati/Scheduler/BackupListDialog.cs
new file mode 100644
index 000000000..5c80477cb
--- /dev/null
+++ b/Duplicati/Scheduler/BackupListDialog.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ public partial class BackupListDialog : Form
+ {
+ private string itsURI;
+ private Dictionary itsOptions;
+ ///
+ /// Shows a list of backups. Allows selection and file listing
+ ///
+ /// Job name
+ /// Source
+ /// Used by Duplicati
+ public BackupListDialog(string aName, string aURI, Dictionary aOptions)
+ {
+ InitializeComponent();
+ itsURI = aURI;
+ itsOptions = aOptions;
+ this.toolStripLabel1.Text = aURI;
+ this.toolStripLabel2.Text = aName;
+ this.progressBar.Visible = true;
+ this.progressBar.BringToFront();
+ this.treeView1.TreeViewNodeSorter = new NodeSorter();
+ }
+ ///
+ /// Initialize list
+ ///
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+ MakeList();
+ }
+ ///
+ /// Create new node with backup type and date
+ ///
+ private TreeNode NewNode(Duplicati.Library.Main.ManifestEntry aEntry)
+ {
+ TreeNode Result = new TreeNode((aEntry.IsFull ? "Full: " : "Inc: ") + aEntry.Time.ToString("ddd MM/dd/yyyy hh:mm tt"));
+ Result.Tag = aEntry;
+ return Result;
+ }
+ ///
+ /// Creates the display
+ ///
+ private void MakeList()
+ {
+ this.ContentsToolStripButton.Enabled = false;
+ this.Cursor = Cursors.WaitCursor;
+ this.progressBar.Visible = true;
+ this.progressBar.Style = ProgressBarStyle.Marquee;
+ List Result = null;
+ // Get the list. Background runs task as separate thread, continues to call DoEvents until finished
+ Utility.Tools.Background((Action)
+ delegate()
+ {
+ using (Duplicati.Library.Main.Interface i = new Duplicati.Library.Main.Interface(itsURI, itsOptions))
+ Result = i.GetBackupSets();
+ });
+ // Make the tree
+ this.treeView1.BeginUpdate();
+ foreach (Duplicati.Library.Main.ManifestEntry M in Result)
+ {
+ TreeNode N = NewNode(M);
+ N.Nodes.AddRange((from Duplicati.Library.Main.ManifestEntry Mi in M.Incrementals select NewNode(Mi)).ToArray());
+ this.treeView1.Nodes.Add(N);
+ }
+ this.treeView1.Sort();
+ this.treeView1.EndUpdate();
+ this.progressBar.Visible = false;
+ this.ContentsToolStripButton.Enabled = true;
+ this.Cursor = Cursors.Default;
+ }
+ ///
+ /// User selected a backup, list the files
+ ///
+ private void ContentsToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (this.treeView1.Nodes.Count == 0) return;
+ itsOptions["restore-time"] = ((this.treeView1.SelectedNode == null) ? DateTime.Now :
+ ((Duplicati.Library.Main.ManifestEntry)this.treeView1.SelectedNode.Tag).Time).ToString("s"); // should be "o"
+ FileListDialog fld = new FileListDialog(this.toolStripLabel2.Text, itsURI, itsOptions);
+ fld.ShowDialog();
+ }
+ }
+ ///
+ /// Create a node sorter that implements the IComparer interface.
+ ///
+ public class NodeSorter : System.Collections.IComparer
+ {
+ // Sort by backup time
+ public int Compare(object x, object y)
+ {
+ TreeNode tx = x as TreeNode;
+ TreeNode ty = y as TreeNode;
+ return DateTime.Compare(((Duplicati.Library.Main.ManifestEntry)tx.Tag).Time, ((Duplicati.Library.Main.ManifestEntry)ty.Tag).Time);
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/BackupListDialog.resx b/Duplicati/Scheduler/BackupListDialog.resx
new file mode 100644
index 000000000..18ac587f9
--- /dev/null
+++ b/Duplicati/Scheduler/BackupListDialog.resx
@@ -0,0 +1,655 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYNJREFUSEvV1r1K
+ w1AYxvFzFd6Bd+EFiOCod6AggiA4KKKTOugiWHCu4qA4ObiVFqQV/KjY2qRp0ybVpEm/bD7bDg2Pnpaq
+ KIHqkFMDf8iU98d7hhxSLMgQuCz4pzS49N9LJW8xbF/n0LnZTKZnoBZCX6Q8j9XQKcZnt0AmVgJtbHoT
+ 8zthyEUBYl4EoTqKmdk4QuyhgKCfjKT3Zq+FzvoboiC6mWhSDNryMS+azPcMpZICQs+QHhN9PM9jEp1N
+ Daqq9zc0KqByuTJaIO07qNP1wKLBkf0AtdoeWOQLclwPLPIFGWYXLPIFVWouWOQLelENsMgXVJTqYJEv
+ SMhpYNH/AXG8Bhb5bij1qIBFvqD7OwksGoB0rUp/rhzorS16fYNEnGfSZSTSM9SqDZBcVsDcdhhTywe4
+ iFwFDool4phc2sfC7jGaTROkIEpQnmWsH54zu1Mv7p3ANBuwTBukJCsov9/U6rVXGIYFy3Jg27+v0+5g
+ 2D6/78JxXLhuC47tQlV0vAH+hUZFnK9GkQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/Duplicati.Scheduler.Data.csproj b/Duplicati/Scheduler/Data/Duplicati.Scheduler.Data.csproj
new file mode 100644
index 000000000..41294d396
--- /dev/null
+++ b/Duplicati/Scheduler/Data/Duplicati.Scheduler.Data.csproj
@@ -0,0 +1,112 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}
+ Library
+ Properties
+ Duplicati.Scheduler.Data
+ Duplicati.Scheduled.Data
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+ 3.5
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+ True
+ True
+ HistoryDataSet.xsd
+
+
+ Component
+
+
+ SchedulerDataSet.xsd
+ Component
+
+
+ Component
+
+
+
+ True
+ True
+ SchedulerDataSet.xsd
+
+
+
+
+
+ HistoryDataSet.xsd
+
+
+ Designer
+ MSDataSetGenerator
+ HistoryDataSet.Designer.cs
+
+
+ HistoryDataSet.xsd
+
+
+ SchedulerDataSet.xsd
+
+
+ Designer
+ MSDataSetGenerator
+ SchedulerDataSet.Designer.cs
+
+
+ SchedulerDataSet.xsd
+
+
+
+
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}
+ Utility
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/HistoryDataSet.Designer.cs b/Duplicati/Scheduler/Data/HistoryDataSet.Designer.cs
new file mode 100644
index 000000000..8de04b04f
--- /dev/null
+++ b/Duplicati/Scheduler/Data/HistoryDataSet.Designer.cs
@@ -0,0 +1,1844 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4961
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+#pragma warning disable 1591
+
+namespace Duplicati.Scheduler.Data {
+
+
+ ///
+ ///Represents a strongly typed in-memory cache of data.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.ComponentModel.DesignerCategoryAttribute("code")]
+ [global::System.ComponentModel.ToolboxItem(true)]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
+ [global::System.Xml.Serialization.XmlRootAttribute("HistoryDataSet")]
+ [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
+ public partial class HistoryDataSet : global::System.Data.DataSet {
+
+ private HistoryDataTable tableHistory;
+
+ private StatsDataTable tableStats;
+
+ private global::System.Data.DataRelation relationHistory_Stats;
+
+ private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryDataSet() {
+ this.BeginInit();
+ this.InitClass();
+ global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+ base.Tables.CollectionChanged += schemaChangedHandler;
+ base.Relations.CollectionChanged += schemaChangedHandler;
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected HistoryDataSet(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context, false) {
+ if ((this.IsBinarySerialized(info, context) == true)) {
+ this.InitVars(false);
+ global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+ this.Tables.CollectionChanged += schemaChangedHandler1;
+ this.Relations.CollectionChanged += schemaChangedHandler1;
+ return;
+ }
+ string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
+ if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+ global::System.Data.DataSet ds = new global::System.Data.DataSet();
+ ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+ if ((ds.Tables["History"] != null)) {
+ base.Tables.Add(new HistoryDataTable(ds.Tables["History"]));
+ }
+ if ((ds.Tables["Stats"] != null)) {
+ base.Tables.Add(new StatsDataTable(ds.Tables["Stats"]));
+ }
+ this.DataSetName = ds.DataSetName;
+ this.Prefix = ds.Prefix;
+ this.Namespace = ds.Namespace;
+ this.Locale = ds.Locale;
+ this.CaseSensitive = ds.CaseSensitive;
+ this.EnforceConstraints = ds.EnforceConstraints;
+ this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+ this.InitVars();
+ }
+ else {
+ this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+ }
+ this.GetSerializationData(info, context);
+ global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+ base.Tables.CollectionChanged += schemaChangedHandler;
+ this.Relations.CollectionChanged += schemaChangedHandler;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+ public HistoryDataTable History {
+ get {
+ return this.tableHistory;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+ public StatsDataTable Stats {
+ get {
+ return this.tableStats;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.BrowsableAttribute(true)]
+ [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
+ public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
+ get {
+ return this._schemaSerializationMode;
+ }
+ set {
+ this._schemaSerializationMode = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+ public new global::System.Data.DataTableCollection Tables {
+ get {
+ return base.Tables;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+ public new global::System.Data.DataRelationCollection Relations {
+ get {
+ return base.Relations;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void InitializeDerivedDataSet() {
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataSet Clone() {
+ HistoryDataSet cln = ((HistoryDataSet)(base.Clone()));
+ cln.InitVars();
+ cln.SchemaSerializationMode = this.SchemaSerializationMode;
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override bool ShouldSerializeTables() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override bool ShouldSerializeRelations() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
+ if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+ this.Reset();
+ global::System.Data.DataSet ds = new global::System.Data.DataSet();
+ ds.ReadXml(reader);
+ if ((ds.Tables["History"] != null)) {
+ base.Tables.Add(new HistoryDataTable(ds.Tables["History"]));
+ }
+ if ((ds.Tables["Stats"] != null)) {
+ base.Tables.Add(new StatsDataTable(ds.Tables["Stats"]));
+ }
+ this.DataSetName = ds.DataSetName;
+ this.Prefix = ds.Prefix;
+ this.Namespace = ds.Namespace;
+ this.Locale = ds.Locale;
+ this.CaseSensitive = ds.CaseSensitive;
+ this.EnforceConstraints = ds.EnforceConstraints;
+ this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+ this.InitVars();
+ }
+ else {
+ this.ReadXml(reader);
+ this.InitVars();
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
+ global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
+ this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
+ stream.Position = 0;
+ return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.InitVars(true);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars(bool initTable) {
+ this.tableHistory = ((HistoryDataTable)(base.Tables["History"]));
+ if ((initTable == true)) {
+ if ((this.tableHistory != null)) {
+ this.tableHistory.InitVars();
+ }
+ }
+ this.tableStats = ((StatsDataTable)(base.Tables["Stats"]));
+ if ((initTable == true)) {
+ if ((this.tableStats != null)) {
+ this.tableStats.InitVars();
+ }
+ }
+ this.relationHistory_Stats = this.Relations["History_Stats"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.DataSetName = "HistoryDataSet";
+ this.Prefix = "";
+ this.Namespace = "http://tempuri.org/HistoryDataSet.xsd";
+ this.EnforceConstraints = true;
+ this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+ this.tableHistory = new HistoryDataTable();
+ base.Tables.Add(this.tableHistory);
+ this.tableStats = new StatsDataTable();
+ base.Tables.Add(this.tableStats);
+ this.relationHistory_Stats = new global::System.Data.DataRelation("History_Stats", new global::System.Data.DataColumn[] {
+ this.tableHistory.LogFileNameColumn}, new global::System.Data.DataColumn[] {
+ this.tableStats.LogFileNameColumn}, false);
+ this.Relations.Add(this.relationHistory_Stats);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private bool ShouldSerializeHistory() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private bool ShouldSerializeStats() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
+ if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
+ this.InitVars();
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ HistoryDataSet ds = new HistoryDataSet();
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
+ any.Namespace = ds.Namespace;
+ sequence.Items.Add(any);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+
+ public delegate void HistoryRowChangeEventHandler(object sender, HistoryRowChangeEvent e);
+
+ public delegate void StatsRowChangeEventHandler(object sender, StatsRowChangeEvent e);
+
+ ///
+ ///Represents the strongly named DataTable class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+ public partial class HistoryDataTable : global::System.Data.TypedTableBase {
+
+ private global::System.Data.DataColumn columnName;
+
+ private global::System.Data.DataColumn columnActionDate;
+
+ private global::System.Data.DataColumn columnAction;
+
+ private global::System.Data.DataColumn columnFull;
+
+ private global::System.Data.DataColumn columnSuccess;
+
+ private global::System.Data.DataColumn columnLogFileName;
+
+ private global::System.Data.DataColumn columnChecksum;
+
+ private global::System.Data.DataColumn columnCheckMod;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryDataTable() {
+ this.TableName = "History";
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal HistoryDataTable(global::System.Data.DataTable table) {
+ this.TableName = table.TableName;
+ if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+ this.CaseSensitive = table.CaseSensitive;
+ }
+ if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+ this.Locale = table.Locale;
+ }
+ if ((table.Namespace != table.DataSet.Namespace)) {
+ this.Namespace = table.Namespace;
+ }
+ this.Prefix = table.Prefix;
+ this.MinimumCapacity = table.MinimumCapacity;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected HistoryDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context) {
+ this.InitVars();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn NameColumn {
+ get {
+ return this.columnName;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ActionDateColumn {
+ get {
+ return this.columnActionDate;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ActionColumn {
+ get {
+ return this.columnAction;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn FullColumn {
+ get {
+ return this.columnFull;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn SuccessColumn {
+ get {
+ return this.columnSuccess;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn LogFileNameColumn {
+ get {
+ return this.columnLogFileName;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ChecksumColumn {
+ get {
+ return this.columnChecksum;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn CheckModColumn {
+ get {
+ return this.columnCheckMod;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ public int Count {
+ get {
+ return this.Rows.Count;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRow this[int index] {
+ get {
+ return ((HistoryRow)(this.Rows[index]));
+ }
+ }
+
+ public event HistoryRowChangeEventHandler HistoryRowChanging;
+
+ public event HistoryRowChangeEventHandler HistoryRowChanged;
+
+ public event HistoryRowChangeEventHandler HistoryRowDeleting;
+
+ public event HistoryRowChangeEventHandler HistoryRowDeleted;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void AddHistoryRow(HistoryRow row) {
+ this.Rows.Add(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRow AddHistoryRow(string Name, System.DateTime ActionDate, string Action, bool Full, bool Success, string LogFileName, byte[] Checksum, string CheckMod) {
+ HistoryRow rowHistoryRow = ((HistoryRow)(this.NewRow()));
+ object[] columnValuesArray = new object[] {
+ Name,
+ ActionDate,
+ Action,
+ Full,
+ Success,
+ LogFileName,
+ Checksum,
+ CheckMod};
+ rowHistoryRow.ItemArray = columnValuesArray;
+ this.Rows.Add(rowHistoryRow);
+ return rowHistoryRow;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRow FindByNameActionDate(string Name, System.DateTime ActionDate) {
+ return ((HistoryRow)(this.Rows.Find(new object[] {
+ Name,
+ ActionDate})));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataTable Clone() {
+ HistoryDataTable cln = ((HistoryDataTable)(base.Clone()));
+ cln.InitVars();
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataTable CreateInstance() {
+ return new HistoryDataTable();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.columnName = base.Columns["Name"];
+ this.columnActionDate = base.Columns["ActionDate"];
+ this.columnAction = base.Columns["Action"];
+ this.columnFull = base.Columns["Full"];
+ this.columnSuccess = base.Columns["Success"];
+ this.columnLogFileName = base.Columns["LogFileName"];
+ this.columnChecksum = base.Columns["Checksum"];
+ this.columnCheckMod = base.Columns["CheckMod"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnName);
+ this.columnActionDate = new global::System.Data.DataColumn("ActionDate", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnActionDate);
+ this.columnAction = new global::System.Data.DataColumn("Action", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnAction);
+ this.columnFull = new global::System.Data.DataColumn("Full", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnFull);
+ this.columnSuccess = new global::System.Data.DataColumn("Success", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnSuccess);
+ this.columnLogFileName = new global::System.Data.DataColumn("LogFileName", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnLogFileName);
+ this.columnChecksum = new global::System.Data.DataColumn("Checksum", typeof(byte[]), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnChecksum);
+ this.columnCheckMod = new global::System.Data.DataColumn("CheckMod", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnCheckMod);
+ this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
+ this.columnName,
+ this.columnActionDate}, true));
+ this.columnName.AllowDBNull = false;
+ this.columnActionDate.AllowDBNull = false;
+ this.columnActionDate.Caption = "Date";
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRow NewHistoryRow() {
+ return ((HistoryRow)(this.NewRow()));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+ return new HistoryRow(builder);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Type GetRowType() {
+ return typeof(HistoryRow);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanged(e);
+ if ((this.HistoryRowChanged != null)) {
+ this.HistoryRowChanged(this, new HistoryRowChangeEvent(((HistoryRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanging(e);
+ if ((this.HistoryRowChanging != null)) {
+ this.HistoryRowChanging(this, new HistoryRowChangeEvent(((HistoryRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleted(e);
+ if ((this.HistoryRowDeleted != null)) {
+ this.HistoryRowDeleted(this, new HistoryRowChangeEvent(((HistoryRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleting(e);
+ if ((this.HistoryRowDeleting != null)) {
+ this.HistoryRowDeleting(this, new HistoryRowChangeEvent(((HistoryRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void RemoveHistoryRow(HistoryRow row) {
+ this.Rows.Remove(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ HistoryDataSet ds = new HistoryDataSet();
+ global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+ any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+ any1.MinOccurs = new decimal(0);
+ any1.MaxOccurs = decimal.MaxValue;
+ any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any1);
+ global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+ any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+ any2.MinOccurs = new decimal(1);
+ any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any2);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute1.Name = "namespace";
+ attribute1.FixedValue = ds.Namespace;
+ type.Attributes.Add(attribute1);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute2.Name = "tableTypeName";
+ attribute2.FixedValue = "HistoryDataTable";
+ type.Attributes.Add(attribute2);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+ }
+
+ ///
+ ///Represents the strongly named DataTable class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+ public partial class StatsDataTable : global::System.Data.TypedTableBase {
+
+ private global::System.Data.DataColumn columnLogFileName;
+
+ private global::System.Data.DataColumn columnActionDate;
+
+ private global::System.Data.DataColumn columnAddedFiles;
+
+ private global::System.Data.DataColumn columnAddedFolders;
+
+ private global::System.Data.DataColumn columnExaminedFiles;
+
+ private global::System.Data.DataColumn columnOpenedFiles;
+
+ private global::System.Data.DataColumn columnSizeOfModified;
+
+ private global::System.Data.DataColumn columnSizeOfAdded;
+
+ private global::System.Data.DataColumn columnSizeOfExamined;
+
+ private global::System.Data.DataColumn columnUnprocessed;
+
+ private global::System.Data.DataColumn columnTooLargeFiles;
+
+ private global::System.Data.DataColumn columnFilesWithError;
+
+ private global::System.Data.DataColumn columnBeginTime;
+
+ private global::System.Data.DataColumn columnEndTime;
+
+ private global::System.Data.DataColumn columnDuration;
+
+ private global::System.Data.DataColumn columnDeletedFiles;
+
+ private global::System.Data.DataColumn columnDeletedFolders;
+
+ private global::System.Data.DataColumn columnModifiedFiles;
+
+ private global::System.Data.DataColumn columnBackupType;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsDataTable() {
+ this.TableName = "Stats";
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal StatsDataTable(global::System.Data.DataTable table) {
+ this.TableName = table.TableName;
+ if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+ this.CaseSensitive = table.CaseSensitive;
+ }
+ if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+ this.Locale = table.Locale;
+ }
+ if ((table.Namespace != table.DataSet.Namespace)) {
+ this.Namespace = table.Namespace;
+ }
+ this.Prefix = table.Prefix;
+ this.MinimumCapacity = table.MinimumCapacity;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected StatsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context) {
+ this.InitVars();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn LogFileNameColumn {
+ get {
+ return this.columnLogFileName;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ActionDateColumn {
+ get {
+ return this.columnActionDate;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn AddedFilesColumn {
+ get {
+ return this.columnAddedFiles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn AddedFoldersColumn {
+ get {
+ return this.columnAddedFolders;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ExaminedFilesColumn {
+ get {
+ return this.columnExaminedFiles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn OpenedFilesColumn {
+ get {
+ return this.columnOpenedFiles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn SizeOfModifiedColumn {
+ get {
+ return this.columnSizeOfModified;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn SizeOfAddedColumn {
+ get {
+ return this.columnSizeOfAdded;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn SizeOfExaminedColumn {
+ get {
+ return this.columnSizeOfExamined;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn UnprocessedColumn {
+ get {
+ return this.columnUnprocessed;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn TooLargeFilesColumn {
+ get {
+ return this.columnTooLargeFiles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn FilesWithErrorColumn {
+ get {
+ return this.columnFilesWithError;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn BeginTimeColumn {
+ get {
+ return this.columnBeginTime;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn EndTimeColumn {
+ get {
+ return this.columnEndTime;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn DurationColumn {
+ get {
+ return this.columnDuration;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn DeletedFilesColumn {
+ get {
+ return this.columnDeletedFiles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn DeletedFoldersColumn {
+ get {
+ return this.columnDeletedFolders;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ModifiedFilesColumn {
+ get {
+ return this.columnModifiedFiles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn BackupTypeColumn {
+ get {
+ return this.columnBackupType;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ public int Count {
+ get {
+ return this.Rows.Count;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRow this[int index] {
+ get {
+ return ((StatsRow)(this.Rows[index]));
+ }
+ }
+
+ public event StatsRowChangeEventHandler StatsRowChanging;
+
+ public event StatsRowChangeEventHandler StatsRowChanged;
+
+ public event StatsRowChangeEventHandler StatsRowDeleting;
+
+ public event StatsRowChangeEventHandler StatsRowDeleted;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void AddStatsRow(StatsRow row) {
+ this.Rows.Add(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRow AddStatsRow(
+ HistoryRow parentHistoryRowByHistory_Stats,
+ System.DateTime ActionDate,
+ int AddedFiles,
+ int AddedFolders,
+ int ExaminedFiles,
+ int OpenedFiles,
+ long SizeOfModified,
+ long SizeOfAdded,
+ long SizeOfExamined,
+ int Unprocessed,
+ int TooLargeFiles,
+ int FilesWithError,
+ System.DateTime BeginTime,
+ System.DateTime EndTime,
+ string Duration,
+ int DeletedFiles,
+ int DeletedFolders,
+ int ModifiedFiles,
+ string BackupType) {
+ StatsRow rowStatsRow = ((StatsRow)(this.NewRow()));
+ object[] columnValuesArray = new object[] {
+ null,
+ ActionDate,
+ AddedFiles,
+ AddedFolders,
+ ExaminedFiles,
+ OpenedFiles,
+ SizeOfModified,
+ SizeOfAdded,
+ SizeOfExamined,
+ Unprocessed,
+ TooLargeFiles,
+ FilesWithError,
+ BeginTime,
+ EndTime,
+ Duration,
+ DeletedFiles,
+ DeletedFolders,
+ ModifiedFiles,
+ BackupType};
+ if ((parentHistoryRowByHistory_Stats != null)) {
+ columnValuesArray[0] = parentHistoryRowByHistory_Stats[5];
+ }
+ rowStatsRow.ItemArray = columnValuesArray;
+ this.Rows.Add(rowStatsRow);
+ return rowStatsRow;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRow FindByLogFileName(string LogFileName) {
+ return ((StatsRow)(this.Rows.Find(new object[] {
+ LogFileName})));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataTable Clone() {
+ StatsDataTable cln = ((StatsDataTable)(base.Clone()));
+ cln.InitVars();
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataTable CreateInstance() {
+ return new StatsDataTable();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.columnLogFileName = base.Columns["LogFileName"];
+ this.columnActionDate = base.Columns["ActionDate"];
+ this.columnAddedFiles = base.Columns["AddedFiles"];
+ this.columnAddedFolders = base.Columns["AddedFolders"];
+ this.columnExaminedFiles = base.Columns["ExaminedFiles"];
+ this.columnOpenedFiles = base.Columns["OpenedFiles"];
+ this.columnSizeOfModified = base.Columns["SizeOfModified"];
+ this.columnSizeOfAdded = base.Columns["SizeOfAdded"];
+ this.columnSizeOfExamined = base.Columns["SizeOfExamined"];
+ this.columnUnprocessed = base.Columns["Unprocessed"];
+ this.columnTooLargeFiles = base.Columns["TooLargeFiles"];
+ this.columnFilesWithError = base.Columns["FilesWithError"];
+ this.columnBeginTime = base.Columns["BeginTime"];
+ this.columnEndTime = base.Columns["EndTime"];
+ this.columnDuration = base.Columns["Duration"];
+ this.columnDeletedFiles = base.Columns["DeletedFiles"];
+ this.columnDeletedFolders = base.Columns["DeletedFolders"];
+ this.columnModifiedFiles = base.Columns["ModifiedFiles"];
+ this.columnBackupType = base.Columns["BackupType"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.columnLogFileName = new global::System.Data.DataColumn("LogFileName", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnLogFileName);
+ this.columnActionDate = new global::System.Data.DataColumn("ActionDate", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnActionDate);
+ this.columnAddedFiles = new global::System.Data.DataColumn("AddedFiles", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnAddedFiles);
+ this.columnAddedFolders = new global::System.Data.DataColumn("AddedFolders", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnAddedFolders);
+ this.columnExaminedFiles = new global::System.Data.DataColumn("ExaminedFiles", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnExaminedFiles);
+ this.columnOpenedFiles = new global::System.Data.DataColumn("OpenedFiles", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnOpenedFiles);
+ this.columnSizeOfModified = new global::System.Data.DataColumn("SizeOfModified", typeof(long), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnSizeOfModified);
+ this.columnSizeOfAdded = new global::System.Data.DataColumn("SizeOfAdded", typeof(long), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnSizeOfAdded);
+ this.columnSizeOfExamined = new global::System.Data.DataColumn("SizeOfExamined", typeof(long), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnSizeOfExamined);
+ this.columnUnprocessed = new global::System.Data.DataColumn("Unprocessed", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnUnprocessed);
+ this.columnTooLargeFiles = new global::System.Data.DataColumn("TooLargeFiles", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnTooLargeFiles);
+ this.columnFilesWithError = new global::System.Data.DataColumn("FilesWithError", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnFilesWithError);
+ this.columnBeginTime = new global::System.Data.DataColumn("BeginTime", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnBeginTime);
+ this.columnEndTime = new global::System.Data.DataColumn("EndTime", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnEndTime);
+ this.columnDuration = new global::System.Data.DataColumn("Duration", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnDuration);
+ this.columnDeletedFiles = new global::System.Data.DataColumn("DeletedFiles", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnDeletedFiles);
+ this.columnDeletedFolders = new global::System.Data.DataColumn("DeletedFolders", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnDeletedFolders);
+ this.columnModifiedFiles = new global::System.Data.DataColumn("ModifiedFiles", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnModifiedFiles);
+ this.columnBackupType = new global::System.Data.DataColumn("BackupType", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnBackupType);
+ this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
+ this.columnLogFileName}, true));
+ this.columnLogFileName.AllowDBNull = false;
+ this.columnLogFileName.Unique = true;
+ this.columnLogFileName.Caption = "Name";
+ this.columnActionDate.AllowDBNull = false;
+ this.columnActionDate.Caption = "Date";
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRow NewStatsRow() {
+ return ((StatsRow)(this.NewRow()));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+ return new StatsRow(builder);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Type GetRowType() {
+ return typeof(StatsRow);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanged(e);
+ if ((this.StatsRowChanged != null)) {
+ this.StatsRowChanged(this, new StatsRowChangeEvent(((StatsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanging(e);
+ if ((this.StatsRowChanging != null)) {
+ this.StatsRowChanging(this, new StatsRowChangeEvent(((StatsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleted(e);
+ if ((this.StatsRowDeleted != null)) {
+ this.StatsRowDeleted(this, new StatsRowChangeEvent(((StatsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleting(e);
+ if ((this.StatsRowDeleting != null)) {
+ this.StatsRowDeleting(this, new StatsRowChangeEvent(((StatsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void RemoveStatsRow(StatsRow row) {
+ this.Rows.Remove(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ HistoryDataSet ds = new HistoryDataSet();
+ global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+ any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+ any1.MinOccurs = new decimal(0);
+ any1.MaxOccurs = decimal.MaxValue;
+ any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any1);
+ global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+ any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+ any2.MinOccurs = new decimal(1);
+ any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any2);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute1.Name = "namespace";
+ attribute1.FixedValue = ds.Namespace;
+ type.Attributes.Add(attribute1);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute2.Name = "tableTypeName";
+ attribute2.FixedValue = "StatsDataTable";
+ type.Attributes.Add(attribute2);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+ }
+
+ ///
+ ///Represents strongly named DataRow class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public partial class HistoryRow : global::System.Data.DataRow {
+
+ private HistoryDataTable tableHistory;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal HistoryRow(global::System.Data.DataRowBuilder rb) :
+ base(rb) {
+ this.tableHistory = ((HistoryDataTable)(this.Table));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Name {
+ get {
+ return ((string)(this[this.tableHistory.NameColumn]));
+ }
+ set {
+ this[this.tableHistory.NameColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public System.DateTime ActionDate {
+ get {
+ return ((global::System.DateTime)(this[this.tableHistory.ActionDateColumn]));
+ }
+ set {
+ this[this.tableHistory.ActionDateColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Action {
+ get {
+ try {
+ return ((string)(this[this.tableHistory.ActionColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Action\' in table \'History\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableHistory.ActionColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool Full {
+ get {
+ try {
+ return ((bool)(this[this.tableHistory.FullColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Full\' in table \'History\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableHistory.FullColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool Success {
+ get {
+ try {
+ return ((bool)(this[this.tableHistory.SuccessColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Success\' in table \'History\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableHistory.SuccessColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string LogFileName {
+ get {
+ try {
+ return ((string)(this[this.tableHistory.LogFileNameColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'LogFileName\' in table \'History\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableHistory.LogFileNameColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public byte[] Checksum {
+ get {
+ try {
+ return ((byte[])(this[this.tableHistory.ChecksumColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Checksum\' in table \'History\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableHistory.ChecksumColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string CheckMod {
+ get {
+ try {
+ return ((string)(this[this.tableHistory.CheckModColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'CheckMod\' in table \'History\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableHistory.CheckModColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsActionNull() {
+ return this.IsNull(this.tableHistory.ActionColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetActionNull() {
+ this[this.tableHistory.ActionColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsFullNull() {
+ return this.IsNull(this.tableHistory.FullColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetFullNull() {
+ this[this.tableHistory.FullColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsSuccessNull() {
+ return this.IsNull(this.tableHistory.SuccessColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetSuccessNull() {
+ this[this.tableHistory.SuccessColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsLogFileNameNull() {
+ return this.IsNull(this.tableHistory.LogFileNameColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetLogFileNameNull() {
+ this[this.tableHistory.LogFileNameColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsChecksumNull() {
+ return this.IsNull(this.tableHistory.ChecksumColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetChecksumNull() {
+ this[this.tableHistory.ChecksumColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsCheckModNull() {
+ return this.IsNull(this.tableHistory.CheckModColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetCheckModNull() {
+ this[this.tableHistory.CheckModColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRow[] GetStatsRows() {
+ if ((this.Table.ChildRelations["History_Stats"] == null)) {
+ return new StatsRow[0];
+ }
+ else {
+ return ((StatsRow[])(base.GetChildRows(this.Table.ChildRelations["History_Stats"])));
+ }
+ }
+ }
+
+ ///
+ ///Represents strongly named DataRow class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public partial class StatsRow : global::System.Data.DataRow {
+
+ private StatsDataTable tableStats;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal StatsRow(global::System.Data.DataRowBuilder rb) :
+ base(rb) {
+ this.tableStats = ((StatsDataTable)(this.Table));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string LogFileName {
+ get {
+ return ((string)(this[this.tableStats.LogFileNameColumn]));
+ }
+ set {
+ this[this.tableStats.LogFileNameColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public System.DateTime ActionDate {
+ get {
+ return ((global::System.DateTime)(this[this.tableStats.ActionDateColumn]));
+ }
+ set {
+ this[this.tableStats.ActionDateColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int AddedFiles {
+ get {
+ try {
+ return ((int)(this[this.tableStats.AddedFilesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'AddedFiles\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.AddedFilesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int AddedFolders {
+ get {
+ try {
+ return ((int)(this[this.tableStats.AddedFoldersColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'AddedFolders\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.AddedFoldersColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int ExaminedFiles {
+ get {
+ try {
+ return ((int)(this[this.tableStats.ExaminedFilesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'ExaminedFiles\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.ExaminedFilesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int OpenedFiles {
+ get {
+ try {
+ return ((int)(this[this.tableStats.OpenedFilesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'OpenedFiles\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.OpenedFilesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public long SizeOfModified {
+ get {
+ try {
+ return ((long)(this[this.tableStats.SizeOfModifiedColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'SizeOfModified\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.SizeOfModifiedColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public long SizeOfAdded {
+ get {
+ try {
+ return ((long)(this[this.tableStats.SizeOfAddedColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'SizeOfAdded\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.SizeOfAddedColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public long SizeOfExamined {
+ get {
+ try {
+ return ((long)(this[this.tableStats.SizeOfExaminedColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'SizeOfExamined\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.SizeOfExaminedColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int Unprocessed {
+ get {
+ try {
+ return ((int)(this[this.tableStats.UnprocessedColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Unprocessed\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.UnprocessedColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int TooLargeFiles {
+ get {
+ try {
+ return ((int)(this[this.tableStats.TooLargeFilesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'TooLargeFiles\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.TooLargeFilesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int FilesWithError {
+ get {
+ try {
+ return ((int)(this[this.tableStats.FilesWithErrorColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'FilesWithError\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.FilesWithErrorColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public System.DateTime BeginTime {
+ get {
+ try {
+ return ((global::System.DateTime)(this[this.tableStats.BeginTimeColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'BeginTime\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.BeginTimeColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public System.DateTime EndTime {
+ get {
+ try {
+ return ((global::System.DateTime)(this[this.tableStats.EndTimeColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'EndTime\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.EndTimeColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Duration {
+ get {
+ try {
+ return ((string)(this[this.tableStats.DurationColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Duration\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.DurationColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int DeletedFiles {
+ get {
+ try {
+ return ((int)(this[this.tableStats.DeletedFilesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'DeletedFiles\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.DeletedFilesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int DeletedFolders {
+ get {
+ try {
+ return ((int)(this[this.tableStats.DeletedFoldersColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'DeletedFolders\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.DeletedFoldersColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int ModifiedFiles {
+ get {
+ try {
+ return ((int)(this[this.tableStats.ModifiedFilesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'ModifiedFiles\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.ModifiedFilesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string BackupType {
+ get {
+ try {
+ return ((string)(this[this.tableStats.BackupTypeColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'BackupType\' in table \'Stats\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableStats.BackupTypeColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRow HistoryRow {
+ get {
+ return ((HistoryRow)(this.GetParentRow(this.Table.ParentRelations["History_Stats"])));
+ }
+ set {
+ this.SetParentRow(value, this.Table.ParentRelations["History_Stats"]);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsAddedFilesNull() {
+ return this.IsNull(this.tableStats.AddedFilesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetAddedFilesNull() {
+ this[this.tableStats.AddedFilesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsAddedFoldersNull() {
+ return this.IsNull(this.tableStats.AddedFoldersColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetAddedFoldersNull() {
+ this[this.tableStats.AddedFoldersColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsExaminedFilesNull() {
+ return this.IsNull(this.tableStats.ExaminedFilesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetExaminedFilesNull() {
+ this[this.tableStats.ExaminedFilesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsOpenedFilesNull() {
+ return this.IsNull(this.tableStats.OpenedFilesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetOpenedFilesNull() {
+ this[this.tableStats.OpenedFilesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsSizeOfModifiedNull() {
+ return this.IsNull(this.tableStats.SizeOfModifiedColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetSizeOfModifiedNull() {
+ this[this.tableStats.SizeOfModifiedColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsSizeOfAddedNull() {
+ return this.IsNull(this.tableStats.SizeOfAddedColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetSizeOfAddedNull() {
+ this[this.tableStats.SizeOfAddedColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsSizeOfExaminedNull() {
+ return this.IsNull(this.tableStats.SizeOfExaminedColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetSizeOfExaminedNull() {
+ this[this.tableStats.SizeOfExaminedColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsUnprocessedNull() {
+ return this.IsNull(this.tableStats.UnprocessedColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetUnprocessedNull() {
+ this[this.tableStats.UnprocessedColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsTooLargeFilesNull() {
+ return this.IsNull(this.tableStats.TooLargeFilesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetTooLargeFilesNull() {
+ this[this.tableStats.TooLargeFilesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsFilesWithErrorNull() {
+ return this.IsNull(this.tableStats.FilesWithErrorColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetFilesWithErrorNull() {
+ this[this.tableStats.FilesWithErrorColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsBeginTimeNull() {
+ return this.IsNull(this.tableStats.BeginTimeColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetBeginTimeNull() {
+ this[this.tableStats.BeginTimeColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsEndTimeNull() {
+ return this.IsNull(this.tableStats.EndTimeColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetEndTimeNull() {
+ this[this.tableStats.EndTimeColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsDurationNull() {
+ return this.IsNull(this.tableStats.DurationColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetDurationNull() {
+ this[this.tableStats.DurationColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsDeletedFilesNull() {
+ return this.IsNull(this.tableStats.DeletedFilesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetDeletedFilesNull() {
+ this[this.tableStats.DeletedFilesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsDeletedFoldersNull() {
+ return this.IsNull(this.tableStats.DeletedFoldersColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetDeletedFoldersNull() {
+ this[this.tableStats.DeletedFoldersColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsModifiedFilesNull() {
+ return this.IsNull(this.tableStats.ModifiedFilesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetModifiedFilesNull() {
+ this[this.tableStats.ModifiedFilesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsBackupTypeNull() {
+ return this.IsNull(this.tableStats.BackupTypeColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetBackupTypeNull() {
+ this[this.tableStats.BackupTypeColumn] = global::System.Convert.DBNull;
+ }
+ }
+
+ ///
+ ///Row event argument class
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public class HistoryRowChangeEvent : global::System.EventArgs {
+
+ private HistoryRow eventRow;
+
+ private global::System.Data.DataRowAction eventAction;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRowChangeEvent(HistoryRow row, global::System.Data.DataRowAction action) {
+ this.eventRow = row;
+ this.eventAction = action;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public HistoryRow Row {
+ get {
+ return this.eventRow;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataRowAction Action {
+ get {
+ return this.eventAction;
+ }
+ }
+ }
+
+ ///
+ ///Row event argument class
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public class StatsRowChangeEvent : global::System.EventArgs {
+
+ private StatsRow eventRow;
+
+ private global::System.Data.DataRowAction eventAction;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRowChangeEvent(StatsRow row, global::System.Data.DataRowAction action) {
+ this.eventRow = row;
+ this.eventAction = action;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public StatsRow Row {
+ get {
+ return this.eventRow;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataRowAction Action {
+ get {
+ return this.eventAction;
+ }
+ }
+ }
+ }
+}
+
+#pragma warning restore 1591
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/HistoryDataSet.xsc b/Duplicati/Scheduler/Data/HistoryDataSet.xsc
new file mode 100644
index 000000000..551fc56fb
--- /dev/null
+++ b/Duplicati/Scheduler/Data/HistoryDataSet.xsc
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/HistoryDataSet.xsd b/Duplicati/Scheduler/Data/HistoryDataSet.xsd
new file mode 100644
index 000000000..ec3311ce0
--- /dev/null
+++ b/Duplicati/Scheduler/Data/HistoryDataSet.xsd
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/HistoryDataSet.xss b/Duplicati/Scheduler/Data/HistoryDataSet.xss
new file mode 100644
index 000000000..1c4a77e80
--- /dev/null
+++ b/Duplicati/Scheduler/Data/HistoryDataSet.xss
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+ 220
+ 191
+
+
+ 321
+ 191
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/HistoryDataSetSupport.cs b/Duplicati/Scheduler/Data/HistoryDataSetSupport.cs
new file mode 100644
index 000000000..d9fa16248
--- /dev/null
+++ b/Duplicati/Scheduler/Data/HistoryDataSetSupport.cs
@@ -0,0 +1,214 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Duplicati.Scheduler.Data
+{
+ ///
+ /// Provides some tools used with the history dataset
+ ///
+ public partial class HistoryDataSet
+ {
+ ///
+ /// The name of the XML file (no path)
+ ///
+ public const string DefaultName = "History.xml";
+ ///
+ /// The XML file path without the file name
+ ///
+ public static string DefaultPath()
+ {
+ return GetAppData(DefaultName);
+ }
+ ///
+ /// The application path and filename, making sure it exists
+ ///
+ public static string GetAppData(string aFileName)
+ {
+ string Result = Utility.User.GetApplicationDirectory(@"Duplicati");
+ if (!System.IO.Directory.Exists(Result)) System.IO.Directory.CreateDirectory(Result);
+ return System.IO.Path.Combine(Result, aFileName);
+ }
+ ///
+ /// Load the database from the deefault XML file
+ ///
+ /// null if OK, else the exception
+ public Exception Load()
+ {
+ return Load(string.Empty);
+ }
+ ///
+ /// Load the database from a file (if empty, use the default)
+ ///
+ /// File to load or default if null or empty
+ /// null if OK, else the exception
+ public Exception Load(string aFullPath)
+ {
+ if (string.IsNullOrEmpty(aFullPath)) aFullPath = DefaultPath();
+ if (!System.IO.File.Exists(aFullPath)) return new Exception("File not found: " + aFullPath);
+ this.Clear();
+ Exception Result = null;
+ try
+ {
+ this.ReadXml(aFullPath);
+ }
+ catch (Exception Ex)
+ {
+ Result = Ex;
+ }
+ return Result;
+ }
+ ///
+ /// Saves the dataset to the default XML
+ ///
+ /// null if OK, else the exception
+ public Exception Save()
+ {
+ return Save(GetAppData(DefaultName));
+ }
+ ///
+ /// Saves the dataset to the passed file
+ ///
+ /// XML file to load
+ /// null if OK, else the exception
+ public Exception Save(string aFullPath)
+ {
+ Exception Result = null;
+ try
+ {
+ this.WriteXml(aFullPath);
+ }
+ catch (Exception Ex)
+ {
+ Result = Ex;
+ }
+ return Result;
+ }
+ ///
+ /// Tools for the data table
+ ///
+ public partial class HistoryDataTable
+ {
+ ///
+ /// Get all rows for a job
+ ///
+ /// Job to load
+ /// Rows or empty if none
+ public HistoryRow[] GetHistory(string aJob)
+ {
+ return this.Where(qR => qR.Name.Equals(aJob)).ToArray();
+ }
+ ///
+ /// Gives all rows for a job older than a time span
+ ///
+ /// Job to load
+ /// TimeSpan older than which rows will not be loaded
+ ///
+ public HistoryRow[] GetHistory(string aJob, TimeSpan aYoungerThan)
+ {
+ DateTime Later = DateTime.Now - aYoungerThan;
+ return GetHistory(aJob).Where(qR => qR.ActionDate > Later).ToArray();
+ }
+ ///
+ /// Returns the last FULL backup for a job or null
+ ///
+ /// Job to load
+ /// the last FULL backup for a job or null
+ public DateTime LastFull(string aJob)
+ {
+ return GetHistory(aJob).Where(qF => qF.Full && qF.Success).Select(qD => qD.ActionDate).DefaultIfEmpty(DateTime.MinValue).Max();
+ }
+ ///
+ /// Returns the number of runs since the last full backup
+ ///
+ /// Job to load
+ /// The number of runs since the last full backup
+ public int NumberSinceLastFull(string aJob)
+ {
+ DateTime Last = LastFull(aJob);
+ if (Last == DateTime.MinValue) return 0;
+ return NumberSinceLastFull(aJob, Last);
+ }
+ ///
+ /// Returns the number of incremntal runs since a date
+ ///
+ /// Job to run
+ /// Date
+ /// The number of incremntal runs since a date
+ public int NumberSinceLastFull(string aJob, DateTime aLastFull)
+ {
+ return GetHistory(aJob).Where(qF => !qF.Full && qF.Success && qF.ActionDate > aLastFull).Count();
+ }
+ ///
+ /// Deletes all rows for a job
+ ///
+ ///
+ public void DeleteJob(string aJob)
+ {
+ foreach (HistoryRow Row in GetHistory(aJob))
+ Row.Delete();
+ }
+ }
+ ///
+ /// Data row tools
+ ///
+ public partial class HistoryRow
+ {
+ ///
+ /// Update a stats row
+ ///
+ /// Duplicati output (Result) string
+ public void UpdateStats(string aOutput)
+ {
+ StatsRow[] Stats = this.GetStatsRows();
+ StatsRow sRow = null;
+ if (Stats == null || Stats.Length == 0)
+ sRow = ((StatsDataTable)this.tableHistory.ChildRelations["History_Stats"].ChildTable).AddStatsRow(this,
+ this.ActionDate, 0, 0, 0, 0, 0L, 0L, 0L, 0, 0, 0, this.ActionDate, this.ActionDate, string.Empty,
+ 0, 0, 0, string.Empty);
+ else
+ sRow = Stats[0];
+ // Parse the stats out of the results
+ foreach (string Line in aOutput.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
+ {
+ int Colon = Line.IndexOf(':');
+ if (Colon > 0)
+ {
+ string Field = Line.Substring(0, Colon).Trim();
+ string Value = Line.Substring(Colon + 1).Trim();
+ if (sRow.Table.Columns.Contains(Field))
+ sRow[Field] = System.Convert.ChangeType(Value, this.Table.Columns[Field].DataType);
+ }
+ }
+ }
+ ///
+ /// Update a History row
+ ///
+ /// Action done
+ /// Was it full
+ /// OK
+ /// Status
+ /// Checksun used
+ /// Module used
+ public void Update(string aAction, bool aFull, bool aSuccess, string aStatus, byte[] aChecksum, string aCheckMod)
+ {
+ this.Action = aAction;
+ this.Full = aFull;
+ this.Success = aSuccess;
+ this.CheckMod = aCheckMod;
+ this.Checksum = aChecksum;
+ this.UpdateStats(aStatus);
+ }
+ ///
+ /// Delete a history row
+ ///
+ public new void Delete()
+ {
+ foreach (StatsRow sRow in from StatsRow qS in this.GetStatsRows() select qS)
+ sRow.Delete();
+ base.Delete();
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Data/Properties/AssemblyInfo.cs b/Duplicati/Scheduler/Data/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..dd1308f8e
--- /dev/null
+++ b/Duplicati/Scheduler/Data/Properties/AssemblyInfo.cs
@@ -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("Duplicati.Scheduler.Data")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Duplicati.Scheduler.Data")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[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("29ad0c35-1969-486b-8947-0f3d94c61a89")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Duplicati/Scheduler/Data/SchedulerDataSet.Designer.cs b/Duplicati/Scheduler/Data/SchedulerDataSet.Designer.cs
new file mode 100644
index 000000000..0d7e12299
--- /dev/null
+++ b/Duplicati/Scheduler/Data/SchedulerDataSet.Designer.cs
@@ -0,0 +1,2411 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4961
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+#pragma warning disable 1591
+
+namespace Duplicati.Scheduler.Data {
+
+
+ ///
+ ///Represents a strongly typed in-memory cache of data.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.ComponentModel.DesignerCategoryAttribute("code")]
+ [global::System.ComponentModel.ToolboxItem(true)]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
+ [global::System.Xml.Serialization.XmlRootAttribute("SchedulerDataSet")]
+ [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
+ public partial class SchedulerDataSet : global::System.Data.DataSet {
+
+ private JobsDataTable tableJobs;
+
+ private OptionsDataTable tableOptions;
+
+ private DriveMapsDataTable tableDriveMaps;
+
+ private SettingsDataTable tableSettings;
+
+ private global::System.Data.DataRelation relationJobs_Options;
+
+ private global::System.Data.DataRelation relationJobs_DriveMaps;
+
+ private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SchedulerDataSet() {
+ this.BeginInit();
+ this.InitClass();
+ global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+ base.Tables.CollectionChanged += schemaChangedHandler;
+ base.Relations.CollectionChanged += schemaChangedHandler;
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected SchedulerDataSet(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context, false) {
+ if ((this.IsBinarySerialized(info, context) == true)) {
+ this.InitVars(false);
+ global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+ this.Tables.CollectionChanged += schemaChangedHandler1;
+ this.Relations.CollectionChanged += schemaChangedHandler1;
+ return;
+ }
+ string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
+ if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+ global::System.Data.DataSet ds = new global::System.Data.DataSet();
+ ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+ if ((ds.Tables["Jobs"] != null)) {
+ base.Tables.Add(new JobsDataTable(ds.Tables["Jobs"]));
+ }
+ if ((ds.Tables["Options"] != null)) {
+ base.Tables.Add(new OptionsDataTable(ds.Tables["Options"]));
+ }
+ if ((ds.Tables["DriveMaps"] != null)) {
+ base.Tables.Add(new DriveMapsDataTable(ds.Tables["DriveMaps"]));
+ }
+ if ((ds.Tables["Settings"] != null)) {
+ base.Tables.Add(new SettingsDataTable(ds.Tables["Settings"]));
+ }
+ this.DataSetName = ds.DataSetName;
+ this.Prefix = ds.Prefix;
+ this.Namespace = ds.Namespace;
+ this.Locale = ds.Locale;
+ this.CaseSensitive = ds.CaseSensitive;
+ this.EnforceConstraints = ds.EnforceConstraints;
+ this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+ this.InitVars();
+ }
+ else {
+ this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+ }
+ this.GetSerializationData(info, context);
+ global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+ base.Tables.CollectionChanged += schemaChangedHandler;
+ this.Relations.CollectionChanged += schemaChangedHandler;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+ public JobsDataTable Jobs {
+ get {
+ return this.tableJobs;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+ public OptionsDataTable Options {
+ get {
+ return this.tableOptions;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+ public DriveMapsDataTable DriveMaps {
+ get {
+ return this.tableDriveMaps;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+ public SettingsDataTable Settings {
+ get {
+ return this.tableSettings;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.BrowsableAttribute(true)]
+ [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
+ public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
+ get {
+ return this._schemaSerializationMode;
+ }
+ set {
+ this._schemaSerializationMode = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+ public new global::System.Data.DataTableCollection Tables {
+ get {
+ return base.Tables;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+ public new global::System.Data.DataRelationCollection Relations {
+ get {
+ return base.Relations;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void InitializeDerivedDataSet() {
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataSet Clone() {
+ SchedulerDataSet cln = ((SchedulerDataSet)(base.Clone()));
+ cln.InitVars();
+ cln.SchemaSerializationMode = this.SchemaSerializationMode;
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override bool ShouldSerializeTables() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override bool ShouldSerializeRelations() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
+ if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+ this.Reset();
+ global::System.Data.DataSet ds = new global::System.Data.DataSet();
+ ds.ReadXml(reader);
+ if ((ds.Tables["Jobs"] != null)) {
+ base.Tables.Add(new JobsDataTable(ds.Tables["Jobs"]));
+ }
+ if ((ds.Tables["Options"] != null)) {
+ base.Tables.Add(new OptionsDataTable(ds.Tables["Options"]));
+ }
+ if ((ds.Tables["DriveMaps"] != null)) {
+ base.Tables.Add(new DriveMapsDataTable(ds.Tables["DriveMaps"]));
+ }
+ if ((ds.Tables["Settings"] != null)) {
+ base.Tables.Add(new SettingsDataTable(ds.Tables["Settings"]));
+ }
+ this.DataSetName = ds.DataSetName;
+ this.Prefix = ds.Prefix;
+ this.Namespace = ds.Namespace;
+ this.Locale = ds.Locale;
+ this.CaseSensitive = ds.CaseSensitive;
+ this.EnforceConstraints = ds.EnforceConstraints;
+ this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+ this.InitVars();
+ }
+ else {
+ this.ReadXml(reader);
+ this.InitVars();
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
+ global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
+ this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
+ stream.Position = 0;
+ return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.InitVars(true);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars(bool initTable) {
+ this.tableJobs = ((JobsDataTable)(base.Tables["Jobs"]));
+ if ((initTable == true)) {
+ if ((this.tableJobs != null)) {
+ this.tableJobs.InitVars();
+ }
+ }
+ this.tableOptions = ((OptionsDataTable)(base.Tables["Options"]));
+ if ((initTable == true)) {
+ if ((this.tableOptions != null)) {
+ this.tableOptions.InitVars();
+ }
+ }
+ this.tableDriveMaps = ((DriveMapsDataTable)(base.Tables["DriveMaps"]));
+ if ((initTable == true)) {
+ if ((this.tableDriveMaps != null)) {
+ this.tableDriveMaps.InitVars();
+ }
+ }
+ this.tableSettings = ((SettingsDataTable)(base.Tables["Settings"]));
+ if ((initTable == true)) {
+ if ((this.tableSettings != null)) {
+ this.tableSettings.InitVars();
+ }
+ }
+ this.relationJobs_Options = this.Relations["Jobs_Options"];
+ this.relationJobs_DriveMaps = this.Relations["Jobs_DriveMaps"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.DataSetName = "SchedulerDataSet";
+ this.Prefix = "";
+ this.Namespace = "http://tempuri.org/SchedulerDataSet.xsd";
+ this.EnforceConstraints = true;
+ this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+ this.tableJobs = new JobsDataTable();
+ base.Tables.Add(this.tableJobs);
+ this.tableOptions = new OptionsDataTable();
+ base.Tables.Add(this.tableOptions);
+ this.tableDriveMaps = new DriveMapsDataTable();
+ base.Tables.Add(this.tableDriveMaps);
+ this.tableSettings = new SettingsDataTable();
+ base.Tables.Add(this.tableSettings);
+ this.relationJobs_Options = new global::System.Data.DataRelation("Jobs_Options", new global::System.Data.DataColumn[] {
+ this.tableJobs.NameColumn}, new global::System.Data.DataColumn[] {
+ this.tableOptions.NameColumn}, false);
+ this.Relations.Add(this.relationJobs_Options);
+ this.relationJobs_DriveMaps = new global::System.Data.DataRelation("Jobs_DriveMaps", new global::System.Data.DataColumn[] {
+ this.tableJobs.NameColumn}, new global::System.Data.DataColumn[] {
+ this.tableDriveMaps.NameColumn}, false);
+ this.Relations.Add(this.relationJobs_DriveMaps);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private bool ShouldSerializeJobs() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private bool ShouldSerializeOptions() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private bool ShouldSerializeDriveMaps() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private bool ShouldSerializeSettings() {
+ return false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
+ if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
+ this.InitVars();
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ SchedulerDataSet ds = new SchedulerDataSet();
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
+ any.Namespace = ds.Namespace;
+ sequence.Items.Add(any);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+
+ public delegate void JobsRowChangeEventHandler(object sender, JobsRowChangeEvent e);
+
+ public delegate void OptionsRowChangeEventHandler(object sender, OptionsRowChangeEvent e);
+
+ public delegate void DriveMapsRowChangeEventHandler(object sender, DriveMapsRowChangeEvent e);
+
+ public delegate void SettingsRowChangeEventHandler(object sender, SettingsRowChangeEvent e);
+
+ ///
+ ///Represents the strongly named DataTable class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+ public partial class JobsDataTable : global::System.Data.TypedTableBase {
+
+ private global::System.Data.DataColumn columnName;
+
+ private global::System.Data.DataColumn columnSource;
+
+ private global::System.Data.DataColumn columnDestination;
+
+ private global::System.Data.DataColumn columnFullOnly;
+
+ private global::System.Data.DataColumn columnFullRepeatDays;
+
+ private global::System.Data.DataColumn columnLocalChecksum;
+
+ private global::System.Data.DataColumn columnLocalCheckMod;
+
+ private global::System.Data.DataColumn columnFilter;
+
+ private global::System.Data.DataColumn columnMaxFulls;
+
+ private global::System.Data.DataColumn columnMaxAgeDays;
+
+ private global::System.Data.DataColumn columnFullAfterN;
+
+ private global::System.Data.DataColumn columnAutoCleanup;
+
+ private global::System.Data.DataColumn columnMapDrives;
+
+ private global::System.Data.DataColumn columnCheckSrc;
+
+ private global::System.Data.DataColumn columnTriggerXML;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsDataTable() {
+ this.TableName = "Jobs";
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal JobsDataTable(global::System.Data.DataTable table) {
+ this.TableName = table.TableName;
+ if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+ this.CaseSensitive = table.CaseSensitive;
+ }
+ if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+ this.Locale = table.Locale;
+ }
+ if ((table.Namespace != table.DataSet.Namespace)) {
+ this.Namespace = table.Namespace;
+ }
+ this.Prefix = table.Prefix;
+ this.MinimumCapacity = table.MinimumCapacity;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected JobsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context) {
+ this.InitVars();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn NameColumn {
+ get {
+ return this.columnName;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn SourceColumn {
+ get {
+ return this.columnSource;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn DestinationColumn {
+ get {
+ return this.columnDestination;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn FullOnlyColumn {
+ get {
+ return this.columnFullOnly;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn FullRepeatDaysColumn {
+ get {
+ return this.columnFullRepeatDays;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn LocalChecksumColumn {
+ get {
+ return this.columnLocalChecksum;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn LocalCheckModColumn {
+ get {
+ return this.columnLocalCheckMod;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn FilterColumn {
+ get {
+ return this.columnFilter;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn MaxFullsColumn {
+ get {
+ return this.columnMaxFulls;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn MaxAgeDaysColumn {
+ get {
+ return this.columnMaxAgeDays;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn FullAfterNColumn {
+ get {
+ return this.columnFullAfterN;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn AutoCleanupColumn {
+ get {
+ return this.columnAutoCleanup;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn MapDrivesColumn {
+ get {
+ return this.columnMapDrives;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn CheckSrcColumn {
+ get {
+ return this.columnCheckSrc;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn TriggerXMLColumn {
+ get {
+ return this.columnTriggerXML;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ public int Count {
+ get {
+ return this.Rows.Count;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow this[int index] {
+ get {
+ return ((JobsRow)(this.Rows[index]));
+ }
+ }
+
+ public event JobsRowChangeEventHandler JobsRowChanging;
+
+ public event JobsRowChangeEventHandler JobsRowChanged;
+
+ public event JobsRowChangeEventHandler JobsRowDeleting;
+
+ public event JobsRowChangeEventHandler JobsRowDeleted;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void AddJobsRow(JobsRow row) {
+ this.Rows.Add(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow AddJobsRow(string Name, string Source, string Destination, bool FullOnly, int FullRepeatDays, byte[] LocalChecksum, string LocalCheckMod, string Filter, int MaxFulls, int MaxAgeDays, int FullAfterN, bool AutoCleanup, bool MapDrives, string CheckSrc, string TriggerXML) {
+ JobsRow rowJobsRow = ((JobsRow)(this.NewRow()));
+ object[] columnValuesArray = new object[] {
+ Name,
+ Source,
+ Destination,
+ FullOnly,
+ FullRepeatDays,
+ LocalChecksum,
+ LocalCheckMod,
+ Filter,
+ MaxFulls,
+ MaxAgeDays,
+ FullAfterN,
+ AutoCleanup,
+ MapDrives,
+ CheckSrc,
+ TriggerXML};
+ rowJobsRow.ItemArray = columnValuesArray;
+ this.Rows.Add(rowJobsRow);
+ return rowJobsRow;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow FindByName(string Name) {
+ return ((JobsRow)(this.Rows.Find(new object[] {
+ Name})));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataTable Clone() {
+ JobsDataTable cln = ((JobsDataTable)(base.Clone()));
+ cln.InitVars();
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataTable CreateInstance() {
+ return new JobsDataTable();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.columnName = base.Columns["Name"];
+ this.columnSource = base.Columns["Source"];
+ this.columnDestination = base.Columns["Destination"];
+ this.columnFullOnly = base.Columns["FullOnly"];
+ this.columnFullRepeatDays = base.Columns["FullRepeatDays"];
+ this.columnLocalChecksum = base.Columns["LocalChecksum"];
+ this.columnLocalCheckMod = base.Columns["LocalCheckMod"];
+ this.columnFilter = base.Columns["Filter"];
+ this.columnMaxFulls = base.Columns["MaxFulls"];
+ this.columnMaxAgeDays = base.Columns["MaxAgeDays"];
+ this.columnFullAfterN = base.Columns["FullAfterN"];
+ this.columnAutoCleanup = base.Columns["AutoCleanup"];
+ this.columnMapDrives = base.Columns["MapDrives"];
+ this.columnCheckSrc = base.Columns["CheckSrc"];
+ this.columnTriggerXML = base.Columns["TriggerXML"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnName);
+ this.columnSource = new global::System.Data.DataColumn("Source", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnSource);
+ this.columnDestination = new global::System.Data.DataColumn("Destination", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnDestination);
+ this.columnFullOnly = new global::System.Data.DataColumn("FullOnly", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnFullOnly);
+ this.columnFullRepeatDays = new global::System.Data.DataColumn("FullRepeatDays", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnFullRepeatDays);
+ this.columnLocalChecksum = new global::System.Data.DataColumn("LocalChecksum", typeof(byte[]), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnLocalChecksum);
+ this.columnLocalCheckMod = new global::System.Data.DataColumn("LocalCheckMod", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnLocalCheckMod);
+ this.columnFilter = new global::System.Data.DataColumn("Filter", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnFilter);
+ this.columnMaxFulls = new global::System.Data.DataColumn("MaxFulls", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnMaxFulls);
+ this.columnMaxAgeDays = new global::System.Data.DataColumn("MaxAgeDays", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnMaxAgeDays);
+ this.columnFullAfterN = new global::System.Data.DataColumn("FullAfterN", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnFullAfterN);
+ this.columnAutoCleanup = new global::System.Data.DataColumn("AutoCleanup", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnAutoCleanup);
+ this.columnMapDrives = new global::System.Data.DataColumn("MapDrives", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnMapDrives);
+ this.columnCheckSrc = new global::System.Data.DataColumn("CheckSrc", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnCheckSrc);
+ this.columnTriggerXML = new global::System.Data.DataColumn("TriggerXML", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnTriggerXML);
+ this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
+ this.columnName}, true));
+ this.columnName.AllowDBNull = false;
+ this.columnName.Unique = true;
+ this.columnName.DefaultValue = ((string)("\"\""));
+ this.columnCheckSrc.DefaultValue = ((string)(""));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow NewJobsRow() {
+ return ((JobsRow)(this.NewRow()));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+ return new JobsRow(builder);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Type GetRowType() {
+ return typeof(JobsRow);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanged(e);
+ if ((this.JobsRowChanged != null)) {
+ this.JobsRowChanged(this, new JobsRowChangeEvent(((JobsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanging(e);
+ if ((this.JobsRowChanging != null)) {
+ this.JobsRowChanging(this, new JobsRowChangeEvent(((JobsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleted(e);
+ if ((this.JobsRowDeleted != null)) {
+ this.JobsRowDeleted(this, new JobsRowChangeEvent(((JobsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleting(e);
+ if ((this.JobsRowDeleting != null)) {
+ this.JobsRowDeleting(this, new JobsRowChangeEvent(((JobsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void RemoveJobsRow(JobsRow row) {
+ this.Rows.Remove(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ SchedulerDataSet ds = new SchedulerDataSet();
+ global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+ any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+ any1.MinOccurs = new decimal(0);
+ any1.MaxOccurs = decimal.MaxValue;
+ any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any1);
+ global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+ any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+ any2.MinOccurs = new decimal(1);
+ any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any2);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute1.Name = "namespace";
+ attribute1.FixedValue = ds.Namespace;
+ type.Attributes.Add(attribute1);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute2.Name = "tableTypeName";
+ attribute2.FixedValue = "JobsDataTable";
+ type.Attributes.Add(attribute2);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+ }
+
+ ///
+ ///Represents the strongly named DataTable class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+ public partial class OptionsDataTable : global::System.Data.TypedTableBase {
+
+ private global::System.Data.DataColumn columnName;
+
+ private global::System.Data.DataColumn columnParameter;
+
+ private global::System.Data.DataColumn columnValue;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsDataTable() {
+ this.TableName = "Options";
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal OptionsDataTable(global::System.Data.DataTable table) {
+ this.TableName = table.TableName;
+ if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+ this.CaseSensitive = table.CaseSensitive;
+ }
+ if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+ this.Locale = table.Locale;
+ }
+ if ((table.Namespace != table.DataSet.Namespace)) {
+ this.Namespace = table.Namespace;
+ }
+ this.Prefix = table.Prefix;
+ this.MinimumCapacity = table.MinimumCapacity;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected OptionsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context) {
+ this.InitVars();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn NameColumn {
+ get {
+ return this.columnName;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ParameterColumn {
+ get {
+ return this.columnParameter;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ValueColumn {
+ get {
+ return this.columnValue;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ public int Count {
+ get {
+ return this.Rows.Count;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsRow this[int index] {
+ get {
+ return ((OptionsRow)(this.Rows[index]));
+ }
+ }
+
+ public event OptionsRowChangeEventHandler OptionsRowChanging;
+
+ public event OptionsRowChangeEventHandler OptionsRowChanged;
+
+ public event OptionsRowChangeEventHandler OptionsRowDeleting;
+
+ public event OptionsRowChangeEventHandler OptionsRowDeleted;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void AddOptionsRow(OptionsRow row) {
+ this.Rows.Add(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsRow AddOptionsRow(JobsRow parentJobsRowByJobs_Options, string Parameter, string Value) {
+ OptionsRow rowOptionsRow = ((OptionsRow)(this.NewRow()));
+ object[] columnValuesArray = new object[] {
+ null,
+ Parameter,
+ Value};
+ if ((parentJobsRowByJobs_Options != null)) {
+ columnValuesArray[0] = parentJobsRowByJobs_Options[0];
+ }
+ rowOptionsRow.ItemArray = columnValuesArray;
+ this.Rows.Add(rowOptionsRow);
+ return rowOptionsRow;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataTable Clone() {
+ OptionsDataTable cln = ((OptionsDataTable)(base.Clone()));
+ cln.InitVars();
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataTable CreateInstance() {
+ return new OptionsDataTable();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.columnName = base.Columns["Name"];
+ this.columnParameter = base.Columns["Parameter"];
+ this.columnValue = base.Columns["Value"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnName);
+ this.columnParameter = new global::System.Data.DataColumn("Parameter", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnParameter);
+ this.columnValue = new global::System.Data.DataColumn("Value", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnValue);
+ this.columnName.AllowDBNull = false;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsRow NewOptionsRow() {
+ return ((OptionsRow)(this.NewRow()));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+ return new OptionsRow(builder);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Type GetRowType() {
+ return typeof(OptionsRow);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanged(e);
+ if ((this.OptionsRowChanged != null)) {
+ this.OptionsRowChanged(this, new OptionsRowChangeEvent(((OptionsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanging(e);
+ if ((this.OptionsRowChanging != null)) {
+ this.OptionsRowChanging(this, new OptionsRowChangeEvent(((OptionsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleted(e);
+ if ((this.OptionsRowDeleted != null)) {
+ this.OptionsRowDeleted(this, new OptionsRowChangeEvent(((OptionsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleting(e);
+ if ((this.OptionsRowDeleting != null)) {
+ this.OptionsRowDeleting(this, new OptionsRowChangeEvent(((OptionsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void RemoveOptionsRow(OptionsRow row) {
+ this.Rows.Remove(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ SchedulerDataSet ds = new SchedulerDataSet();
+ global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+ any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+ any1.MinOccurs = new decimal(0);
+ any1.MaxOccurs = decimal.MaxValue;
+ any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any1);
+ global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+ any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+ any2.MinOccurs = new decimal(1);
+ any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any2);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute1.Name = "namespace";
+ attribute1.FixedValue = ds.Namespace;
+ type.Attributes.Add(attribute1);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute2.Name = "tableTypeName";
+ attribute2.FixedValue = "OptionsDataTable";
+ type.Attributes.Add(attribute2);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+ }
+
+ ///
+ ///Represents the strongly named DataTable class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+ public partial class DriveMapsDataTable : global::System.Data.TypedTableBase {
+
+ private global::System.Data.DataColumn columnName;
+
+ private global::System.Data.DataColumn columnDriveLetter;
+
+ private global::System.Data.DataColumn columnUNC;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsDataTable() {
+ this.TableName = "DriveMaps";
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal DriveMapsDataTable(global::System.Data.DataTable table) {
+ this.TableName = table.TableName;
+ if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+ this.CaseSensitive = table.CaseSensitive;
+ }
+ if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+ this.Locale = table.Locale;
+ }
+ if ((table.Namespace != table.DataSet.Namespace)) {
+ this.Namespace = table.Namespace;
+ }
+ this.Prefix = table.Prefix;
+ this.MinimumCapacity = table.MinimumCapacity;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected DriveMapsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context) {
+ this.InitVars();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn NameColumn {
+ get {
+ return this.columnName;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn DriveLetterColumn {
+ get {
+ return this.columnDriveLetter;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn UNCColumn {
+ get {
+ return this.columnUNC;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ public int Count {
+ get {
+ return this.Rows.Count;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsRow this[int index] {
+ get {
+ return ((DriveMapsRow)(this.Rows[index]));
+ }
+ }
+
+ public event DriveMapsRowChangeEventHandler DriveMapsRowChanging;
+
+ public event DriveMapsRowChangeEventHandler DriveMapsRowChanged;
+
+ public event DriveMapsRowChangeEventHandler DriveMapsRowDeleting;
+
+ public event DriveMapsRowChangeEventHandler DriveMapsRowDeleted;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void AddDriveMapsRow(DriveMapsRow row) {
+ this.Rows.Add(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsRow AddDriveMapsRow(JobsRow parentJobsRowByJobs_DriveMaps, string DriveLetter, string UNC) {
+ DriveMapsRow rowDriveMapsRow = ((DriveMapsRow)(this.NewRow()));
+ object[] columnValuesArray = new object[] {
+ null,
+ DriveLetter,
+ UNC};
+ if ((parentJobsRowByJobs_DriveMaps != null)) {
+ columnValuesArray[0] = parentJobsRowByJobs_DriveMaps[0];
+ }
+ rowDriveMapsRow.ItemArray = columnValuesArray;
+ this.Rows.Add(rowDriveMapsRow);
+ return rowDriveMapsRow;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataTable Clone() {
+ DriveMapsDataTable cln = ((DriveMapsDataTable)(base.Clone()));
+ cln.InitVars();
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataTable CreateInstance() {
+ return new DriveMapsDataTable();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.columnName = base.Columns["Name"];
+ this.columnDriveLetter = base.Columns["DriveLetter"];
+ this.columnUNC = base.Columns["UNC"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnName);
+ this.columnDriveLetter = new global::System.Data.DataColumn("DriveLetter", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnDriveLetter);
+ this.columnUNC = new global::System.Data.DataColumn("UNC", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnUNC);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsRow NewDriveMapsRow() {
+ return ((DriveMapsRow)(this.NewRow()));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+ return new DriveMapsRow(builder);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Type GetRowType() {
+ return typeof(DriveMapsRow);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanged(e);
+ if ((this.DriveMapsRowChanged != null)) {
+ this.DriveMapsRowChanged(this, new DriveMapsRowChangeEvent(((DriveMapsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanging(e);
+ if ((this.DriveMapsRowChanging != null)) {
+ this.DriveMapsRowChanging(this, new DriveMapsRowChangeEvent(((DriveMapsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleted(e);
+ if ((this.DriveMapsRowDeleted != null)) {
+ this.DriveMapsRowDeleted(this, new DriveMapsRowChangeEvent(((DriveMapsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleting(e);
+ if ((this.DriveMapsRowDeleting != null)) {
+ this.DriveMapsRowDeleting(this, new DriveMapsRowChangeEvent(((DriveMapsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void RemoveDriveMapsRow(DriveMapsRow row) {
+ this.Rows.Remove(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ SchedulerDataSet ds = new SchedulerDataSet();
+ global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+ any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+ any1.MinOccurs = new decimal(0);
+ any1.MaxOccurs = decimal.MaxValue;
+ any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any1);
+ global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+ any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+ any2.MinOccurs = new decimal(1);
+ any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any2);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute1.Name = "namespace";
+ attribute1.FixedValue = ds.Namespace;
+ type.Attributes.Add(attribute1);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute2.Name = "tableTypeName";
+ attribute2.FixedValue = "DriveMapsDataTable";
+ type.Attributes.Add(attribute2);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+ }
+
+ ///
+ ///Represents the strongly named DataTable class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ [global::System.Serializable()]
+ [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+ public partial class SettingsDataTable : global::System.Data.TypedTableBase {
+
+ private global::System.Data.DataColumn columnLogFileAgeDays;
+
+ private global::System.Data.DataColumn columnChecksum;
+
+ private global::System.Data.DataColumn columnCheckMod;
+
+ private global::System.Data.DataColumn columnShowBubbles;
+
+ private global::System.Data.DataColumn columnCheckSrc;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SettingsDataTable() {
+ this.TableName = "Settings";
+ this.BeginInit();
+ this.InitClass();
+ this.EndInit();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal SettingsDataTable(global::System.Data.DataTable table) {
+ this.TableName = table.TableName;
+ if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+ this.CaseSensitive = table.CaseSensitive;
+ }
+ if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+ this.Locale = table.Locale;
+ }
+ if ((table.Namespace != table.DataSet.Namespace)) {
+ this.Namespace = table.Namespace;
+ }
+ this.Prefix = table.Prefix;
+ this.MinimumCapacity = table.MinimumCapacity;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected SettingsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
+ base(info, context) {
+ this.InitVars();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn LogFileAgeDaysColumn {
+ get {
+ return this.columnLogFileAgeDays;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ChecksumColumn {
+ get {
+ return this.columnChecksum;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn CheckModColumn {
+ get {
+ return this.columnCheckMod;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn ShowBubblesColumn {
+ get {
+ return this.columnShowBubbles;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataColumn CheckSrcColumn {
+ get {
+ return this.columnCheckSrc;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.ComponentModel.Browsable(false)]
+ public int Count {
+ get {
+ return this.Rows.Count;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SettingsRow this[int index] {
+ get {
+ return ((SettingsRow)(this.Rows[index]));
+ }
+ }
+
+ public event SettingsRowChangeEventHandler SettingsRowChanging;
+
+ public event SettingsRowChangeEventHandler SettingsRowChanged;
+
+ public event SettingsRowChangeEventHandler SettingsRowDeleting;
+
+ public event SettingsRowChangeEventHandler SettingsRowDeleted;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void AddSettingsRow(SettingsRow row) {
+ this.Rows.Add(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SettingsRow AddSettingsRow(int LogFileAgeDays, byte[] Checksum, string CheckMod, bool ShowBubbles, bool CheckSrc) {
+ SettingsRow rowSettingsRow = ((SettingsRow)(this.NewRow()));
+ object[] columnValuesArray = new object[] {
+ LogFileAgeDays,
+ Checksum,
+ CheckMod,
+ ShowBubbles,
+ CheckSrc};
+ rowSettingsRow.ItemArray = columnValuesArray;
+ this.Rows.Add(rowSettingsRow);
+ return rowSettingsRow;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public override global::System.Data.DataTable Clone() {
+ SettingsDataTable cln = ((SettingsDataTable)(base.Clone()));
+ cln.InitVars();
+ return cln;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataTable CreateInstance() {
+ return new SettingsDataTable();
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal void InitVars() {
+ this.columnLogFileAgeDays = base.Columns["LogFileAgeDays"];
+ this.columnChecksum = base.Columns["Checksum"];
+ this.columnCheckMod = base.Columns["CheckMod"];
+ this.columnShowBubbles = base.Columns["ShowBubbles"];
+ this.columnCheckSrc = base.Columns["CheckSrc"];
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ private void InitClass() {
+ this.columnLogFileAgeDays = new global::System.Data.DataColumn("LogFileAgeDays", typeof(int), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnLogFileAgeDays);
+ this.columnChecksum = new global::System.Data.DataColumn("Checksum", typeof(byte[]), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnChecksum);
+ this.columnCheckMod = new global::System.Data.DataColumn("CheckMod", typeof(string), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnCheckMod);
+ this.columnShowBubbles = new global::System.Data.DataColumn("ShowBubbles", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnShowBubbles);
+ this.columnCheckSrc = new global::System.Data.DataColumn("CheckSrc", typeof(bool), null, global::System.Data.MappingType.Element);
+ base.Columns.Add(this.columnCheckSrc);
+ this.columnShowBubbles.DefaultValue = ((bool)(true));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SettingsRow NewSettingsRow() {
+ return ((SettingsRow)(this.NewRow()));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+ return new SettingsRow(builder);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override global::System.Type GetRowType() {
+ return typeof(SettingsRow);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanged(e);
+ if ((this.SettingsRowChanged != null)) {
+ this.SettingsRowChanged(this, new SettingsRowChangeEvent(((SettingsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowChanging(e);
+ if ((this.SettingsRowChanging != null)) {
+ this.SettingsRowChanging(this, new SettingsRowChangeEvent(((SettingsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleted(e);
+ if ((this.SettingsRowDeleted != null)) {
+ this.SettingsRowDeleted(this, new SettingsRowChangeEvent(((SettingsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+ base.OnRowDeleting(e);
+ if ((this.SettingsRowDeleting != null)) {
+ this.SettingsRowDeleting(this, new SettingsRowChangeEvent(((SettingsRow)(e.Row)), e.Action));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void RemoveSettingsRow(SettingsRow row) {
+ this.Rows.Remove(row);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+ global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+ global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+ SchedulerDataSet ds = new SchedulerDataSet();
+ global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+ any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+ any1.MinOccurs = new decimal(0);
+ any1.MaxOccurs = decimal.MaxValue;
+ any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any1);
+ global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+ any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+ any2.MinOccurs = new decimal(1);
+ any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+ sequence.Items.Add(any2);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute1.Name = "namespace";
+ attribute1.FixedValue = ds.Namespace;
+ type.Attributes.Add(attribute1);
+ global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+ attribute2.Name = "tableTypeName";
+ attribute2.FixedValue = "SettingsDataTable";
+ type.Attributes.Add(attribute2);
+ type.Particle = sequence;
+ global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+ if (xs.Contains(dsSchema.TargetNamespace)) {
+ global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+ global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+ try {
+ global::System.Xml.Schema.XmlSchema schema = null;
+ dsSchema.Write(s1);
+ for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+ schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+ s2.SetLength(0);
+ schema.Write(s2);
+ if ((s1.Length == s2.Length)) {
+ s1.Position = 0;
+ s2.Position = 0;
+ for (; ((s1.Position != s1.Length)
+ && (s1.ReadByte() == s2.ReadByte())); ) {
+ ;
+ }
+ if ((s1.Position == s1.Length)) {
+ return type;
+ }
+ }
+ }
+ }
+ finally {
+ if ((s1 != null)) {
+ s1.Close();
+ }
+ if ((s2 != null)) {
+ s2.Close();
+ }
+ }
+ }
+ xs.Add(dsSchema);
+ return type;
+ }
+ }
+
+ ///
+ ///Represents strongly named DataRow class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public partial class JobsRow : global::System.Data.DataRow {
+
+ private JobsDataTable tableJobs;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal JobsRow(global::System.Data.DataRowBuilder rb) :
+ base(rb) {
+ this.tableJobs = ((JobsDataTable)(this.Table));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Name {
+ get {
+ return ((string)(this[this.tableJobs.NameColumn]));
+ }
+ set {
+ this[this.tableJobs.NameColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Source {
+ get {
+ if (this.IsSourceNull()) {
+ return string.Empty;
+ }
+ else {
+ return ((string)(this[this.tableJobs.SourceColumn]));
+ }
+ }
+ set {
+ this[this.tableJobs.SourceColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Destination {
+ get {
+ if (this.IsDestinationNull()) {
+ return string.Empty;
+ }
+ else {
+ return ((string)(this[this.tableJobs.DestinationColumn]));
+ }
+ }
+ set {
+ this[this.tableJobs.DestinationColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool FullOnly {
+ get {
+ try {
+ return ((bool)(this[this.tableJobs.FullOnlyColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'FullOnly\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.FullOnlyColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int FullRepeatDays {
+ get {
+ try {
+ return ((int)(this[this.tableJobs.FullRepeatDaysColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'FullRepeatDays\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.FullRepeatDaysColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public byte[] LocalChecksum {
+ get {
+ try {
+ return ((byte[])(this[this.tableJobs.LocalChecksumColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'LocalChecksum\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.LocalChecksumColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string LocalCheckMod {
+ get {
+ try {
+ return ((string)(this[this.tableJobs.LocalCheckModColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'LocalCheckMod\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.LocalCheckModColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Filter {
+ get {
+ try {
+ return ((string)(this[this.tableJobs.FilterColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Filter\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.FilterColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int MaxFulls {
+ get {
+ try {
+ return ((int)(this[this.tableJobs.MaxFullsColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'MaxFulls\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.MaxFullsColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int MaxAgeDays {
+ get {
+ try {
+ return ((int)(this[this.tableJobs.MaxAgeDaysColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'MaxAgeDays\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.MaxAgeDaysColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int FullAfterN {
+ get {
+ try {
+ return ((int)(this[this.tableJobs.FullAfterNColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'FullAfterN\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.FullAfterNColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool AutoCleanup {
+ get {
+ try {
+ return ((bool)(this[this.tableJobs.AutoCleanupColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'AutoCleanup\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.AutoCleanupColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool MapDrives {
+ get {
+ try {
+ return ((bool)(this[this.tableJobs.MapDrivesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'MapDrives\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.MapDrivesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string CheckSrc {
+ get {
+ if (this.IsCheckSrcNull()) {
+ return string.Empty;
+ }
+ else {
+ return ((string)(this[this.tableJobs.CheckSrcColumn]));
+ }
+ }
+ set {
+ this[this.tableJobs.CheckSrcColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string TriggerXML {
+ get {
+ try {
+ return ((string)(this[this.tableJobs.TriggerXMLColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'TriggerXML\' in table \'Jobs\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableJobs.TriggerXMLColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsSourceNull() {
+ return this.IsNull(this.tableJobs.SourceColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetSourceNull() {
+ this[this.tableJobs.SourceColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsDestinationNull() {
+ return this.IsNull(this.tableJobs.DestinationColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetDestinationNull() {
+ this[this.tableJobs.DestinationColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsFullOnlyNull() {
+ return this.IsNull(this.tableJobs.FullOnlyColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetFullOnlyNull() {
+ this[this.tableJobs.FullOnlyColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsFullRepeatDaysNull() {
+ return this.IsNull(this.tableJobs.FullRepeatDaysColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetFullRepeatDaysNull() {
+ this[this.tableJobs.FullRepeatDaysColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsLocalChecksumNull() {
+ return this.IsNull(this.tableJobs.LocalChecksumColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetLocalChecksumNull() {
+ this[this.tableJobs.LocalChecksumColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsLocalCheckModNull() {
+ return this.IsNull(this.tableJobs.LocalCheckModColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetLocalCheckModNull() {
+ this[this.tableJobs.LocalCheckModColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsFilterNull() {
+ return this.IsNull(this.tableJobs.FilterColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetFilterNull() {
+ this[this.tableJobs.FilterColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsMaxFullsNull() {
+ return this.IsNull(this.tableJobs.MaxFullsColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetMaxFullsNull() {
+ this[this.tableJobs.MaxFullsColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsMaxAgeDaysNull() {
+ return this.IsNull(this.tableJobs.MaxAgeDaysColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetMaxAgeDaysNull() {
+ this[this.tableJobs.MaxAgeDaysColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsFullAfterNNull() {
+ return this.IsNull(this.tableJobs.FullAfterNColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetFullAfterNNull() {
+ this[this.tableJobs.FullAfterNColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsAutoCleanupNull() {
+ return this.IsNull(this.tableJobs.AutoCleanupColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetAutoCleanupNull() {
+ this[this.tableJobs.AutoCleanupColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsMapDrivesNull() {
+ return this.IsNull(this.tableJobs.MapDrivesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetMapDrivesNull() {
+ this[this.tableJobs.MapDrivesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsCheckSrcNull() {
+ return this.IsNull(this.tableJobs.CheckSrcColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetCheckSrcNull() {
+ this[this.tableJobs.CheckSrcColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsTriggerXMLNull() {
+ return this.IsNull(this.tableJobs.TriggerXMLColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetTriggerXMLNull() {
+ this[this.tableJobs.TriggerXMLColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsRow[] GetOptionsRows() {
+ if ((this.Table.ChildRelations["Jobs_Options"] == null)) {
+ return new OptionsRow[0];
+ }
+ else {
+ return ((OptionsRow[])(base.GetChildRows(this.Table.ChildRelations["Jobs_Options"])));
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsRow[] GetDriveMapsRows() {
+ if ((this.Table.ChildRelations["Jobs_DriveMaps"] == null)) {
+ return new DriveMapsRow[0];
+ }
+ else {
+ return ((DriveMapsRow[])(base.GetChildRows(this.Table.ChildRelations["Jobs_DriveMaps"])));
+ }
+ }
+ }
+
+ ///
+ ///Represents strongly named DataRow class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public partial class OptionsRow : global::System.Data.DataRow {
+
+ private OptionsDataTable tableOptions;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal OptionsRow(global::System.Data.DataRowBuilder rb) :
+ base(rb) {
+ this.tableOptions = ((OptionsDataTable)(this.Table));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Name {
+ get {
+ return ((string)(this[this.tableOptions.NameColumn]));
+ }
+ set {
+ this[this.tableOptions.NameColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Parameter {
+ get {
+ if (this.IsParameterNull()) {
+ return string.Empty;
+ }
+ else {
+ return ((string)(this[this.tableOptions.ParameterColumn]));
+ }
+ }
+ set {
+ this[this.tableOptions.ParameterColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Value {
+ get {
+ if (this.IsValueNull()) {
+ return string.Empty;
+ }
+ else {
+ return ((string)(this[this.tableOptions.ValueColumn]));
+ }
+ }
+ set {
+ this[this.tableOptions.ValueColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow JobsRow {
+ get {
+ return ((JobsRow)(this.GetParentRow(this.Table.ParentRelations["Jobs_Options"])));
+ }
+ set {
+ this.SetParentRow(value, this.Table.ParentRelations["Jobs_Options"]);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsParameterNull() {
+ return this.IsNull(this.tableOptions.ParameterColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetParameterNull() {
+ this[this.tableOptions.ParameterColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsValueNull() {
+ return this.IsNull(this.tableOptions.ValueColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetValueNull() {
+ this[this.tableOptions.ValueColumn] = global::System.Convert.DBNull;
+ }
+ }
+
+ ///
+ ///Represents strongly named DataRow class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public partial class DriveMapsRow : global::System.Data.DataRow {
+
+ private DriveMapsDataTable tableDriveMaps;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal DriveMapsRow(global::System.Data.DataRowBuilder rb) :
+ base(rb) {
+ this.tableDriveMaps = ((DriveMapsDataTable)(this.Table));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string Name {
+ get {
+ try {
+ return ((string)(this[this.tableDriveMaps.NameColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Name\' in table \'DriveMaps\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableDriveMaps.NameColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string DriveLetter {
+ get {
+ try {
+ return ((string)(this[this.tableDriveMaps.DriveLetterColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'DriveLetter\' in table \'DriveMaps\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableDriveMaps.DriveLetterColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string UNC {
+ get {
+ try {
+ return ((string)(this[this.tableDriveMaps.UNCColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'UNC\' in table \'DriveMaps\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableDriveMaps.UNCColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow JobsRow {
+ get {
+ return ((JobsRow)(this.GetParentRow(this.Table.ParentRelations["Jobs_DriveMaps"])));
+ }
+ set {
+ this.SetParentRow(value, this.Table.ParentRelations["Jobs_DriveMaps"]);
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsNameNull() {
+ return this.IsNull(this.tableDriveMaps.NameColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetNameNull() {
+ this[this.tableDriveMaps.NameColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsDriveLetterNull() {
+ return this.IsNull(this.tableDriveMaps.DriveLetterColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetDriveLetterNull() {
+ this[this.tableDriveMaps.DriveLetterColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsUNCNull() {
+ return this.IsNull(this.tableDriveMaps.UNCColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetUNCNull() {
+ this[this.tableDriveMaps.UNCColumn] = global::System.Convert.DBNull;
+ }
+ }
+
+ ///
+ ///Represents strongly named DataRow class.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public partial class SettingsRow : global::System.Data.DataRow {
+
+ private SettingsDataTable tableSettings;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ internal SettingsRow(global::System.Data.DataRowBuilder rb) :
+ base(rb) {
+ this.tableSettings = ((SettingsDataTable)(this.Table));
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public int LogFileAgeDays {
+ get {
+ try {
+ return ((int)(this[this.tableSettings.LogFileAgeDaysColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'LogFileAgeDays\' in table \'Settings\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableSettings.LogFileAgeDaysColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public byte[] Checksum {
+ get {
+ try {
+ return ((byte[])(this[this.tableSettings.ChecksumColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'Checksum\' in table \'Settings\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableSettings.ChecksumColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public string CheckMod {
+ get {
+ try {
+ return ((string)(this[this.tableSettings.CheckModColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'CheckMod\' in table \'Settings\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableSettings.CheckModColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool ShowBubbles {
+ get {
+ try {
+ return ((bool)(this[this.tableSettings.ShowBubblesColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'ShowBubbles\' in table \'Settings\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableSettings.ShowBubblesColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool CheckSrc {
+ get {
+ try {
+ return ((bool)(this[this.tableSettings.CheckSrcColumn]));
+ }
+ catch (global::System.InvalidCastException e) {
+ throw new global::System.Data.StrongTypingException("The value for column \'CheckSrc\' in table \'Settings\' is DBNull.", e);
+ }
+ }
+ set {
+ this[this.tableSettings.CheckSrcColumn] = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsLogFileAgeDaysNull() {
+ return this.IsNull(this.tableSettings.LogFileAgeDaysColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetLogFileAgeDaysNull() {
+ this[this.tableSettings.LogFileAgeDaysColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsChecksumNull() {
+ return this.IsNull(this.tableSettings.ChecksumColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetChecksumNull() {
+ this[this.tableSettings.ChecksumColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsCheckModNull() {
+ return this.IsNull(this.tableSettings.CheckModColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetCheckModNull() {
+ this[this.tableSettings.CheckModColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsShowBubblesNull() {
+ return this.IsNull(this.tableSettings.ShowBubblesColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetShowBubblesNull() {
+ this[this.tableSettings.ShowBubblesColumn] = global::System.Convert.DBNull;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public bool IsCheckSrcNull() {
+ return this.IsNull(this.tableSettings.CheckSrcColumn);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public void SetCheckSrcNull() {
+ this[this.tableSettings.CheckSrcColumn] = global::System.Convert.DBNull;
+ }
+ }
+
+ ///
+ ///Row event argument class
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public class JobsRowChangeEvent : global::System.EventArgs {
+
+ private JobsRow eventRow;
+
+ private global::System.Data.DataRowAction eventAction;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRowChangeEvent(JobsRow row, global::System.Data.DataRowAction action) {
+ this.eventRow = row;
+ this.eventAction = action;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public JobsRow Row {
+ get {
+ return this.eventRow;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataRowAction Action {
+ get {
+ return this.eventAction;
+ }
+ }
+ }
+
+ ///
+ ///Row event argument class
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public class OptionsRowChangeEvent : global::System.EventArgs {
+
+ private OptionsRow eventRow;
+
+ private global::System.Data.DataRowAction eventAction;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsRowChangeEvent(OptionsRow row, global::System.Data.DataRowAction action) {
+ this.eventRow = row;
+ this.eventAction = action;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public OptionsRow Row {
+ get {
+ return this.eventRow;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataRowAction Action {
+ get {
+ return this.eventAction;
+ }
+ }
+ }
+
+ ///
+ ///Row event argument class
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public class DriveMapsRowChangeEvent : global::System.EventArgs {
+
+ private DriveMapsRow eventRow;
+
+ private global::System.Data.DataRowAction eventAction;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsRowChangeEvent(DriveMapsRow row, global::System.Data.DataRowAction action) {
+ this.eventRow = row;
+ this.eventAction = action;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public DriveMapsRow Row {
+ get {
+ return this.eventRow;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataRowAction Action {
+ get {
+ return this.eventAction;
+ }
+ }
+ }
+
+ ///
+ ///Row event argument class
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
+ public class SettingsRowChangeEvent : global::System.EventArgs {
+
+ private SettingsRow eventRow;
+
+ private global::System.Data.DataRowAction eventAction;
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SettingsRowChangeEvent(SettingsRow row, global::System.Data.DataRowAction action) {
+ this.eventRow = row;
+ this.eventAction = action;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public SettingsRow Row {
+ get {
+ return this.eventRow;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.Data.DataRowAction Action {
+ get {
+ return this.eventAction;
+ }
+ }
+ }
+ }
+}
+
+#pragma warning restore 1591
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/SchedulerDataSet.cs b/Duplicati/Scheduler/Data/SchedulerDataSet.cs
new file mode 100644
index 000000000..f1efe6b8a
--- /dev/null
+++ b/Duplicati/Scheduler/Data/SchedulerDataSet.cs
@@ -0,0 +1,6 @@
+namespace Duplicati.Scheduler.Data {
+
+
+ public partial class SchedulerDataSet {
+ }
+}
diff --git a/Duplicati/Scheduler/Data/SchedulerDataSet.xsc b/Duplicati/Scheduler/Data/SchedulerDataSet.xsc
new file mode 100644
index 000000000..551fc56fb
--- /dev/null
+++ b/Duplicati/Scheduler/Data/SchedulerDataSet.xsc
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/SchedulerDataSet.xsd b/Duplicati/Scheduler/Data/SchedulerDataSet.xsd
new file mode 100644
index 000000000..1f708337e
--- /dev/null
+++ b/Duplicati/Scheduler/Data/SchedulerDataSet.xsd
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/SchedulerDataSet.xss b/Duplicati/Scheduler/Data/SchedulerDataSet.xss
new file mode 100644
index 000000000..c6cd0ffb7
--- /dev/null
+++ b/Duplicati/Scheduler/Data/SchedulerDataSet.xss
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 344
+ 99
+
+
+ 344
+ 82
+
+
+ 456
+ 82
+
+
+
+
+
+
+ 361
+ 288
+
+
+ 558
+ 288
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Data/SchedulerDataSetSupport.cs b/Duplicati/Scheduler/Data/SchedulerDataSetSupport.cs
new file mode 100644
index 000000000..2cea679d8
--- /dev/null
+++ b/Duplicati/Scheduler/Data/SchedulerDataSetSupport.cs
@@ -0,0 +1,386 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Duplicati.Scheduler.Data
+{
+ ///
+ /// Tools for the Scheduler DataSet
+ ///
+ public partial class SchedulerDataSet
+ {
+ ///
+ /// The last time we loaded the XML file
+ ///
+ public DateTime LastLoaded { get; set; }
+ ///
+ /// a Kinda good user time format
+ ///
+ public static string DateFormat = "ddd MM/dd/yyy hh:mm tt";
+ ///
+ /// Makes sure the path exists and returns it
+ ///
+ /// File to combine with app path
+ /// Full path with file name
+ public static string GetAppData(string aFileName)
+ {
+ string Result = Utility.User.GetApplicationDirectory( @"Duplicati" );
+ if (!System.IO.Directory.Exists(Result)) System.IO.Directory.CreateDirectory(Result);
+ return System.IO.Path.Combine(Result, aFileName);
+ }
+ ///
+ /// Returns the delfault XML file name with path
+ ///
+ /// The delfault XML file name with path
+ public static string DefaultPath() { return GetAppData(DefaultName); }
+ ///
+ /// The XML file last loaded
+ ///
+ public string XMLPath { get; set; }
+ ///
+ /// The default XML file without path
+ ///
+ public const string DefaultName = "Scheduler.xml";
+ ///
+ /// Load the default XML file
+ ///
+ /// null if OK or exception thrown
+ public Exception Load()
+ {
+ return Load(string.Empty);
+ }
+ ///
+ /// Checks to see if the XML file changed since we last loaded
+ ///
+ /// true if the file is younger than the last load
+ public bool NeedsLoading()
+ {
+ return NeedsLoading(GetAppData(DefaultName));
+ }
+ ///
+ /// Checks to see if the XML file changed since we last loaded
+ ///
+ /// File to check
+ /// true if the file is younger than the last load
+ public bool NeedsLoading(string aFullPath)
+ {
+ if (LastLoaded == null) return false;
+ DateTime LastWrite = (new System.IO.FileInfo(aFullPath)).LastWriteTime;
+ return LastLoaded != LastWrite;
+ }
+ ///
+ /// Load from a file
+ ///
+ /// File to load or use default if null or empty
+ /// null if OK or exception thrown
+ public Exception Load(string aFullPath)
+ {
+ if (string.IsNullOrEmpty(aFullPath)) aFullPath = DefaultPath();
+ if (!System.IO.File.Exists(aFullPath)) return new Exception("File not found: " + aFullPath);
+ this.Clear();
+ Exception Result = null;
+ try
+ {
+ this.ReadXml(aFullPath);
+ XMLPath = aFullPath;
+ LastLoaded = (new System.IO.FileInfo(aFullPath)).LastWriteTime;
+ }
+ catch (Exception Ex)
+ {
+ Result = Ex;
+ }
+ return Result;
+ }
+ ///
+ /// Saves the dataset to the default XML file
+ ///
+ /// null if OK or exception thrown
+ public Exception Save()
+ {
+ return Save(GetAppData(DefaultName));
+ }
+ ///
+ /// Loads the database
+ ///
+ /// XML file to load
+ /// null if OK or exception thrown
+ public Exception Save(string aFullPath)
+ {
+ Exception Result = null;
+ try
+ {
+ this.WriteXml(aFullPath);
+ LastLoaded = (new System.IO.FileInfo(aFullPath)).LastWriteTime;
+ }
+ catch (Exception Ex)
+ {
+ Result = Ex;
+ }
+ return Result;
+ }
+ ///
+ /// Tools for the row
+ ///
+ public partial class JobsRow
+ {
+ ///
+ /// Returns the Options
+ ///
+ public Dictionary Options
+ {
+ get
+ {
+ Dictionary Result = (from OptionsRow qRow in this.GetOptionsRows()
+ select new { Key = qRow.Parameter, Value = qRow.Value }).
+ ToDictionary(n => n.Key, n => n.Value);
+ if (GetCheckSrc() == 0 || Checksum.Length == 0) Result["no-encryption"] = string.Empty;
+ else Result["Checksum"] = System.Convert.ToBase64String(Checksum);
+ if (!string.IsNullOrEmpty(Filter))
+ Result["Filter"] = Filter;
+ return Result;
+ }
+ }
+ ///
+ /// This is only local and is not saved in XML - Enabled should be fetched from the trigger
+ /// But, this is used for temporary storage by the editor
+ ///
+ public bool Enabled { get; set; }
+ ///
+ /// Separator used in Filters
+ ///
+ public const char Separator = (char)3; // ETX
+ ///
+ /// Filters as a string array
+ ///
+ public string[] FilterLines
+ {
+ get
+ {
+ if (this.IsFilterNull() || string.IsNullOrEmpty(this.Filter)) return new string[0];
+ return this.Filter.Split(Separator);
+ }
+ set
+ {
+ if (value == null || value.Length == 0) Filter = string.Empty;
+ else Filter = string.Join(Separator.ToString(), value);
+ }
+ }
+ ///
+ /// Save as options
+ ///
+ /// Options to save
+ /// OK if saved
+ public bool SetOptions(Dictionary aOptions)
+ {
+ System.Data.DataRelation dr = this.tableJobs.ChildRelations["Jobs_Options"];
+ if (dr == null) return false;
+ SchedulerDataSet.OptionsDataTable ChildTable = (SchedulerDataSet.OptionsDataTable)dr.ChildTable;
+ foreach (SchedulerDataSet.OptionsRow Row in this.GetOptionsRows())
+ Row.Delete();
+ foreach (KeyValuePair kvp in aOptions)
+ ChildTable.AddOptionsRow(this, kvp.Key, kvp.Value);
+ return true;
+ }
+ ///
+ /// Creates a task name for this job
+ ///
+ /// Job Name
+ /// User Name with Domain
+ /// Task Name
+ public static string MakeTaskName(string aName, string aUserName)
+ {
+ return "DUP." + aName + '.' + aUserName.Replace('\\', '.');
+ }
+ ///
+ /// Returns the Task Name for this job
+ ///
+ public string TaskName
+ {
+ get { return MakeTaskName(this.Name, Utility.User.UserName); }
+ }
+ ///
+ /// Returns the settings row for this job
+ ///
+ private SettingsRow Settings { get { return ((SchedulerDataSet)this.Table.DataSet).Settings.Values; } }
+ ///
+ /// Returns the Check Source [0==none, 1==Local, 2==global]
+ ///
+ /// Check Source [0==none, 1==Local, 2==global]
+ public int GetCheckSrc()
+ {
+ if (this.IsCheckSrcNull() || string.IsNullOrEmpty(this.CheckSrc) || this.CheckSrc.Equals("none", StringComparison.InvariantCultureIgnoreCase))
+ return 0;
+ else if (this.CheckSrc.StartsWith("g", StringComparison.InvariantCultureIgnoreCase))
+ return 2;
+ return 1;
+ }
+ ///
+ /// Sets the check source [0==none, 1==Local, 2==global]
+ ///
+ /// [0==none, 1==Local, 2==global]
+ public void SetCheckSrc(int aSet)
+ {
+ this.CheckSrc = new string[] { "none", "local", "global" }[aSet & 3];
+ }
+ ///
+ /// Returns checksum based on source
+ ///
+ public byte[] Checksum
+ {
+ get
+ {
+ switch (GetCheckSrc())
+ {
+ case 0: return new byte[0];
+ case 2: return Settings.Checksum;
+ default: return LocalChecksum;
+ }
+ }
+ set { this.LocalChecksum = value; }
+ }
+ ///
+ /// Returns the Check Module based on Source
+ ///
+ public string CheckMod
+ {
+ get
+ {
+ switch (GetCheckSrc())
+ {
+ case 0: return string.Empty;
+ case 2: return ((SchedulerDataSet)this.Table.DataSet).Settings.Values.CheckMod;
+ default: return LocalCheckMod;
+ }
+ }
+ set { this.LocalCheckMod = value; }
+ }
+ ///
+ /// Drive mappings at time of last save
+ ///
+ public Dictionary DriveMaps
+ {
+ get
+ {
+ Dictionary Result = new Dictionary();
+ foreach (DriveMapsRow Row in GetDriveMapsRows())
+ Result.Add(Row.DriveLetter, Row.UNC);
+ return Result;
+ }
+ }
+ ///
+ /// Creates the drive map table
+ ///
+ /// Map to save
+ /// true if saved OK
+ public bool SetDriveMaps(Dictionary aDriveMap)
+ {
+ System.Data.DataRelation dr = this.tableJobs.ChildRelations["Jobs_DriveMaps"];
+ if (dr == null) return false;
+ SchedulerDataSet.DriveMapsDataTable ChildTable = (SchedulerDataSet.DriveMapsDataTable)dr.ChildTable;
+ foreach (SchedulerDataSet.DriveMapsRow Row in this.GetDriveMapsRows())
+ Row.Delete();
+ foreach (KeyValuePair kvp in aDriveMap)
+ ChildTable.AddDriveMapsRow(this, kvp.Key, kvp.Value);
+ return true;
+ }
+ ///
+ /// Delete this job
+ ///
+ public new void Delete()
+ {
+ // Get rid of the options
+ foreach (OptionsRow oRow in GetOptionsRows())
+ oRow.Delete();
+ // And the maps
+ foreach (DriveMapsRow dRow in GetDriveMapsRows())
+ dRow.Delete();
+ // And the history
+ using(HistoryDataSet hds = new HistoryDataSet())
+ {
+ hds.Load();
+ hds.History.DeleteJob(this.Name);
+ foreach( HistoryDataSet.HistoryRow hRow in hds.History.Select("Name = '"+this.Name+'\''))
+ hRow.Delete();
+ hds.Save();
+ }
+ base.Delete();
+ }
+ }
+ ///
+ /// Data table tools
+ ///
+ public partial class JobsDataTable
+ {
+ ///
+ /// Get options
+ ///
+ /// Job name
+ /// Options
+ public Dictionary GetOptions(string aName)
+ {
+ JobsRow Row = this.FindByName(aName);
+ if (Row == null) return new Dictionary();
+ return Row.Options;
+ }
+ ///
+ /// Create a new row with defaults
+ ///
+ ///
+ ///
+ public SchedulerDataSet.JobsRow NewJobsRow(string aName)
+ {
+ SchedulerDataSet.JobsRow Result = NewJobsRow();
+ Result.Name = aName;
+ Result.CheckMod = string.Empty;
+ Result.Checksum = new byte[0];
+ Result.Destination = string.Empty;
+ Result.Filter = string.Empty;
+ Result.FullOnly = false;
+ Result.FullRepeatDays = 10;
+ Result.FullAfterN = 8;
+ Result.MaxAgeDays = 0;
+ Result.MaxFulls = 4;
+ Result.Source = string.Empty;
+ Result.MapDrives = true;
+ Result.AutoCleanup = true;
+ return Result;
+ }
+ }
+ ///
+ /// Settings
+ ///
+ public partial class SettingsDataTable
+ {
+ ///
+ /// Only 1st row used
+ ///
+ public SettingsRow Values
+ {
+ get
+ {
+ if (this.Count == 0)
+ this.AddSettingsRow(0, new byte[0], string.Empty, true, false);
+ return (SettingsRow)this.Rows[0];
+ }
+ }
+ ///
+ /// Is the global password set?
+ ///
+ public bool UseGlobalPassword { get { return Values.CheckSrc && Values.Checksum.Length > 0; } }
+ }
+ ///
+ /// Options
+ ///
+ public partial class OptionsDataTable
+ {
+ ///
+ /// As dictionary
+ ///
+ public Dictionary OptionsDict
+ {
+ get { return (from OptionsRow qRow in this select new { Key = qRow.Parameter, Value = qRow.Value }).ToDictionary(n => n.Key, n => n.Value); }
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Duplicati.Scheduler.csproj b/Duplicati/Scheduler/Duplicati.Scheduler.csproj
new file mode 100644
index 000000000..7d7d80866
--- /dev/null
+++ b/Duplicati/Scheduler/Duplicati.Scheduler.csproj
@@ -0,0 +1,284 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {D1D503E8-5CF7-413B-81FB-403D65B43AAB}
+ WinExe
+ Properties
+ Duplicati.Scheduler
+ Duplicati.Scheduler
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.exe
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Backend.File.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Backend.FTP.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Backend.SSH.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Compression.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.DynamicLoader.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Interface.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Logging.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Main.dll
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\Duplicati.Library.Utility.dll
+
+
+
+ False
+ ..\..\thirdparty\TaskScheduler\Microsoft.Win32.TaskScheduler.dll
+
+
+
+ 3.5
+
+
+
+
+ False
+ ..\..\..\..\Program Files\Duplicati\System.Windows.Forms.Wizard.dll
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+ Form
+
+
+ AdvancedDialog.cs
+
+
+ Form
+
+
+ BackupListDialog.cs
+
+
+ Form
+
+
+ EnterPassDialog.cs
+
+
+ Form
+
+
+ FileListDialog.cs
+
+
+ Form
+
+
+ FilterDialog.cs
+
+
+ Form
+
+
+ FilterHelp.cs
+
+
+ Form
+
+
+ FolderBrowserDialog.cs
+
+
+ UserControl
+
+
+ TaskEditControl.cs
+
+
+ UserControl
+
+
+ JobSummary.cs
+
+
+ Form
+
+
+ LogView.cs
+
+
+ UserControl
+
+
+ PasswordControl.cs
+
+
+
+
+
+ AdvancedDialog.cs
+
+
+ BackupListDialog.cs
+
+
+ EnterPassDialog.cs
+
+
+ FileListDialog.cs
+
+
+ FilterDialog.cs
+
+
+ FilterHelp.cs
+
+
+ FolderBrowserDialog.cs
+
+
+ TaskEditControl.cs
+
+
+ JobSummary.cs
+
+
+ LogView.cs
+
+
+ PasswordControl.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ Scheduler.cs
+
+
+ JobDialog.cs
+
+
+ SchedulerNameDialog.cs
+
+
+ SettingsDialog.cs
+
+
+ True
+ Resources.resx
+
+
+ PreserveNewest
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+ Form
+
+
+ Scheduler.cs
+
+
+ Form
+
+
+ JobDialog.cs
+
+
+ Form
+
+
+ SchedulerNameDialog.cs
+
+
+ Form
+
+
+ SettingsDialog.cs
+
+
+
+
+
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}
+ Utility
+
+
+ {520FA2BD-1C59-40D9-BCB5-EDA11327B7F0}
+ Duplicati.RunBackup
+
+
+ {C8F0DD19-E242-4E9C-A707-2FFADE8D7970}
+ Duplicati.Scheduler.Data
+
+
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/EnterPassDialog.Designer.cs b/Duplicati/Scheduler/EnterPassDialog.Designer.cs
new file mode 100644
index 000000000..031188c47
--- /dev/null
+++ b/Duplicati/Scheduler/EnterPassDialog.Designer.cs
@@ -0,0 +1,82 @@
+namespace Duplicati.Scheduler
+{
+ partial class EnterPassDialog
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.button1 = new System.Windows.Forms.Button();
+ this.secureTextBox1 = new Utility.SecureTextBox();
+ this.SuspendLayout();
+ //
+ // button1
+ //
+ this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.button1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.button1.FlatAppearance.BorderSize = 0;
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button1.Location = new System.Drawing.Point(0, 0);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(224, 31);
+ this.button1.TabIndex = 2;
+ this.button1.Text = "Enter current password:";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // secureTextBox1
+ //
+ this.secureTextBox1.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.secureTextBox1.Location = new System.Drawing.Point(0, 32);
+ this.secureTextBox1.Name = "secureTextBox1";
+ this.secureTextBox1.ShortcutsEnabled = false;
+ this.secureTextBox1.Size = new System.Drawing.Size(224, 27);
+ this.secureTextBox1.TabIndex = 1;
+ this.secureTextBox1.UseSystemPasswordChar = true;
+ //
+ // EnterPassDialog
+ //
+ this.AcceptButton = this.button1;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.button1;
+ this.ClientSize = new System.Drawing.Size(224, 59);
+ this.Controls.Add(this.button1);
+ this.Controls.Add(this.secureTextBox1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.Name = "EnterPassDialog";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private Utility.SecureTextBox secureTextBox1;
+ private System.Windows.Forms.Button button1;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/EnterPassDialog.cs b/Duplicati/Scheduler/EnterPassDialog.cs
new file mode 100644
index 000000000..91ff1bf75
--- /dev/null
+++ b/Duplicati/Scheduler/EnterPassDialog.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// A dialog for entering passwords that is somewhat secure
+ ///
+ public partial class EnterPassDialog : Form
+ {
+ ///
+ /// A dialog for entering passwords that is somewhat secure
+ ///
+ public EnterPassDialog()
+ {
+ InitializeComponent();
+ Value = new System.Security.SecureString();
+ }
+ ///
+ /// The entered password
+ ///
+ public System.Security.SecureString Value { get; set; }
+ ///
+ /// The entered password as a protected string
+ ///
+ public byte[] ProtectedValue { get; set; }
+ ///
+ /// The OK button (is hidden, triggered by [ENTER])
+ ///
+ private void button1_Click(object sender, EventArgs e)
+ {
+ Value = this.secureTextBox1.Value;
+ ProtectedValue = this.secureTextBox1.ProtectedValue;
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+ ///
+ /// A static "ShowDialog" that gets the password as a secure string
+ ///
+ /// Entered password as a secure string
+ public static System.Security.SecureString FetchPassword()
+ {
+ EnterPassDialog ed = new EnterPassDialog();
+ ed.ShowDialog();
+ return ed.Value;
+ }
+ ///
+ /// A static "ShowDialog" that gets the password as a protected string
+ ///
+ /// Entered password as a protected string
+ public static byte[] FetchProtectedPassword()
+ {
+ EnterPassDialog ed = new EnterPassDialog();
+ ed.ShowDialog();
+ return ed.ProtectedValue;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/EnterPassDialog.resx b/Duplicati/Scheduler/EnterPassDialog.resx
new file mode 100644
index 000000000..ff31a6db5
--- /dev/null
+++ b/Duplicati/Scheduler/EnterPassDialog.resx
@@ -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
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FileListDialog.Designer.cs b/Duplicati/Scheduler/FileListDialog.Designer.cs
new file mode 100644
index 000000000..c91094394
--- /dev/null
+++ b/Duplicati/Scheduler/FileListDialog.Designer.cs
@@ -0,0 +1,171 @@
+namespace Duplicati.Scheduler
+{
+ partial class FileListDialog
+ {
+ ///
+ /// 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 Windows Form 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(FileListDialog));
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
+ this.RestoreToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.treeView = new System.Windows.Forms.TreeView();
+ this.progressBar = new System.Windows.Forms.ProgressBar();
+ this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
+ this.ProgressGroupBox = new System.Windows.Forms.GroupBox();
+ this.MessageTextBox = new System.Windows.Forms.TextBox();
+ this.TimeToolStripLabel = new System.Windows.Forms.ToolStripLabel();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStrip1.SuspendLayout();
+ this.ProgressGroupBox.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripLabel1,
+ this.RestoreToolStripButton,
+ this.toolStripSeparator1,
+ this.TimeToolStripLabel});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.Size = new System.Drawing.Size(624, 25);
+ this.toolStrip1.TabIndex = 0;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // toolStripLabel1
+ //
+ this.toolStripLabel1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripLabel1.Name = "toolStripLabel1";
+ this.toolStripLabel1.Size = new System.Drawing.Size(86, 22);
+ this.toolStripLabel1.Text = "toolStripLabel1";
+ //
+ // RestoreToolStripButton
+ //
+ this.RestoreToolStripButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("RestoreToolStripButton.BackgroundImage")));
+ this.RestoreToolStripButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.RestoreToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.RestoreToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("RestoreToolStripButton.Image")));
+ this.RestoreToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.RestoreToolStripButton.Name = "RestoreToolStripButton";
+ this.RestoreToolStripButton.Size = new System.Drawing.Size(56, 22);
+ this.RestoreToolStripButton.Text = " Restore ";
+ this.RestoreToolStripButton.Click += new System.EventHandler(this.RestoreToolStripButton_Click);
+ //
+ // treeView
+ //
+ this.treeView.CheckBoxes = true;
+ this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.treeView.Location = new System.Drawing.Point(0, 25);
+ this.treeView.Name = "treeView";
+ this.treeView.Size = new System.Drawing.Size(624, 417);
+ this.treeView.TabIndex = 1;
+ this.treeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterCheck);
+ //
+ // progressBar
+ //
+ this.progressBar.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.progressBar.Location = new System.Drawing.Point(3, 57);
+ this.progressBar.Name = "progressBar";
+ this.progressBar.Size = new System.Drawing.Size(594, 23);
+ this.progressBar.TabIndex = 2;
+ //
+ // folderBrowserDialog
+ //
+ this.folderBrowserDialog.Description = "Select folder to restore data.";
+ this.folderBrowserDialog.RootFolder = System.Environment.SpecialFolder.MyComputer;
+ //
+ // ProgressGroupBox
+ //
+ this.ProgressGroupBox.Controls.Add(this.MessageTextBox);
+ this.ProgressGroupBox.Controls.Add(this.progressBar);
+ this.ProgressGroupBox.Location = new System.Drawing.Point(12, 148);
+ this.ProgressGroupBox.Name = "ProgressGroupBox";
+ this.ProgressGroupBox.Size = new System.Drawing.Size(600, 83);
+ this.ProgressGroupBox.TabIndex = 3;
+ this.ProgressGroupBox.TabStop = false;
+ this.ProgressGroupBox.Text = "Progress";
+ //
+ // MessageTextBox
+ //
+ this.MessageTextBox.Dock = System.Windows.Forms.DockStyle.Top;
+ this.MessageTextBox.Location = new System.Drawing.Point(3, 23);
+ this.MessageTextBox.Name = "MessageTextBox";
+ this.MessageTextBox.ReadOnly = true;
+ this.MessageTextBox.Size = new System.Drawing.Size(594, 27);
+ this.MessageTextBox.TabIndex = 0;
+ this.MessageTextBox.TabStop = false;
+ //
+ // TimeToolStripLabel
+ //
+ this.TimeToolStripLabel.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.TimeToolStripLabel.Name = "TimeToolStripLabel";
+ this.TimeToolStripLabel.Size = new System.Drawing.Size(86, 22);
+ this.TimeToolStripLabel.Text = "toolStripLabel2";
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+ //
+ // FileListDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(624, 442);
+ this.Controls.Add(this.ProgressGroupBox);
+ this.Controls.Add(this.treeView);
+ this.Controls.Add(this.toolStrip1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "FileListDialog";
+ this.Text = "File List";
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.ProgressGroupBox.ResumeLayout(false);
+ this.ProgressGroupBox.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.TreeView treeView;
+ private System.Windows.Forms.ProgressBar progressBar;
+ private System.Windows.Forms.ToolStripLabel toolStripLabel1;
+ private System.Windows.Forms.ToolStripButton RestoreToolStripButton;
+ private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog;
+ private System.Windows.Forms.GroupBox ProgressGroupBox;
+ private System.Windows.Forms.TextBox MessageTextBox;
+ private System.Windows.Forms.ToolStripLabel TimeToolStripLabel;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FileListDialog.cs b/Duplicati/Scheduler/FileListDialog.cs
new file mode 100644
index 000000000..fb43e7063
--- /dev/null
+++ b/Duplicati/Scheduler/FileListDialog.cs
@@ -0,0 +1,352 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// List the files in a backup
+ ///
+ public partial class FileListDialog : Form
+ {
+ private string itsURI;
+ private Dictionary itsOptions;
+ ///
+ /// List the files in a backup
+ ///
+ /// Job name
+ /// Source
+ /// Used by Duplicati
+ public FileListDialog(string aName, string aURI, Dictionary aOptions)
+ {
+ InitializeComponent();
+ itsURI = aURI;
+ itsOptions = aOptions;
+ this.toolStripLabel1.Text = aName;
+ this.TimeToolStripLabel.Text = aOptions.ContainsKey("restore-time") ? aOptions["restore-time"] : string.Empty;
+ }
+ ///
+ /// Initialize the display
+ ///
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+ MakeTree(itsURI, itsOptions);
+ }
+ ///
+ /// Locate a node by name
+ ///
+ /// Node name
+ /// Where to look
+ /// The node or null if not found
+ private TreeNode FindNode(string aName, TreeNodeCollection aNodeCollection)
+ {
+ foreach (TreeNode N in aNodeCollection)
+ if (N.Text.Equals(aName)) return N;
+ return null;
+ }
+ ///
+ /// Nodes
+ ///
+ public enum NodeType
+ {
+ Backup, // a root node
+ File, // a plain file
+ Folder // a directory
+ }
+ ///
+ /// Replace the leading number with the corresponding source root
+ ///
+ /// List of source files
+ /// Index
+ /// Corresponding source root
+ private string Expand(string[] aSource, string aPart)
+ {
+ int ix;
+ if (aSource != null && int.TryParse(aPart, out ix) && ix < aSource.Length)
+ return aSource[ix];
+ return aPart;
+ }
+ // A list, handy for finding things without recursing the tree
+ private List itsNodes = new List();
+ ///
+ /// A new tree node contains the name and the icon
+ ///
+ /// File name
+ /// Kind
+ /// new decorated node
+ private TreeNode NewNode(string aName, NodeType aType)
+ {
+ TreeNode Result = new TreeNode(aName);
+ // Get the correct icon from this cool set
+ if (OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.Supported)
+ {
+ switch (aType)
+ {
+ case NodeType.Backup:
+ Result.ImageIndex = Result.SelectedImageIndex = OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.GetShellIcon("XXX.DupBaK");
+ break;
+ case NodeType.File:
+ Result.ImageIndex = Result.SelectedImageIndex = OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.GetShellIcon(aName);
+ break;
+ case NodeType.Folder:
+ Result.ImageIndex = Result.SelectedImageIndex = OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.GetFolderIcon(false);
+ break;
+ }
+ }
+ itsNodes.Add(Result); // Easy access later
+ return Result;
+ }
+ ///
+ /// Get the source folders from Duplicati
+ ///
+ /// Source
+ /// Duplicati options
+ /// a list of source folders
+ private string[] ListSourceFolders(string aURI, Dictionary aOptions)
+ {
+ string[] Result = null;
+ Exception Ex = null;
+ do
+ {
+ Utility.Tools.Background((Action)delegate()
+ {
+ try
+ {
+ Result = Duplicati.Library.Main.Interface.ListSourceFolders(aURI, FixOptions(aOptions));
+ }
+ catch (System.Security.Cryptography.CryptographicException Exc)
+ {
+ Ex = Exc;
+ }
+ });
+ // If there was a crypto error, give user a chance to enter a different password
+ // I'm not sure this works
+ if (Ex != null && Ex is System.Security.Cryptography.CryptographicException)
+ {
+ if (MessageBox.Show("The password was incorrect, enter a different one?", "PASSWORD", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return null;
+ aOptions["Checksum"] = System.Convert.ToBase64String(EnterPassDialog.FetchProtectedPassword());
+ }
+ } while (Ex != null);
+ return Result;
+ }
+ ///
+ /// Convert internal options to Duplicati options
+ ///
+ ///
+ ///
+ private Dictionary FixOptions(Dictionary aOptions)
+ {
+ Dictionary Result = new Dictionary(aOptions);
+ // Try to find history entry
+ if (aOptions.ContainsKey("restore-time"))
+ {
+ using (Duplicati.Scheduler.Data.HistoryDataSet hds = new Duplicati.Scheduler.Data.HistoryDataSet())
+ {
+ hds.Load();
+ Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow hRow = hds.History.FindByNameActionDate(
+ this.toolStripLabel1.Text, DateTime.Parse(aOptions["restore-time"]));
+ if (hRow != null)
+ {
+ Result["Checksum"] = System.Convert.ToBase64String( hRow.Checksum );
+ Result["encryption-module"] = hRow.CheckMod;
+ }
+ }
+ }
+ // Duplicati should use SecureString
+ if (Result.ContainsKey("Checksum"))
+ {
+ // Unprotect will only work if process is the same user as it was protected, which this one should be.
+ Result["passphrase"] = System.Text.ASCIIEncoding.ASCII.GetString(Utility.Tools.Unprotect(System.Convert.FromBase64String(Result["Checksum"])));
+ Result.Remove("Checksum");
+ }
+ return Result;
+ }
+ ///
+ /// Ask duplicati to list the backup's files
+ ///
+ /// Source
+ /// Duplicati options
+ /// Folders form backup
+ ///
+ private List ListCurrentFiles(string aURI, Dictionary aOptions, string[] aSourceFolders)
+ {
+ List Result = null;
+ // Background will run the action in a separate thread and keep the forms pump going
+ Utility.Tools.Background((Action)
+ delegate()
+ {
+ Result = new List(Duplicati.Library.Main.Interface.ListCurrentFiles(aURI, FixOptions(aOptions)));
+ } );
+ // If there is only one source folder, Duplicati does not prepend indexes, so add them manually
+ if (aSourceFolders != null && aSourceFolders.Length == 1)
+ {
+ for (int i = 0; i < Result.Count; i++)
+ {
+ if (!System.Text.RegularExpressions.Regex.Match(Result[i], @"^[0-9]*\\").Success)
+ Result[i] = @"0\" + Result[i];
+ }
+ }
+ return Result;
+ }
+ // Create the file tree
+ private void MakeTree(string aURI, Dictionary aOptions)
+ {
+ this.Cursor = Cursors.WaitCursor;
+ this.RestoreToolStripButton.Enabled = false;
+ treeView.Nodes.Clear();
+ treeView.Visible = false;
+ this.ProgressGroupBox.Visible = true;
+ this.progressBar.Style = ProgressBarStyle.Marquee;
+ this.MessageTextBox.Text = "Accessing files";
+ string[] Sources = ListSourceFolders(aURI, aOptions);
+ if (Sources == null) return;
+ this.progressBar.Style = ProgressBarStyle.Continuous;
+ // Basically stolen from Duplicati
+ try
+ {
+ treeView.BeginUpdate();
+ // Add root node icon
+ if (OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.Supported)
+ {
+ OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.AddIcon("XXX.DupBaK", this.Icon.ToBitmap());
+ treeView.ImageList = OSGeo.MapGuide.Maestro.ResourceEditors.ShellIcons.ImageList;
+ }
+ List Files = ListCurrentFiles(aURI, aOptions, Sources);
+ this.progressBar.Maximum = Files.Count;
+ this.progressBar.Value = 0;
+ foreach (string s in Files)
+ {
+ TreeNodeCollection c = treeView.Nodes;
+ string[] parts = s.Split(System.IO.Path.DirectorySeparatorChar);
+ string[] sParts = (string[])parts.Clone();
+ parts[0] = Expand(Sources, parts[0]);
+ string Name = string.Empty;
+ for (int i = 0; i < parts.Length; i++)
+ {
+ NodeType nt = (i == 0) ? NodeType.Backup : ((i == parts.Length - 1) ? NodeType.File : NodeType.Folder);
+ Name += sParts[i];
+ if (nt != NodeType.File) Name += System.IO.Path.DirectorySeparatorChar;
+ if (parts[i] != "")
+ {
+ TreeNode t = FindNode(parts[i], c);
+ if (t == null)
+ {
+ t = NewNode(parts[i], nt);
+ t.Tag = Name;
+ c.Add(t);
+ }
+ c = t.Nodes;
+ }
+ }
+ this.progressBar.Value++;
+ Application.DoEvents();
+ }
+ treeView.Sort();
+ }
+ finally
+ {
+ treeView.EndUpdate();
+ this.ProgressGroupBox.Visible = false;
+ treeView.Visible = true;
+ CheckedNodes = 0;
+ this.RestoreToolStripButton.Enabled = true;
+ this.Cursor = Cursors.Default;
+ }
+ }
+ private int CheckedNodes = 0;
+ ///
+ /// Duplicati style progress
+ ///
+ private void OperationProgress(Duplicati.Library.Main.Interface aCaller, Duplicati.Library.Main.DuplicatiOperation aOperation, Duplicati.Library.Main.DuplicatiOperationMode aSpecificOperation, int aProgress, int aSubprogress, string aMessage, string aSubmessage)
+ {
+ this.BeginInvoke((Action)delegate()
+ {
+ if (aProgress < 0)
+ {
+ this.progressBar.Style = ProgressBarStyle.Marquee;
+ }
+ else
+ {
+ this.progressBar.Style = ProgressBarStyle.Continuous;
+ this.progressBar.Value = Math.Min(this.progressBar.Maximum, aProgress);
+ }
+ this.MessageTextBox.Text = aMessage + ":" + aSubmessage;
+ this.ProgressGroupBox.Update();
+ });
+ }
+ ///
+ /// Call Duplicati for the restore
+ ///
+ /// Source file
+ /// Place to put it
+ /// Duplicati Options
+ private void Restore(string aSource, string aTarget, Dictionary aOptions)
+ {
+ this.ProgressGroupBox.Visible = true;
+ this.ProgressGroupBox.BringToFront();
+ this.progressBar.Style = ProgressBarStyle.Marquee;
+ this.RestoreToolStripButton.Enabled = false;
+ this.treeView.Enabled = false;
+ string Result = null;
+ Utility.Tools.Background((Action)
+ delegate()
+ {
+ using (Duplicati.Library.Main.Interface i = new Duplicati.Library.Main.Interface(aSource, FixOptions(aOptions)))
+ Result = i.Restore(new string[] { aTarget });
+ });
+ MessageBox.Show(Result);
+ this.ProgressGroupBox.Visible = false;
+ this.RestoreToolStripButton.Enabled = true;
+ this.treeView.Enabled = true;
+ }
+ ///
+ /// Restore button
+ ///
+ private void RestoreToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (CheckedNodes <= 0)
+ {
+ MessageBox.Show("No files or folders checked.");
+ return;
+ }
+ // Get where user wants to restore
+ if (this.folderBrowserDialog.ShowDialog() == DialogResult.Cancel) return;
+ string Items = string.Join(System.IO.Path.PathSeparator.ToString(),
+ itsNodes.Where(Q => Q.Checked).Select(Q => (string)Q.Tag).ToArray());
+ if (Items.Length == 0) // Shouldn't happen
+ {
+ MessageBox.Show("No files selected.");
+ CheckedNodes = 0;
+ return;
+ }
+ // Do the restore
+ try
+ {
+ itsOptions["file-to-restore"] = Items;
+ Restore(itsURI, folderBrowserDialog.SelectedPath, itsOptions);
+ MessageBox.Show("Restore to " + folderBrowserDialog.SelectedPath + " Done.");
+ }
+ catch (Exception Ex)
+ {
+ MessageBox.Show("Error restoring: " + Ex.Message);
+ }
+ finally
+ {
+ this.ProgressGroupBox.Visible = false;
+ }
+ }
+ ///
+ /// Check changes, keep count
+ ///
+ private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
+ {
+ CheckedNodes = e.Node.Checked ? CheckedNodes + 1 : CheckedNodes - 1;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/FileListDialog.resx b/Duplicati/Scheduler/FileListDialog.resx
new file mode 100644
index 000000000..901932df6
--- /dev/null
+++ b/Duplicati/Scheduler/FileListDialog.resx
@@ -0,0 +1,658 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYNJREFUSEvV1r1K
+ w1AYxvFzFd6Bd+EFiOCod6AggiA4KKKTOugiWHCu4qA4ObiVFqQV/KjY2qRp0ybVpEm/bD7bDg2Pnpaq
+ KIHqkFMDf8iU98d7hhxSLMgQuCz4pzS49N9LJW8xbF/n0LnZTKZnoBZCX6Q8j9XQKcZnt0AmVgJtbHoT
+ 8zthyEUBYl4EoTqKmdk4QuyhgKCfjKT3Zq+FzvoboiC6mWhSDNryMS+azPcMpZICQs+QHhN9PM9jEp1N
+ Daqq9zc0KqByuTJaIO07qNP1wKLBkf0AtdoeWOQLclwPLPIFGWYXLPIFVWouWOQLelENsMgXVJTqYJEv
+ SMhpYNH/AXG8Bhb5bij1qIBFvqD7OwksGoB0rUp/rhzorS16fYNEnGfSZSTSM9SqDZBcVsDcdhhTywe4
+ iFwFDool4phc2sfC7jGaTROkIEpQnmWsH54zu1Mv7p3ANBuwTBukJCsov9/U6rVXGIYFy3Jg27+v0+5g
+ 2D6/78JxXLhuC47tQlV0vAH+hUZFnK9GkQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+ 122, 17
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FilterDialog.Designer.cs b/Duplicati/Scheduler/FilterDialog.Designer.cs
new file mode 100644
index 000000000..cadd47d30
--- /dev/null
+++ b/Duplicati/Scheduler/FilterDialog.Designer.cs
@@ -0,0 +1,247 @@
+namespace Duplicati.Scheduler
+{
+ partial class FilterDialog
+ {
+ ///
+ /// 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 Windows Form 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(FilterDialog));
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();
+ this.toolStripButton3 = new System.Windows.Forms.ToolStripButton();
+ this.toolStripButton4 = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.helpToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.BottomToolStrip = new System.Windows.Forms.ToolStrip();
+ this.CanButton = new System.Windows.Forms.ToolStripButton();
+ this.OKButton = new System.Windows.Forms.ToolStripButton();
+ this.richTextBox1 = new System.Windows.Forms.RichTextBox();
+ this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
+ this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.clearAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.unclearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStrip1.SuspendLayout();
+ this.BottomToolStrip.SuspendLayout();
+ this.contextMenuStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.ContextMenuStrip = this.contextMenuStrip1;
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripDropDownButton1,
+ this.helpToolStripButton});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.Size = new System.Drawing.Size(284, 25);
+ this.toolStrip1.TabIndex = 0;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // toolStripDropDownButton1
+ //
+ this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripButton3,
+ this.toolStripButton4,
+ this.toolStripSeparator2,
+ this.exitToolStripMenuItem});
+ this.toolStripDropDownButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripDropDownButton1.Image")));
+ this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripDropDownButton1.Name = "toolStripDropDownButton1";
+ this.toolStripDropDownButton1.Size = new System.Drawing.Size(44, 22);
+ this.toolStripDropDownButton1.Text = "File ";
+ //
+ // toolStripButton3
+ //
+ this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image")));
+ this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripButton3.Name = "toolStripButton3";
+ this.toolStripButton3.Size = new System.Drawing.Size(101, 20);
+ this.toolStripButton3.Text = "&Read from file";
+ //
+ // toolStripButton4
+ //
+ this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image")));
+ this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripButton4.Name = "toolStripButton4";
+ this.toolStripButton4.Size = new System.Drawing.Size(93, 20);
+ this.toolStripButton4.Text = "&Save to file...";
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(158, 6);
+ //
+ // exitToolStripMenuItem
+ //
+ this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+ this.exitToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+ this.exitToolStripMenuItem.Text = "Exit";
+ this.exitToolStripMenuItem.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // helpToolStripButton
+ //
+ this.helpToolStripButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image")));
+ this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.helpToolStripButton.Name = "helpToolStripButton";
+ this.helpToolStripButton.Size = new System.Drawing.Size(23, 22);
+ this.helpToolStripButton.Text = "He&lp";
+ this.helpToolStripButton.Click += new System.EventHandler(this.helpToolStripButton_Click);
+ //
+ // BottomToolStrip
+ //
+ this.BottomToolStrip.ContextMenuStrip = this.contextMenuStrip1;
+ this.BottomToolStrip.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.BottomToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.BottomToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.CanButton,
+ this.OKButton});
+ this.BottomToolStrip.Location = new System.Drawing.Point(0, 227);
+ this.BottomToolStrip.MaximumSize = new System.Drawing.Size(0, 35);
+ this.BottomToolStrip.MinimumSize = new System.Drawing.Size(0, 35);
+ this.BottomToolStrip.Name = "BottomToolStrip";
+ this.BottomToolStrip.Size = new System.Drawing.Size(284, 35);
+ this.BottomToolStrip.TabIndex = 28;
+ this.BottomToolStrip.Text = "toolStrip3";
+ //
+ // CanButton
+ //
+ this.CanButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.CanButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("CanButton.BackgroundImage")));
+ this.CanButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.CanButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.CanButton.Image = ((System.Drawing.Image)(resources.GetObject("CanButton.Image")));
+ this.CanButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(68, 32);
+ this.CanButton.Text = " CANCEL ";
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // OKButton
+ //
+ this.OKButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.OKButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("OKButton.BackgroundImage")));
+ this.OKButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.OKButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.OKButton.Image = ((System.Drawing.Image)(resources.GetObject("OKButton.Image")));
+ this.OKButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.OKButton.Name = "OKButton";
+ this.OKButton.Size = new System.Drawing.Size(63, 32);
+ this.OKButton.Text = " OK ";
+ this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // richTextBox1
+ //
+ this.richTextBox1.ContextMenuStrip = this.contextMenuStrip1;
+ this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.richTextBox1.Location = new System.Drawing.Point(0, 25);
+ this.richTextBox1.Name = "richTextBox1";
+ this.richTextBox1.Size = new System.Drawing.Size(284, 202);
+ this.richTextBox1.TabIndex = 29;
+ this.richTextBox1.Text = "";
+ //
+ // openFileDialog1
+ //
+ this.openFileDialog1.FileName = "openFileDialog1";
+ this.openFileDialog1.Filter = "Text files|*.txt|All|*.*";
+ this.openFileDialog1.ShowReadOnly = true;
+ this.openFileDialog1.Title = "Enter file to read";
+ //
+ // saveFileDialog1
+ //
+ this.saveFileDialog1.Filter = "Text files|*.txt";
+ this.saveFileDialog1.Title = "Enter file name to save text";
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.clearAllToolStripMenuItem,
+ this.unclearToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(153, 70);
+ //
+ // clearAllToolStripMenuItem
+ //
+ this.clearAllToolStripMenuItem.Name = "clearAllToolStripMenuItem";
+ this.clearAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.clearAllToolStripMenuItem.Text = "Clear all";
+ this.clearAllToolStripMenuItem.Click += new System.EventHandler(this.clearAllToolStripMenuItem_Click);
+ //
+ // unclearToolStripMenuItem
+ //
+ this.unclearToolStripMenuItem.Enabled = false;
+ this.unclearToolStripMenuItem.Name = "unclearToolStripMenuItem";
+ this.unclearToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.unclearToolStripMenuItem.Text = "Un-clear";
+ this.unclearToolStripMenuItem.Click += new System.EventHandler(this.unclearToolStripMenuItem_Click);
+ //
+ // FilterDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(284, 262);
+ this.Controls.Add(this.richTextBox1);
+ this.Controls.Add(this.BottomToolStrip);
+ this.Controls.Add(this.toolStrip1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "FilterDialog";
+ this.Text = "FilterDialog";
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.BottomToolStrip.ResumeLayout(false);
+ this.BottomToolStrip.PerformLayout();
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.ToolStrip BottomToolStrip;
+ private System.Windows.Forms.ToolStripButton CanButton;
+ private System.Windows.Forms.ToolStripButton OKButton;
+ private System.Windows.Forms.ToolStripButton helpToolStripButton;
+ private System.Windows.Forms.RichTextBox richTextBox1;
+ private System.Windows.Forms.OpenFileDialog openFileDialog1;
+ private System.Windows.Forms.SaveFileDialog saveFileDialog1;
+ private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1;
+ private System.Windows.Forms.ToolStripButton toolStripButton3;
+ private System.Windows.Forms.ToolStripButton toolStripButton4;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem clearAllToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem unclearToolStripMenuItem;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FilterDialog.cs b/Duplicati/Scheduler/FilterDialog.cs
new file mode 100644
index 000000000..edef447c7
--- /dev/null
+++ b/Duplicati/Scheduler/FilterDialog.cs
@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Allow user to enter filters
+ ///
+ public partial class FilterDialog : Form
+ {
+ private string[] itsFilter;
+ ///
+ /// The entered filters, null terminated
+ ///
+ public string[] Filter
+ {
+ get { return itsFilter; }
+ set
+ {
+ this.richTextBox1.Lines = value;
+ }
+ }
+ ///
+ /// Enter filters - I need to do a better one of these "some day".
+ ///
+ public FilterDialog()
+ {
+ InitializeComponent();
+ }
+ ///
+ /// User pressed OK, pack up the filters and close
+ ///
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ itsFilter = this.richTextBox1.Lines;
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+ private FilterHelp itsHelp = null;
+ ///
+ /// User pressed help, show a modified version of Duplicati's filter help
+ ///
+ ///
+ ///
+ private void helpToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (itsHelp == null)
+ {
+ itsHelp = new FilterHelp();
+ itsHelp.FormClosing += new FormClosingEventHandler(itsHelp_FormClosing);
+ }
+ itsHelp.Show();
+ }
+ ///
+ /// Don't close help, just hide it
+ ///
+ void itsHelp_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ e.Cancel = e.CloseReason == CloseReason.UserClosing;
+ itsHelp.Hide();
+ }
+ ///
+ /// Allows reading a file
+ ///
+ private void OpenoolStripButton_Click(object sender, EventArgs e)
+ {
+ if (this.openFileDialog1.ShowDialog() == DialogResult.Cancel) return;
+ try
+ {
+ this.richTextBox1.Text += System.IO.File.ReadAllText(this.openFileDialog1.FileName);
+ }
+ catch (Exception Ex)
+ {
+ MessageBox.Show("Can not open " + this.openFileDialog1.FileName + "._: " + Ex.Message);
+ }
+ }
+ ///
+ /// Allows saving a file
+ ///
+ private void SaveToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (this.saveFileDialog1.ShowDialog() == DialogResult.Cancel) return;
+ try
+ {
+ System.IO.File.WriteAllText(this.saveFileDialog1.FileName, this.richTextBox1.Text);
+ }
+ catch (Exception Ex)
+ {
+ MessageBox.Show("Can not save " + this.saveFileDialog1.FileName + "._: " + Ex.Message);
+ }
+ }
+ ///
+ /// User pressed Cancel, just close
+ ///
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ string itsCleared = string.Empty;
+ ///
+ /// Removes the text to a buffer
+ ///
+ private void clearAllToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrEmpty(this.richTextBox1.Text)) return;
+ itsCleared = this.richTextBox1.Text;
+ this.richTextBox1.Text = string.Empty;
+ unclearToolStripMenuItem.Enabled = true;
+ }
+ ///
+ /// Unremoves the text from a buffer
+ ///
+ private void unclearToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ this.richTextBox1.Text = itsCleared;
+ itsCleared = string.Empty;
+ this.unclearToolStripMenuItem.Enabled = false;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/FilterDialog.resx b/Duplicati/Scheduler/FilterDialog.resx
new file mode 100644
index 000000000..5c339d37d
--- /dev/null
+++ b/Duplicati/Scheduler/FilterDialog.resx
@@ -0,0 +1,757 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 153, 56
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ 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
+ QmCC
+
+
+
+ 653, 17
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYNJREFUSEvV1r1K
+ w1AYxvFzFd6Bd+EFiOCod6AggiA4KKKTOugiWHCu4qA4ObiVFqQV/KjY2qRp0ybVpEm/bD7bDg2Pnpaq
+ KIHqkFMDf8iU98d7hhxSLMgQuCz4pzS49N9LJW8xbF/n0LnZTKZnoBZCX6Q8j9XQKcZnt0AmVgJtbHoT
+ 8zthyEUBYl4EoTqKmdk4QuyhgKCfjKT3Zq+FzvoboiC6mWhSDNryMS+azPcMpZICQs+QHhN9PM9jEp1N
+ Daqq9zc0KqByuTJaIO07qNP1wKLBkf0AtdoeWOQLclwPLPIFGWYXLPIFVWouWOQLelENsMgXVJTqYJEv
+ SMhpYNH/AXG8Bhb5bij1qIBFvqD7OwksGoB0rUp/rhzorS16fYNEnGfSZSTSM9SqDZBcVsDcdhhTywe4
+ iFwFDool4phc2sfC7jGaTROkIEpQnmWsH54zu1Mv7p3ANBuwTBukJCsov9/U6rVXGIYFy3Jg27+v0+5g
+ 2D6/78JxXLhuC47tQlV0vAH+hUZFnK9GkQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYNJREFUSEvV1r1K
+ w1AYxvFzFd6Bd+EFiOCod6AggiA4KKKTOugiWHCu4qA4ObiVFqQV/KjY2qRp0ybVpEm/bD7bDg2Pnpaq
+ KIHqkFMDf8iU98d7hhxSLMgQuCz4pzS49N9LJW8xbF/n0LnZTKZnoBZCX6Q8j9XQKcZnt0AmVgJtbHoT
+ 8zthyEUBYl4EoTqKmdk4QuyhgKCfjKT3Zq+FzvoboiC6mWhSDNryMS+azPcMpZICQs+QHhN9PM9jEp1N
+ Daqq9zc0KqByuTJaIO07qNP1wKLBkf0AtdoeWOQLclwPLPIFGWYXLPIFVWouWOQLelENsMgXVJTqYJEv
+ SMhpYNH/AXG8Bhb5bij1qIBFvqD7OwksGoB0rUp/rhzorS16fYNEnGfSZSTSM9SqDZBcVsDcdhhTywe4
+ iFwFDool4phc2sfC7jGaTROkIEpQnmWsH54zu1Mv7p3ANBuwTBukJCsov9/U6rVXGIYFy3Jg27+v0+5g
+ 2D6/78JxXLhuC47tQlV0vAH+hUZFnK9GkQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+ 794, 17
+
+
+ 17, 56
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FilterHelp.Designer.cs b/Duplicati/Scheduler/FilterHelp.Designer.cs
new file mode 100644
index 000000000..c0497ff68
--- /dev/null
+++ b/Duplicati/Scheduler/FilterHelp.Designer.cs
@@ -0,0 +1,60 @@
+namespace Duplicati.Scheduler
+{
+ partial class FilterHelp
+ {
+ ///
+ /// 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 Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.richTextBox1 = new System.Windows.Forms.RichTextBox();
+ this.SuspendLayout();
+ //
+ // richTextBox1
+ //
+ this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.richTextBox1.Location = new System.Drawing.Point(0, 0);
+ this.richTextBox1.Name = "richTextBox1";
+ this.richTextBox1.ReadOnly = true;
+ this.richTextBox1.Size = new System.Drawing.Size(555, 368);
+ this.richTextBox1.TabIndex = 0;
+ this.richTextBox1.Text = "";
+ //
+ // FilterHelp
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(555, 368);
+ this.Controls.Add(this.richTextBox1);
+ this.Name = "FilterHelp";
+ this.Text = "FilterHelp";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.RichTextBox richTextBox1;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FilterHelp.cs b/Duplicati/Scheduler/FilterHelp.cs
new file mode 100644
index 000000000..92bb515ad
--- /dev/null
+++ b/Duplicati/Scheduler/FilterHelp.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Help for filters
+ ///
+ public partial class FilterHelp : Form
+ {
+ ///
+ /// Shows a modified version of Duplicati's filter help page
+ ///
+ public FilterHelp()
+ {
+ InitializeComponent();
+ }
+ protected override void OnLoad(EventArgs e)
+ {
+ base.OnLoad(e);
+ try
+ {
+ this.richTextBox1.Rtf = System.IO.File.ReadAllText(Application.StartupPath + "\\Filters.rtf");
+ }
+ catch (Exception Ex)
+ {
+ this.richTextBox1.Text = "Help not available: " + Ex.Message;
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/FilterHelp.resx b/Duplicati/Scheduler/FilterHelp.resx
new file mode 100644
index 000000000..ff31a6db5
--- /dev/null
+++ b/Duplicati/Scheduler/FilterHelp.resx
@@ -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
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Filters.rtf b/Duplicati/Scheduler/Filters.rtf
new file mode 100644
index 000000000..32941559b
Binary files /dev/null and b/Duplicati/Scheduler/Filters.rtf differ
diff --git a/Duplicati/Scheduler/FolderBrowserDialog.Designer.cs b/Duplicati/Scheduler/FolderBrowserDialog.Designer.cs
new file mode 100644
index 000000000..47ef120ed
--- /dev/null
+++ b/Duplicati/Scheduler/FolderBrowserDialog.Designer.cs
@@ -0,0 +1,144 @@
+namespace Duplicati.Scheduler
+{
+ partial class FolderBrowserDialog
+ {
+ ///
+ /// 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 Windows Form 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(FolderBrowserDialog));
+ this.CanButton = new System.Windows.Forms.Button();
+ this.OKButton = new System.Windows.Forms.Button();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.folderTreeControl1 = new Utility.FolderTreeControl();
+ this.PromptLabel = new System.Windows.Forms.Label();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.tableLayoutPanel2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // CanButton
+ //
+ this.CanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CanButton.Location = new System.Drawing.Point(83, 3);
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(75, 31);
+ this.CanButton.TabIndex = 1;
+ this.CanButton.Text = "Cancel";
+ this.CanButton.UseVisualStyleBackColor = true;
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // OKButton
+ //
+ this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OKButton.Location = new System.Drawing.Point(3, 3);
+ this.OKButton.Name = "OKButton";
+ this.OKButton.Size = new System.Drawing.Size(74, 31);
+ this.OKButton.TabIndex = 2;
+ this.OKButton.Text = "OK";
+ this.OKButton.UseVisualStyleBackColor = true;
+ this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.tableLayoutPanel1.ColumnCount = 2;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.Controls.Add(this.CanButton, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.OKButton, 0, 0);
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(76, 282);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 1;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 37F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(161, 37);
+ this.tableLayoutPanel1.TabIndex = 4;
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.ColumnCount = 1;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.Controls.Add(this.folderTreeControl1, 0, 0);
+ this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel1, 0, 2);
+ this.tableLayoutPanel2.Controls.Add(this.PromptLabel, 0, 0);
+ this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 3;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(240, 322);
+ this.tableLayoutPanel2.TabIndex = 5;
+ //
+ // folderTreeControl1
+ //
+ this.folderTreeControl1.BackColor = System.Drawing.SystemColors.Control;
+ this.folderTreeControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.folderTreeControl1.Location = new System.Drawing.Point(4, 23);
+ this.folderTreeControl1.Margin = new System.Windows.Forms.Padding(4);
+ this.folderTreeControl1.Name = "folderTreeControl1";
+ this.folderTreeControl1.Size = new System.Drawing.Size(232, 252);
+ this.folderTreeControl1.TabIndex = 3;
+ //
+ // PromptLabel
+ //
+ this.PromptLabel.AutoSize = true;
+ this.PromptLabel.Location = new System.Drawing.Point(3, 0);
+ this.PromptLabel.Name = "PromptLabel";
+ this.PromptLabel.Size = new System.Drawing.Size(103, 19);
+ this.PromptLabel.TabIndex = 5;
+ this.PromptLabel.Text = "Select folders";
+ //
+ // FolderBrowserDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(240, 322);
+ this.Controls.Add(this.tableLayoutPanel2);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "FolderBrowserDialog";
+ this.Text = "Folder Browser";
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel2.ResumeLayout(false);
+ this.tableLayoutPanel2.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button CanButton;
+ private System.Windows.Forms.Button OKButton;
+ private Utility.FolderTreeControl folderTreeControl1;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
+ private System.Windows.Forms.Label PromptLabel;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/FolderBrowserDialog.cs b/Duplicati/Scheduler/FolderBrowserDialog.cs
new file mode 100644
index 000000000..655a9c5d2
--- /dev/null
+++ b/Duplicati/Scheduler/FolderBrowserDialog.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Allow user to select folders to backup
+ ///
+ public partial class FolderBrowserDialog : Form
+ {
+ public string Prompt { get { return this.PromptLabel.Text; } set { this.PromptLabel.Text = value; } }
+ private string[] itsSelectedFolders;
+ ///
+ /// Folders selected
+ ///
+ public string[] SelectedFolders
+ {
+ get { return itsSelectedFolders; }
+ set { this.folderTreeControl1.SetSelectedFolders(value); itsSelectedFolders = value; }
+ }
+ ///
+ /// Allow user to select folders to backup
+ ///
+ public FolderBrowserDialog()
+ {
+ InitializeComponent();
+ this.folderTreeControl1.ForeColor = this.ForeColor;
+ this.folderTreeControl1.BackColor = this.BackColor;
+ }
+ ///
+ /// OK button, get selection and close
+ ///
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ itsSelectedFolders = this.folderTreeControl1.SelectedFolders;
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+ ///
+ /// Cancel button, just close
+ ///
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ itsSelectedFolders = new string[0];
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/FolderBrowserDialog.resx b/Duplicati/Scheduler/FolderBrowserDialog.resx
new file mode 100644
index 000000000..a3c9b8abc
--- /dev/null
+++ b/Duplicati/Scheduler/FolderBrowserDialog.resx
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Images/Cleanup.png b/Duplicati/Scheduler/Images/Cleanup.png
new file mode 100644
index 000000000..c14f27ec2
Binary files /dev/null and b/Duplicati/Scheduler/Images/Cleanup.png differ
diff --git a/Duplicati/Scheduler/Images/Error.png b/Duplicati/Scheduler/Images/Error.png
new file mode 100644
index 000000000..3ee2f0f06
Binary files /dev/null and b/Duplicati/Scheduler/Images/Error.png differ
diff --git a/Duplicati/Scheduler/Images/ErrorSm.png b/Duplicati/Scheduler/Images/ErrorSm.png
new file mode 100644
index 000000000..5e16adb12
Binary files /dev/null and b/Duplicati/Scheduler/Images/ErrorSm.png differ
diff --git a/Duplicati/Scheduler/Images/FolderOpen.png b/Duplicati/Scheduler/Images/FolderOpen.png
new file mode 100644
index 000000000..07d468a63
Binary files /dev/null and b/Duplicati/Scheduler/Images/FolderOpen.png differ
diff --git a/Duplicati/Scheduler/Images/InfoSm.png b/Duplicati/Scheduler/Images/InfoSm.png
new file mode 100644
index 000000000..e4bc59c67
Binary files /dev/null and b/Duplicati/Scheduler/Images/InfoSm.png differ
diff --git a/Duplicati/Scheduler/Images/Source.png b/Duplicati/Scheduler/Images/Source.png
new file mode 100644
index 000000000..8a94f6e1f
Binary files /dev/null and b/Duplicati/Scheduler/Images/Source.png differ
diff --git a/Duplicati/Scheduler/Images/WarningSm.png b/Duplicati/Scheduler/Images/WarningSm.png
new file mode 100644
index 000000000..1a635d04d
Binary files /dev/null and b/Duplicati/Scheduler/Images/WarningSm.png differ
diff --git a/Duplicati/Scheduler/Images/bedicon.png b/Duplicati/Scheduler/Images/bedicon.png
new file mode 100644
index 000000000..e65a60298
Binary files /dev/null and b/Duplicati/Scheduler/Images/bedicon.png differ
diff --git a/Duplicati/Scheduler/Images/checkbox_checked.png b/Duplicati/Scheduler/Images/checkbox_checked.png
new file mode 100644
index 000000000..b473ce727
Binary files /dev/null and b/Duplicati/Scheduler/Images/checkbox_checked.png differ
diff --git a/Duplicati/Scheduler/Images/checkbox_unchecked.png b/Duplicati/Scheduler/Images/checkbox_unchecked.png
new file mode 100644
index 000000000..3de3b3408
Binary files /dev/null and b/Duplicati/Scheduler/Images/checkbox_unchecked.png differ
diff --git a/Duplicati/Scheduler/Images/clockicon.png b/Duplicati/Scheduler/Images/clockicon.png
new file mode 100644
index 000000000..a9ffa2b63
Binary files /dev/null and b/Duplicati/Scheduler/Images/clockicon.png differ
diff --git a/Duplicati/Scheduler/Images/next-button.png b/Duplicati/Scheduler/Images/next-button.png
new file mode 100644
index 000000000..7fc40bf41
Binary files /dev/null and b/Duplicati/Scheduler/Images/next-button.png differ
diff --git a/Duplicati/Scheduler/Images/password_icon.jpg b/Duplicati/Scheduler/Images/password_icon.jpg
new file mode 100644
index 000000000..1e8d5f2b6
Binary files /dev/null and b/Duplicati/Scheduler/Images/password_icon.jpg differ
diff --git a/Duplicati/Scheduler/Images/password_icon.png b/Duplicati/Scheduler/Images/password_icon.png
new file mode 100644
index 000000000..957edb813
Binary files /dev/null and b/Duplicati/Scheduler/Images/password_icon.png differ
diff --git a/Duplicati/Scheduler/Images/previous-button.png b/Duplicati/Scheduler/Images/previous-button.png
new file mode 100644
index 000000000..9cc8e7b8d
Binary files /dev/null and b/Duplicati/Scheduler/Images/previous-button.png differ
diff --git a/Duplicati/Scheduler/Images/school-calendar-ico.png b/Duplicati/Scheduler/Images/school-calendar-ico.png
new file mode 100644
index 000000000..9b64b817e
Binary files /dev/null and b/Duplicati/Scheduler/Images/school-calendar-ico.png differ
diff --git a/Duplicati/Scheduler/Images/school-time-ico.png b/Duplicati/Scheduler/Images/school-time-ico.png
new file mode 100644
index 000000000..90ba62fc0
Binary files /dev/null and b/Duplicati/Scheduler/Images/school-time-ico.png differ
diff --git a/Duplicati/Scheduler/Images/time_ico.gif b/Duplicati/Scheduler/Images/time_ico.gif
new file mode 100644
index 000000000..59cbeeed4
Binary files /dev/null and b/Duplicati/Scheduler/Images/time_ico.gif differ
diff --git a/Duplicati/Scheduler/JobDialog.Designer.cs b/Duplicati/Scheduler/JobDialog.Designer.cs
new file mode 100644
index 000000000..bae4d679a
--- /dev/null
+++ b/Duplicati/Scheduler/JobDialog.Designer.cs
@@ -0,0 +1,1114 @@
+namespace Duplicati.Scheduler
+{
+ partial class JobDialog
+ {
+ ///
+ /// 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 Windows Form 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.Windows.Forms.Label label8;
+ System.Windows.Forms.Label label3;
+ System.Windows.Forms.Label label1;
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(JobDialog));
+ this.MainTabControl = new System.Windows.Forms.TabControl();
+ this.TimeTabPage = new System.Windows.Forms.TabPage();
+ this.TaskEditor = new Duplicati.Scheduler.TaskEditControl();
+ this.SourceTabPage = new System.Windows.Forms.TabPage();
+ this.SourceTabControl = new System.Windows.Forms.TabControl();
+ this.TreeViewTabPage = new System.Windows.Forms.TabPage();
+ this.SourceFolderTreeControl = new Utility.FolderTreeControl();
+ this.ListViewTabPage = new System.Windows.Forms.TabPage();
+ this.SourceListBox = new System.Windows.Forms.ListBox();
+ this.FiltersTabPage = new System.Windows.Forms.TabPage();
+ this.FilterListBox = new System.Windows.Forms.ListBox();
+ this.FilterEditButton = new System.Windows.Forms.Button();
+ this.DestTabPage = new System.Windows.Forms.TabPage();
+ this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+ this.BackEndTableLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+ this.UIFPanel = new System.Windows.Forms.Panel();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.PasswordMethodComboBox = new System.Windows.Forms.ComboBox();
+ this.passwordControl1 = new Duplicati.Scheduler.PasswordControl();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.AdvancedButton = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.FullAfterNRadioButton = new System.Windows.Forms.RadioButton();
+ this.FullDaysRadioButton = new System.Windows.Forms.RadioButton();
+ this.FullAlwaysRadioButton = new System.Windows.Forms.RadioButton();
+ this.FullDaysNumericUpDown = new System.Windows.Forms.NumericUpDown();
+ this.FullAfterNNumericUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label4 = new System.Windows.Forms.Label();
+ this.MaxAgeNnumericUpDown = new System.Windows.Forms.NumericUpDown();
+ this.MaxFullsNumericUpDown = new System.Windows.Forms.NumericUpDown();
+ this.MaxFullsCheckBox = new System.Windows.Forms.CheckBox();
+ this.MaxAgeCheckBox = new System.Windows.Forms.CheckBox();
+ this.CleanFullBackupHelptext = new System.Windows.Forms.Label();
+ this.SummaryTabPage = new System.Windows.Forms.TabPage();
+ this.jobSummary1 = new Duplicati.Scheduler.JobSummary();
+ this.TabsImageList = new System.Windows.Forms.ImageList(this.components);
+ this.BottomToolStrip = new System.Windows.Forms.ToolStrip();
+ this.CanButton = new System.Windows.Forms.ToolStripButton();
+ this.NextButton = new System.Windows.Forms.ToolStripButton();
+ this.BackButton = new System.Windows.Forms.ToolStripButton();
+ this.ExplainToolStripLabel = new System.Windows.Forms.ToolStripLabel();
+ label8 = new System.Windows.Forms.Label();
+ label3 = new System.Windows.Forms.Label();
+ label1 = new System.Windows.Forms.Label();
+ this.MainTabControl.SuspendLayout();
+ this.TimeTabPage.SuspendLayout();
+ this.SourceTabPage.SuspendLayout();
+ this.SourceTabControl.SuspendLayout();
+ this.TreeViewTabPage.SuspendLayout();
+ this.ListViewTabPage.SuspendLayout();
+ this.FiltersTabPage.SuspendLayout();
+ this.DestTabPage.SuspendLayout();
+ this.splitContainer1.Panel1.SuspendLayout();
+ this.splitContainer1.Panel2.SuspendLayout();
+ this.splitContainer1.SuspendLayout();
+ this.tabPage1.SuspendLayout();
+ this.tabPage2.SuspendLayout();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.FullDaysNumericUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FullAfterNNumericUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxAgeNnumericUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxFullsNumericUpDown)).BeginInit();
+ this.SummaryTabPage.SuspendLayout();
+ this.BottomToolStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // label8
+ //
+ label8.AutoSize = true;
+ label8.Location = new System.Drawing.Point(275, 57);
+ label8.Name = "label8";
+ label8.Size = new System.Drawing.Size(46, 19);
+ label8.TabIndex = 35;
+ label8.Text = "days.";
+ //
+ // label3
+ //
+ label3.AutoSize = true;
+ label3.Location = new System.Drawing.Point(276, 31);
+ label3.Name = "label3";
+ label3.Size = new System.Drawing.Size(98, 19);
+ label3.TabIndex = 38;
+ label3.Text = "full backups.";
+ //
+ // label1
+ //
+ label1.AutoSize = true;
+ label1.Location = new System.Drawing.Point(275, 90);
+ label1.Name = "label1";
+ label1.Size = new System.Drawing.Size(158, 19);
+ label1.TabIndex = 40;
+ label1.Text = "incremental backups.";
+ //
+ // MainTabControl
+ //
+ this.MainTabControl.Controls.Add(this.TimeTabPage);
+ this.MainTabControl.Controls.Add(this.SourceTabPage);
+ this.MainTabControl.Controls.Add(this.DestTabPage);
+ this.MainTabControl.Controls.Add(this.tabPage1);
+ this.MainTabControl.Controls.Add(this.tabPage2);
+ this.MainTabControl.Controls.Add(this.SummaryTabPage);
+ this.MainTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.MainTabControl.ImageList = this.TabsImageList;
+ this.MainTabControl.Location = new System.Drawing.Point(0, 0);
+ this.MainTabControl.Name = "MainTabControl";
+ this.MainTabControl.SelectedIndex = 0;
+ this.MainTabControl.Size = new System.Drawing.Size(634, 417);
+ this.MainTabControl.TabIndex = 24;
+ this.MainTabControl.SelectedIndexChanged += new System.EventHandler(this.MainTabControlSelectedIndexChanged);
+ //
+ // TimeTabPage
+ //
+ this.TimeTabPage.Controls.Add(this.TaskEditor);
+ this.TimeTabPage.ImageIndex = 0;
+ this.TimeTabPage.Location = new System.Drawing.Point(4, 28);
+ this.TimeTabPage.Name = "TimeTabPage";
+ this.TimeTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.TimeTabPage.Size = new System.Drawing.Size(626, 385);
+ this.TimeTabPage.TabIndex = 0;
+ this.TimeTabPage.Text = "Time";
+ this.TimeTabPage.ToolTipText = "Enter the time that the backup will start and repeat";
+ this.TimeTabPage.UseVisualStyleBackColor = true;
+ //
+ // TaskEditor
+ //
+ this.TaskEditor.BackColor = System.Drawing.Color.Gainsboro;
+ this.TaskEditor.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.TaskEditor.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.TaskEditor.Location = new System.Drawing.Point(3, 3);
+ this.TaskEditor.Margin = new System.Windows.Forms.Padding(4);
+ this.TaskEditor.Name = "TaskEditor";
+ this.TaskEditor.Size = new System.Drawing.Size(620, 379);
+ this.TaskEditor.TabIndex = 0;
+ //
+ // SourceTabPage
+ //
+ this.SourceTabPage.BackColor = System.Drawing.Color.Gainsboro;
+ this.SourceTabPage.Controls.Add(this.SourceTabControl);
+ this.SourceTabPage.ImageIndex = 1;
+ this.SourceTabPage.Location = new System.Drawing.Point(4, 28);
+ this.SourceTabPage.Name = "SourceTabPage";
+ this.SourceTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.SourceTabPage.Size = new System.Drawing.Size(626, 385);
+ this.SourceTabPage.TabIndex = 1;
+ this.SourceTabPage.Text = "Source";
+ this.SourceTabPage.ToolTipText = "Select the directories to backup";
+ this.SourceTabPage.UseVisualStyleBackColor = true;
+ //
+ // SourceTabControl
+ //
+ this.SourceTabControl.Controls.Add(this.TreeViewTabPage);
+ this.SourceTabControl.Controls.Add(this.ListViewTabPage);
+ this.SourceTabControl.Controls.Add(this.FiltersTabPage);
+ this.SourceTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.SourceTabControl.Location = new System.Drawing.Point(3, 3);
+ this.SourceTabControl.Name = "SourceTabControl";
+ this.SourceTabControl.SelectedIndex = 0;
+ this.SourceTabControl.Size = new System.Drawing.Size(620, 379);
+ this.SourceTabControl.TabIndex = 18;
+ this.SourceTabControl.SelectedIndexChanged += new System.EventHandler(this.SourceTabControl_SelectedIndexChanged);
+ //
+ // TreeViewTabPage
+ //
+ this.TreeViewTabPage.Controls.Add(this.SourceFolderTreeControl);
+ this.TreeViewTabPage.Location = new System.Drawing.Point(4, 28);
+ this.TreeViewTabPage.Name = "TreeViewTabPage";
+ this.TreeViewTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.TreeViewTabPage.Size = new System.Drawing.Size(612, 347);
+ this.TreeViewTabPage.TabIndex = 0;
+ this.TreeViewTabPage.Text = "Tree View";
+ this.TreeViewTabPage.UseVisualStyleBackColor = true;
+ //
+ // SourceFolderTreeControl
+ //
+ this.SourceFolderTreeControl.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.SourceFolderTreeControl.Location = new System.Drawing.Point(3, 3);
+ this.SourceFolderTreeControl.Margin = new System.Windows.Forms.Padding(4);
+ this.SourceFolderTreeControl.Name = "SourceFolderTreeControl";
+ this.SourceFolderTreeControl.Size = new System.Drawing.Size(606, 341);
+ this.SourceFolderTreeControl.TabIndex = 0;
+ //
+ // ListViewTabPage
+ //
+ this.ListViewTabPage.Controls.Add(this.SourceListBox);
+ this.ListViewTabPage.Location = new System.Drawing.Point(4, 28);
+ this.ListViewTabPage.Name = "ListViewTabPage";
+ this.ListViewTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.ListViewTabPage.Size = new System.Drawing.Size(612, 347);
+ this.ListViewTabPage.TabIndex = 1;
+ this.ListViewTabPage.Text = "List View";
+ this.ListViewTabPage.UseVisualStyleBackColor = true;
+ //
+ // SourceListBox
+ //
+ this.SourceListBox.BackColor = System.Drawing.Color.Gainsboro;
+ this.SourceListBox.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.SourceListBox.ItemHeight = 19;
+ this.SourceListBox.Location = new System.Drawing.Point(3, 3);
+ this.SourceListBox.Name = "SourceListBox";
+ this.SourceListBox.Size = new System.Drawing.Size(606, 327);
+ this.SourceListBox.Sorted = true;
+ this.SourceListBox.TabIndex = 15;
+ //
+ // FiltersTabPage
+ //
+ this.FiltersTabPage.Controls.Add(this.FilterListBox);
+ this.FiltersTabPage.Controls.Add(this.FilterEditButton);
+ this.FiltersTabPage.Location = new System.Drawing.Point(4, 28);
+ this.FiltersTabPage.Name = "FiltersTabPage";
+ this.FiltersTabPage.Size = new System.Drawing.Size(612, 347);
+ this.FiltersTabPage.TabIndex = 2;
+ this.FiltersTabPage.Text = "Filters";
+ this.FiltersTabPage.UseVisualStyleBackColor = true;
+ //
+ // FilterListBox
+ //
+ this.FilterListBox.FormattingEnabled = true;
+ this.FilterListBox.ItemHeight = 19;
+ this.FilterListBox.Location = new System.Drawing.Point(3, 3);
+ this.FilterListBox.Name = "FilterListBox";
+ this.FilterListBox.Size = new System.Drawing.Size(253, 308);
+ this.FilterListBox.TabIndex = 1;
+ //
+ // FilterEditButton
+ //
+ this.FilterEditButton.Location = new System.Drawing.Point(3, 312);
+ this.FilterEditButton.Name = "FilterEditButton";
+ this.FilterEditButton.Size = new System.Drawing.Size(75, 32);
+ this.FilterEditButton.TabIndex = 0;
+ this.FilterEditButton.Text = "EDIT";
+ this.FilterEditButton.UseVisualStyleBackColor = true;
+ this.FilterEditButton.Click += new System.EventHandler(this.FiltersToolStripButton_Click);
+ //
+ // DestTabPage
+ //
+ this.DestTabPage.BackColor = System.Drawing.Color.Gainsboro;
+ this.DestTabPage.Controls.Add(this.splitContainer1);
+ this.DestTabPage.ImageIndex = 2;
+ this.DestTabPage.Location = new System.Drawing.Point(4, 28);
+ this.DestTabPage.Name = "DestTabPage";
+ this.DestTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.DestTabPage.Size = new System.Drawing.Size(626, 385);
+ this.DestTabPage.TabIndex = 2;
+ this.DestTabPage.Text = "Destination";
+ this.DestTabPage.ToolTipText = "Select the backup destination";
+ this.DestTabPage.UseVisualStyleBackColor = true;
+ //
+ // splitContainer1
+ //
+ this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+ this.splitContainer1.IsSplitterFixed = true;
+ this.splitContainer1.Location = new System.Drawing.Point(3, 3);
+ this.splitContainer1.Name = "splitContainer1";
+ this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+ //
+ // splitContainer1.Panel1
+ //
+ this.splitContainer1.Panel1.Controls.Add(this.BackEndTableLayoutPanel);
+ //
+ // splitContainer1.Panel2
+ //
+ this.splitContainer1.Panel2.Controls.Add(this.UIFPanel);
+ this.splitContainer1.Panel2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.splitContainer1.Size = new System.Drawing.Size(620, 379);
+ this.splitContainer1.SplitterDistance = 64;
+ this.splitContainer1.TabIndex = 0;
+ //
+ // BackEndTableLayoutPanel
+ //
+ this.BackEndTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.BackEndTableLayoutPanel.Location = new System.Drawing.Point(0, 0);
+ this.BackEndTableLayoutPanel.Name = "BackEndTableLayoutPanel";
+ this.BackEndTableLayoutPanel.Size = new System.Drawing.Size(618, 62);
+ this.BackEndTableLayoutPanel.TabIndex = 0;
+ //
+ // UIFPanel
+ //
+ this.UIFPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.UIFPanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.UIFPanel.Location = new System.Drawing.Point(0, 0);
+ this.UIFPanel.Name = "UIFPanel";
+ this.UIFPanel.Size = new System.Drawing.Size(618, 309);
+ this.UIFPanel.TabIndex = 0;
+ //
+ // tabPage1
+ //
+ this.tabPage1.BackColor = System.Drawing.Color.Gainsboro;
+ this.tabPage1.Controls.Add(this.PasswordMethodComboBox);
+ this.tabPage1.Controls.Add(this.passwordControl1);
+ this.tabPage1.ImageIndex = 3;
+ this.tabPage1.Location = new System.Drawing.Point(4, 28);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Size = new System.Drawing.Size(626, 385);
+ this.tabPage1.TabIndex = 4;
+ this.tabPage1.Text = "Password";
+ this.tabPage1.ToolTipText = "Protect the backup with a password";
+ //
+ // PasswordMethodComboBox
+ //
+ this.PasswordMethodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.PasswordMethodComboBox.FormattingEnabled = true;
+ this.PasswordMethodComboBox.Items.AddRange(new object[] {
+ "Do not password protect backup.",
+ "Use the password below:",
+ "Use the system password (from Settings)."});
+ this.PasswordMethodComboBox.Location = new System.Drawing.Point(70, 75);
+ this.PasswordMethodComboBox.Name = "PasswordMethodComboBox";
+ this.PasswordMethodComboBox.Size = new System.Drawing.Size(341, 27);
+ this.PasswordMethodComboBox.TabIndex = 28;
+ this.PasswordMethodComboBox.SelectedIndexChanged += new System.EventHandler(this.PasswordMethodComboBox_SelectedIndexChanged);
+ //
+ // passwordControl1
+ //
+ this.passwordControl1.BackColor = System.Drawing.Color.Gainsboro;
+ this.passwordControl1.CheckMod = "";
+ this.passwordControl1.Checksum = new byte[] {
+ ((byte)(1)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(208)),
+ ((byte)(140)),
+ ((byte)(157)),
+ ((byte)(223)),
+ ((byte)(1)),
+ ((byte)(21)),
+ ((byte)(209)),
+ ((byte)(17)),
+ ((byte)(140)),
+ ((byte)(122)),
+ ((byte)(0)),
+ ((byte)(192)),
+ ((byte)(79)),
+ ((byte)(194)),
+ ((byte)(151)),
+ ((byte)(235)),
+ ((byte)(1)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(48)),
+ ((byte)(183)),
+ ((byte)(91)),
+ ((byte)(129)),
+ ((byte)(98)),
+ ((byte)(50)),
+ ((byte)(81)),
+ ((byte)(67)),
+ ((byte)(164)),
+ ((byte)(141)),
+ ((byte)(23)),
+ ((byte)(21)),
+ ((byte)(92)),
+ ((byte)(22)),
+ ((byte)(163)),
+ ((byte)(166)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(2)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(16)),
+ ((byte)(102)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(1)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(32)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(224)),
+ ((byte)(167)),
+ ((byte)(228)),
+ ((byte)(192)),
+ ((byte)(76)),
+ ((byte)(7)),
+ ((byte)(193)),
+ ((byte)(243)),
+ ((byte)(33)),
+ ((byte)(27)),
+ ((byte)(40)),
+ ((byte)(150)),
+ ((byte)(105)),
+ ((byte)(128)),
+ ((byte)(83)),
+ ((byte)(62)),
+ ((byte)(129)),
+ ((byte)(184)),
+ ((byte)(147)),
+ ((byte)(116)),
+ ((byte)(190)),
+ ((byte)(156)),
+ ((byte)(173)),
+ ((byte)(186)),
+ ((byte)(61)),
+ ((byte)(134)),
+ ((byte)(13)),
+ ((byte)(5)),
+ ((byte)(249)),
+ ((byte)(107)),
+ ((byte)(9)),
+ ((byte)(29)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(14)),
+ ((byte)(128)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(2)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(32)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(88)),
+ ((byte)(42)),
+ ((byte)(68)),
+ ((byte)(29)),
+ ((byte)(150)),
+ ((byte)(125)),
+ ((byte)(211)),
+ ((byte)(162)),
+ ((byte)(77)),
+ ((byte)(189)),
+ ((byte)(206)),
+ ((byte)(212)),
+ ((byte)(178)),
+ ((byte)(95)),
+ ((byte)(24)),
+ ((byte)(109)),
+ ((byte)(96)),
+ ((byte)(121)),
+ ((byte)(27)),
+ ((byte)(100)),
+ ((byte)(165)),
+ ((byte)(184)),
+ ((byte)(82)),
+ ((byte)(209)),
+ ((byte)(147)),
+ ((byte)(87)),
+ ((byte)(196)),
+ ((byte)(192)),
+ ((byte)(59)),
+ ((byte)(212)),
+ ((byte)(97)),
+ ((byte)(16)),
+ ((byte)(144)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(1)),
+ ((byte)(1)),
+ ((byte)(8)),
+ ((byte)(100)),
+ ((byte)(11)),
+ ((byte)(220)),
+ ((byte)(130)),
+ ((byte)(98)),
+ ((byte)(104)),
+ ((byte)(13)),
+ ((byte)(161)),
+ ((byte)(206)),
+ ((byte)(25)),
+ ((byte)(39)),
+ ((byte)(213)),
+ ((byte)(188)),
+ ((byte)(165)),
+ ((byte)(168)),
+ ((byte)(242)),
+ ((byte)(49)),
+ ((byte)(76)),
+ ((byte)(109)),
+ ((byte)(99)),
+ ((byte)(139)),
+ ((byte)(175)),
+ ((byte)(215)),
+ ((byte)(5)),
+ ((byte)(79)),
+ ((byte)(198)),
+ ((byte)(242)),
+ ((byte)(145)),
+ ((byte)(65)),
+ ((byte)(195)),
+ ((byte)(71)),
+ ((byte)(121)),
+ ((byte)(23)),
+ ((byte)(128)),
+ ((byte)(82)),
+ ((byte)(199)),
+ ((byte)(144)),
+ ((byte)(55)),
+ ((byte)(204)),
+ ((byte)(120)),
+ ((byte)(52)),
+ ((byte)(243)),
+ ((byte)(113)),
+ ((byte)(184)),
+ ((byte)(239)),
+ ((byte)(129)),
+ ((byte)(54)),
+ ((byte)(1)),
+ ((byte)(209)),
+ ((byte)(125)),
+ ((byte)(4)),
+ ((byte)(53)),
+ ((byte)(138)),
+ ((byte)(114)),
+ ((byte)(27)),
+ ((byte)(171)),
+ ((byte)(103)),
+ ((byte)(229)),
+ ((byte)(44)),
+ ((byte)(37)),
+ ((byte)(26)),
+ ((byte)(201)),
+ ((byte)(247)),
+ ((byte)(84)),
+ ((byte)(116)),
+ ((byte)(154)),
+ ((byte)(33)),
+ ((byte)(230)),
+ ((byte)(80)),
+ ((byte)(221)),
+ ((byte)(62)),
+ ((byte)(233)),
+ ((byte)(224)),
+ ((byte)(207)),
+ ((byte)(202)),
+ ((byte)(245)),
+ ((byte)(153)),
+ ((byte)(80)),
+ ((byte)(80)),
+ ((byte)(140)),
+ ((byte)(198)),
+ ((byte)(22)),
+ ((byte)(140)),
+ ((byte)(153)),
+ ((byte)(247)),
+ ((byte)(238)),
+ ((byte)(214)),
+ ((byte)(142)),
+ ((byte)(74)),
+ ((byte)(222)),
+ ((byte)(237)),
+ ((byte)(16)),
+ ((byte)(33)),
+ ((byte)(205)),
+ ((byte)(199)),
+ ((byte)(151)),
+ ((byte)(244)),
+ ((byte)(34)),
+ ((byte)(151)),
+ ((byte)(157)),
+ ((byte)(20)),
+ ((byte)(65)),
+ ((byte)(129)),
+ ((byte)(62)),
+ ((byte)(23)),
+ ((byte)(144)),
+ ((byte)(16)),
+ ((byte)(63)),
+ ((byte)(42)),
+ ((byte)(130)),
+ ((byte)(14)),
+ ((byte)(134)),
+ ((byte)(5)),
+ ((byte)(164)),
+ ((byte)(242)),
+ ((byte)(210)),
+ ((byte)(157)),
+ ((byte)(134)),
+ ((byte)(28)),
+ ((byte)(201)),
+ ((byte)(143)),
+ ((byte)(141)),
+ ((byte)(156)),
+ ((byte)(77)),
+ ((byte)(246)),
+ ((byte)(32)),
+ ((byte)(146)),
+ ((byte)(135)),
+ ((byte)(121)),
+ ((byte)(54)),
+ ((byte)(30)),
+ ((byte)(93)),
+ ((byte)(163)),
+ ((byte)(24)),
+ ((byte)(80)),
+ ((byte)(242)),
+ ((byte)(173)),
+ ((byte)(74)),
+ ((byte)(67)),
+ ((byte)(71)),
+ ((byte)(67)),
+ ((byte)(64)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(119)),
+ ((byte)(166)),
+ ((byte)(252)),
+ ((byte)(136)),
+ ((byte)(41)),
+ ((byte)(50)),
+ ((byte)(167)),
+ ((byte)(39)),
+ ((byte)(157)),
+ ((byte)(194)),
+ ((byte)(103)),
+ ((byte)(3)),
+ ((byte)(255)),
+ ((byte)(211)),
+ ((byte)(64)),
+ ((byte)(101)),
+ ((byte)(140)),
+ ((byte)(248)),
+ ((byte)(190)),
+ ((byte)(155)),
+ ((byte)(137)),
+ ((byte)(16)),
+ ((byte)(37)),
+ ((byte)(238)),
+ ((byte)(194)),
+ ((byte)(157)),
+ ((byte)(166)),
+ ((byte)(78)),
+ ((byte)(109)),
+ ((byte)(14)),
+ ((byte)(142)),
+ ((byte)(24)),
+ ((byte)(191)),
+ ((byte)(11)),
+ ((byte)(109)),
+ ((byte)(149)),
+ ((byte)(72)),
+ ((byte)(100)),
+ ((byte)(11)),
+ ((byte)(31)),
+ ((byte)(112)),
+ ((byte)(132)),
+ ((byte)(186)),
+ ((byte)(209)),
+ ((byte)(52)),
+ ((byte)(171)),
+ ((byte)(176)),
+ ((byte)(193)),
+ ((byte)(25)),
+ ((byte)(97)),
+ ((byte)(234)),
+ ((byte)(187)),
+ ((byte)(103)),
+ ((byte)(118)),
+ ((byte)(158)),
+ ((byte)(77)),
+ ((byte)(48)),
+ ((byte)(124)),
+ ((byte)(40)),
+ ((byte)(30)),
+ ((byte)(184)),
+ ((byte)(121)),
+ ((byte)(229)),
+ ((byte)(38))};
+ this.passwordControl1.Enabled = false;
+ this.passwordControl1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.passwordControl1.Location = new System.Drawing.Point(70, 109);
+ this.passwordControl1.Margin = new System.Windows.Forms.Padding(4);
+ this.passwordControl1.Name = "passwordControl1";
+ this.passwordControl1.Size = new System.Drawing.Size(513, 161);
+ this.passwordControl1.TabIndex = 27;
+ //
+ // tabPage2
+ //
+ this.tabPage2.BackColor = System.Drawing.Color.Gainsboro;
+ this.tabPage2.Controls.Add(this.AdvancedButton);
+ this.tabPage2.Controls.Add(this.label2);
+ this.tabPage2.Controls.Add(this.groupBox1);
+ this.tabPage2.Controls.Add(label3);
+ this.tabPage2.Controls.Add(this.label4);
+ this.tabPage2.Controls.Add(this.MaxAgeNnumericUpDown);
+ this.tabPage2.Controls.Add(this.MaxFullsNumericUpDown);
+ this.tabPage2.Controls.Add(this.MaxFullsCheckBox);
+ this.tabPage2.Controls.Add(this.MaxAgeCheckBox);
+ this.tabPage2.Controls.Add(this.CleanFullBackupHelptext);
+ this.tabPage2.ImageIndex = 4;
+ this.tabPage2.Location = new System.Drawing.Point(4, 28);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Size = new System.Drawing.Size(626, 385);
+ this.tabPage2.TabIndex = 5;
+ this.tabPage2.Text = "Cleanup";
+ //
+ // AdvancedButton
+ //
+ this.AdvancedButton.Location = new System.Drawing.Point(23, 321);
+ this.AdvancedButton.Name = "AdvancedButton";
+ this.AdvancedButton.Size = new System.Drawing.Size(104, 37);
+ this.AdvancedButton.TabIndex = 41;
+ this.AdvancedButton.Text = "Advanced";
+ this.AdvancedButton.UseVisualStyleBackColor = true;
+ this.AdvancedButton.Click += new System.EventHandler(this.AdvancedButtonClick);
+ //
+ // label2
+ //
+ this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic);
+ this.label2.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.label2.Location = new System.Drawing.Point(41, 276);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(528, 16);
+ this.label2.TabIndex = 40;
+ this.label2.Text = "Incremental backups save disk space and run time by only saving files changed sin" +
+ "ce the last full backup.";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(label1);
+ this.groupBox1.Controls.Add(this.FullAfterNRadioButton);
+ this.groupBox1.Controls.Add(this.FullDaysRadioButton);
+ this.groupBox1.Controls.Add(this.FullAlwaysRadioButton);
+ this.groupBox1.Controls.Add(this.FullDaysNumericUpDown);
+ this.groupBox1.Controls.Add(label8);
+ this.groupBox1.Controls.Add(this.FullAfterNNumericUpDown);
+ this.groupBox1.Location = new System.Drawing.Point(23, 136);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(465, 137);
+ this.groupBox1.TabIndex = 39;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Full / Incremental";
+ //
+ // FullAfterNRadioButton
+ //
+ this.FullAfterNRadioButton.AutoSize = true;
+ this.FullAfterNRadioButton.Location = new System.Drawing.Point(21, 88);
+ this.FullAfterNRadioButton.Name = "FullAfterNRadioButton";
+ this.FullAfterNRadioButton.Size = new System.Drawing.Size(184, 23);
+ this.FullAfterNRadioButton.TabIndex = 39;
+ this.FullAfterNRadioButton.Text = "Do a full backup after ";
+ this.FullAfterNRadioButton.UseVisualStyleBackColor = true;
+ this.FullAfterNRadioButton.CheckedChanged += new System.EventHandler(this.CheckedChanged);
+ //
+ // FullDaysRadioButton
+ //
+ this.FullDaysRadioButton.AutoSize = true;
+ this.FullDaysRadioButton.Location = new System.Drawing.Point(21, 55);
+ this.FullDaysRadioButton.Name = "FullDaysRadioButton";
+ this.FullDaysRadioButton.Size = new System.Drawing.Size(190, 23);
+ this.FullDaysRadioButton.TabIndex = 38;
+ this.FullDaysRadioButton.Text = "Do a full backup every ";
+ this.FullDaysRadioButton.UseVisualStyleBackColor = true;
+ this.FullDaysRadioButton.CheckedChanged += new System.EventHandler(this.CheckedChanged);
+ //
+ // FullAlwaysRadioButton
+ //
+ this.FullAlwaysRadioButton.AutoSize = true;
+ this.FullAlwaysRadioButton.Checked = true;
+ this.FullAlwaysRadioButton.Location = new System.Drawing.Point(21, 26);
+ this.FullAlwaysRadioButton.Name = "FullAlwaysRadioButton";
+ this.FullAlwaysRadioButton.Size = new System.Drawing.Size(194, 23);
+ this.FullAlwaysRadioButton.TabIndex = 37;
+ this.FullAlwaysRadioButton.TabStop = true;
+ this.FullAlwaysRadioButton.Text = "Always do full backups.";
+ this.FullAlwaysRadioButton.UseVisualStyleBackColor = true;
+ this.FullAlwaysRadioButton.CheckedChanged += new System.EventHandler(this.CheckedChanged);
+ //
+ // FullDaysNumericUpDown
+ //
+ this.FullDaysNumericUpDown.Enabled = false;
+ this.FullDaysNumericUpDown.Location = new System.Drawing.Point(211, 55);
+ this.FullDaysNumericUpDown.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.FullDaysNumericUpDown.Name = "FullDaysNumericUpDown";
+ this.FullDaysNumericUpDown.Size = new System.Drawing.Size(58, 27);
+ this.FullDaysNumericUpDown.TabIndex = 34;
+ this.FullDaysNumericUpDown.Value = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ //
+ // FullAfterNNumericUpDown
+ //
+ this.FullAfterNNumericUpDown.Enabled = false;
+ this.FullAfterNNumericUpDown.Location = new System.Drawing.Point(211, 88);
+ this.FullAfterNNumericUpDown.Maximum = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ this.FullAfterNNumericUpDown.Name = "FullAfterNNumericUpDown";
+ this.FullAfterNNumericUpDown.Size = new System.Drawing.Size(58, 27);
+ this.FullAfterNNumericUpDown.TabIndex = 36;
+ this.FullAfterNNumericUpDown.Value = new decimal(new int[] {
+ 8,
+ 0,
+ 0,
+ 0});
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(350, 88);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(41, 19);
+ this.label4.TabIndex = 17;
+ this.label4.Text = "days";
+ //
+ // MaxAgeNnumericUpDown
+ //
+ this.MaxAgeNnumericUpDown.Location = new System.Drawing.Point(280, 83);
+ this.MaxAgeNnumericUpDown.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.MaxAgeNnumericUpDown.Name = "MaxAgeNnumericUpDown";
+ this.MaxAgeNnumericUpDown.Size = new System.Drawing.Size(64, 27);
+ this.MaxAgeNnumericUpDown.TabIndex = 16;
+ this.MaxAgeNnumericUpDown.Value = new decimal(new int[] {
+ 90,
+ 0,
+ 0,
+ 0});
+ //
+ // MaxFullsNumericUpDown
+ //
+ this.MaxFullsNumericUpDown.Location = new System.Drawing.Point(208, 28);
+ this.MaxFullsNumericUpDown.Minimum = new decimal(new int[] {
+ 3,
+ 0,
+ 0,
+ 0});
+ this.MaxFullsNumericUpDown.Name = "MaxFullsNumericUpDown";
+ this.MaxFullsNumericUpDown.Size = new System.Drawing.Size(62, 27);
+ this.MaxFullsNumericUpDown.TabIndex = 14;
+ this.MaxFullsNumericUpDown.Value = new decimal(new int[] {
+ 4,
+ 0,
+ 0,
+ 0});
+ //
+ // MaxFullsCheckBox
+ //
+ this.MaxFullsCheckBox.AutoSize = true;
+ this.MaxFullsCheckBox.Checked = true;
+ this.MaxFullsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.MaxFullsCheckBox.Location = new System.Drawing.Point(23, 30);
+ this.MaxFullsCheckBox.Name = "MaxFullsCheckBox";
+ this.MaxFullsCheckBox.Size = new System.Drawing.Size(190, 23);
+ this.MaxFullsCheckBox.TabIndex = 13;
+ this.MaxFullsCheckBox.Text = "Never keep more than ";
+ this.MaxFullsCheckBox.UseVisualStyleBackColor = true;
+ this.MaxFullsCheckBox.CheckedChanged += new System.EventHandler(this.CheckedChanged);
+ //
+ // MaxAgeCheckBox
+ //
+ this.MaxAgeCheckBox.AutoSize = true;
+ this.MaxAgeCheckBox.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.MaxAgeCheckBox.Location = new System.Drawing.Point(23, 87);
+ this.MaxAgeCheckBox.Name = "MaxAgeCheckBox";
+ this.MaxAgeCheckBox.Size = new System.Drawing.Size(251, 23);
+ this.MaxAgeCheckBox.TabIndex = 11;
+ this.MaxAgeCheckBox.Text = "Never keep backups older than ";
+ this.MaxAgeCheckBox.UseVisualStyleBackColor = true;
+ this.MaxAgeCheckBox.CheckedChanged += new System.EventHandler(this.CheckedChanged);
+ //
+ // CleanFullBackupHelptext
+ //
+ this.CleanFullBackupHelptext.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic);
+ this.CleanFullBackupHelptext.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.CleanFullBackupHelptext.Location = new System.Drawing.Point(41, 59);
+ this.CleanFullBackupHelptext.Name = "CleanFullBackupHelptext";
+ this.CleanFullBackupHelptext.Size = new System.Drawing.Size(440, 16);
+ this.CleanFullBackupHelptext.TabIndex = 8;
+ this.CleanFullBackupHelptext.Text = "To prevent the backups from growing indefinetly, old backups should be deleted re" +
+ "gularly";
+ //
+ // SummaryTabPage
+ //
+ this.SummaryTabPage.BackColor = System.Drawing.Color.Gainsboro;
+ this.SummaryTabPage.Controls.Add(this.jobSummary1);
+ this.SummaryTabPage.ImageIndex = 5;
+ this.SummaryTabPage.Location = new System.Drawing.Point(4, 28);
+ this.SummaryTabPage.Name = "SummaryTabPage";
+ this.SummaryTabPage.Size = new System.Drawing.Size(626, 385);
+ this.SummaryTabPage.TabIndex = 3;
+ this.SummaryTabPage.Text = "Summary";
+ this.SummaryTabPage.ToolTipText = "Summary of the backup job";
+ this.SummaryTabPage.UseVisualStyleBackColor = true;
+ //
+ // jobSummary1
+ //
+ this.jobSummary1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.jobSummary1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.jobSummary1.Location = new System.Drawing.Point(0, 0);
+ this.jobSummary1.Margin = new System.Windows.Forms.Padding(4);
+ this.jobSummary1.Name = "jobSummary1";
+ this.jobSummary1.Size = new System.Drawing.Size(626, 385);
+ this.jobSummary1.TabIndex = 0;
+ //
+ // TabsImageList
+ //
+ this.TabsImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("TabsImageList.ImageStream")));
+ this.TabsImageList.TransparentColor = System.Drawing.Color.Transparent;
+ this.TabsImageList.Images.SetKeyName(0, "school-time-ico.png");
+ this.TabsImageList.Images.SetKeyName(1, "Source.png");
+ this.TabsImageList.Images.SetKeyName(2, "bedicon.png");
+ this.TabsImageList.Images.SetKeyName(3, "password_icon.png");
+ this.TabsImageList.Images.SetKeyName(4, "Cleanup.png");
+ this.TabsImageList.Images.SetKeyName(5, "clockicon.png");
+ this.TabsImageList.Images.SetKeyName(6, "Error.png");
+ //
+ // BottomToolStrip
+ //
+ this.BottomToolStrip.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.BottomToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.BottomToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.CanButton,
+ this.NextButton,
+ this.BackButton,
+ this.ExplainToolStripLabel});
+ this.BottomToolStrip.Location = new System.Drawing.Point(0, 417);
+ this.BottomToolStrip.MaximumSize = new System.Drawing.Size(0, 35);
+ this.BottomToolStrip.MinimumSize = new System.Drawing.Size(0, 35);
+ this.BottomToolStrip.Name = "BottomToolStrip";
+ this.BottomToolStrip.Size = new System.Drawing.Size(634, 35);
+ this.BottomToolStrip.TabIndex = 27;
+ this.BottomToolStrip.Text = "toolStrip3";
+ //
+ // CanButton
+ //
+ this.CanButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.CanButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("CanButton.BackgroundImage")));
+ this.CanButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.CanButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.CanButton.Image = ((System.Drawing.Image)(resources.GetObject("CanButton.Image")));
+ this.CanButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(68, 32);
+ this.CanButton.Text = " CANCEL ";
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // NextButton
+ //
+ this.NextButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.NextButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("NextButton.BackgroundImage")));
+ this.NextButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.NextButton.Image = ((System.Drawing.Image)(resources.GetObject("NextButton.Image")));
+ this.NextButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.NextButton.Name = "NextButton";
+ this.NextButton.Size = new System.Drawing.Size(62, 32);
+ this.NextButton.Text = " NEXT";
+ this.NextButton.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage;
+ this.NextButton.Click += new System.EventHandler(this.NextButton_Click);
+ //
+ // BackButton
+ //
+ this.BackButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.BackButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("BackButton.BackgroundImage")));
+ this.BackButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.BackButton.Enabled = false;
+ this.BackButton.Image = ((System.Drawing.Image)(resources.GetObject("BackButton.Image")));
+ this.BackButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.BackButton.Name = "BackButton";
+ this.BackButton.Size = new System.Drawing.Size(63, 32);
+ this.BackButton.Text = "BACK ";
+ this.BackButton.Click += new System.EventHandler(this.BackButton_Click);
+ //
+ // ExplainToolStripLabel
+ //
+ this.ExplainToolStripLabel.Image = ((System.Drawing.Image)(resources.GetObject("ExplainToolStripLabel.Image")));
+ this.ExplainToolStripLabel.Name = "ExplainToolStripLabel";
+ this.ExplainToolStripLabel.Size = new System.Drawing.Size(102, 32);
+ this.ExplainToolStripLabel.Text = "toolStripLabel3";
+ //
+ // JobDialog
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(634, 452);
+ this.Controls.Add(this.MainTabControl);
+ this.Controls.Add(this.BottomToolStrip);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "JobDialog";
+ this.Text = "Edit Job";
+ this.MainTabControl.ResumeLayout(false);
+ this.TimeTabPage.ResumeLayout(false);
+ this.SourceTabPage.ResumeLayout(false);
+ this.SourceTabControl.ResumeLayout(false);
+ this.TreeViewTabPage.ResumeLayout(false);
+ this.ListViewTabPage.ResumeLayout(false);
+ this.FiltersTabPage.ResumeLayout(false);
+ this.DestTabPage.ResumeLayout(false);
+ this.splitContainer1.Panel1.ResumeLayout(false);
+ this.splitContainer1.Panel2.ResumeLayout(false);
+ this.splitContainer1.ResumeLayout(false);
+ this.tabPage1.ResumeLayout(false);
+ this.tabPage2.ResumeLayout(false);
+ this.tabPage2.PerformLayout();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.FullDaysNumericUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.FullAfterNNumericUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxAgeNnumericUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.MaxFullsNumericUpDown)).EndInit();
+ this.SummaryTabPage.ResumeLayout(false);
+ this.BottomToolStrip.ResumeLayout(false);
+ this.BottomToolStrip.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TabControl MainTabControl;
+ private System.Windows.Forms.TabPage SourceTabPage;
+ private System.Windows.Forms.TabPage TimeTabPage;
+ private System.Windows.Forms.ListBox SourceListBox;
+ private System.Windows.Forms.TabPage DestTabPage;
+ private System.Windows.Forms.SplitContainer splitContainer1;
+ private System.Windows.Forms.Panel UIFPanel;
+ private System.Windows.Forms.FlowLayoutPanel BackEndTableLayoutPanel;
+ private System.Windows.Forms.ToolStrip BottomToolStrip;
+ private System.Windows.Forms.ToolStripButton CanButton;
+ private System.Windows.Forms.ToolStripButton NextButton;
+ private System.Windows.Forms.ToolStripButton BackButton;
+ private System.Windows.Forms.TabPage SummaryTabPage;
+ private System.Windows.Forms.ToolStripLabel ExplainToolStripLabel;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.CheckBox MaxFullsCheckBox;
+ private System.Windows.Forms.CheckBox MaxAgeCheckBox;
+ private System.Windows.Forms.Label CleanFullBackupHelptext;
+ private System.Windows.Forms.NumericUpDown MaxFullsNumericUpDown;
+ private System.Windows.Forms.NumericUpDown MaxAgeNnumericUpDown;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.NumericUpDown FullAfterNNumericUpDown;
+ private System.Windows.Forms.NumericUpDown FullDaysNumericUpDown;
+ private TaskEditControl TaskEditor;
+ private JobSummary jobSummary1;
+ private System.Windows.Forms.ImageList TabsImageList;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.RadioButton FullAfterNRadioButton;
+ private System.Windows.Forms.RadioButton FullDaysRadioButton;
+ private System.Windows.Forms.RadioButton FullAlwaysRadioButton;
+ private System.Windows.Forms.Button AdvancedButton;
+ private PasswordControl passwordControl1;
+ private System.Windows.Forms.TabControl SourceTabControl;
+ private System.Windows.Forms.TabPage TreeViewTabPage;
+ private Utility.FolderTreeControl SourceFolderTreeControl;
+ private System.Windows.Forms.TabPage ListViewTabPage;
+ private System.Windows.Forms.TabPage FiltersTabPage;
+ private System.Windows.Forms.Button FilterEditButton;
+ private System.Windows.Forms.ListBox FilterListBox;
+ private System.Windows.Forms.ComboBox PasswordMethodComboBox;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/JobDialog.cs b/Duplicati/Scheduler/JobDialog.cs
new file mode 100644
index 000000000..c8588c79d
--- /dev/null
+++ b/Duplicati/Scheduler/JobDialog.cs
@@ -0,0 +1,349 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Edit a job
+ ///
+ public partial class JobDialog : Form
+ {
+ private Microsoft.Win32.TaskScheduler.Trigger itsTrigger;
+ ///
+ /// Gets/Sets the job's task scheduler trigger
+ ///
+ public Microsoft.Win32.TaskScheduler.Trigger Trigger
+ {
+ get { return itsTrigger; }
+ set { this.TaskEditor.SetTrigger(value); }
+ }
+ ///
+ /// Gets the JobsRow being edited
+ ///
+ public Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow Row { get; private set; }
+ ///
+ /// Gets the settings
+ ///
+ private Duplicati.Scheduler.Data.SchedulerDataSet.SettingsDataTable Settings
+ {
+ get { return ((Duplicati.Scheduler.Data.SchedulerDataSet)Row.Table.DataSet).Settings; }
+ }
+ ///
+ /// Edit a Job
+ ///
+ /// Row to edit
+ public JobDialog(Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow aRow)
+ {
+ InitializeComponent();
+ this.Text = "Edit job " + aRow.Name + "(" + Utility.User.UserName + ")";
+ // Dang background colors in tab pages - can't trust them.
+ foreach (TabPage P in this.MainTabControl.TabPages)
+ P.BackColor = this.BackColor;
+ foreach (TabPage P in this.SourceTabControl.TabPages)
+ P.BackColor = this.BackColor;
+ this.SourceFolderTreeControl.BackColor = this.BackColor;
+ // Add radio buttons for backends; put the backend in the tag
+ this.BackEndTableLayoutPanel.Controls.AddRange(
+ (from Library.Interface.IBackend qB in Duplicati.Library.DynamicLoader.BackendLoader.Backends
+ orderby qB.DisplayName
+ select BackendRadioButton(qB)).ToArray());
+ // Put the tooltip text at the bottom of the screen for easy user viewage
+ this.ExplainToolStripLabel.Text = this.MainTabControl.SelectedTab.ToolTipText;
+ // And use the row
+ SetRow(aRow);
+ }
+ ///
+ /// Make a radio button with the backend attached to tag
+ ///
+ /// Backend to attach
+ /// new radio button
+ private RadioButton BackendRadioButton(Library.Interface.IBackend aBackend)
+ {
+ RadioButton Result = new RadioButton()
+ {
+ Text = aBackend.DisplayName,
+ Tag = aBackend,
+ };
+ Result.CheckedChanged += new EventHandler(BackendRadioButtonClicked);
+ return Result;
+ }
+
+ ///
+ /// The backend control was entered, probably user selected a backend
+ ///
+ void BackendRadioButtonClicked(object sender, EventArgs e)
+ {
+ if (!((RadioButton)sender).Checked) return;
+ // Find the checked radio button and assign the GUI from the tag
+ GuiControl = ((RadioButton)sender).Tag as Library.Interface.IGUIControl;
+ // Show the new user interface
+ GuiInterface = GuiControl.GetControl(new Dictionary(), Row.Options);
+ GuiInterface.SetBounds(0, 0, this.UIFPanel.Width, this.UIFPanel.Height);
+ GuiInterface.Visible = true;
+ this.UIFPanel.Controls.Clear();
+ this.UIFPanel.Controls.Add(GuiInterface);
+ }
+ // The current backend user control
+ private Library.Interface.IGUIControl GuiControl = null;
+ // The current backend user control control
+ private Control GuiInterface = null;
+ ///
+ /// Set up the controls for a job row
+ ///
+ /// Row to use
+ private void SetRow(Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow aRow)
+ {
+ Row = aRow;
+ this.Text = "Job: "+ Row.Name;
+ // Set the source tree contents
+ if (!Row.IsSourceNull())
+ this.SourceFolderTreeControl.SetSelectedFolders(Row.Source.Split(new char[] { System.IO.Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries));
+ if (Row.IsFullRepeatDaysNull()) Row.FullRepeatDays = 10;
+ // Full of it.
+ this.FullAlwaysRadioButton.Checked = (Row.IsFullOnlyNull() ? false : Row.FullOnly) || (Row.FullAfterN == 0 && Row.FullRepeatDays == 0);
+ this.FullDaysNumericUpDown.Value = (decimal)Row.FullRepeatDays;
+ this.FullDaysRadioButton.Checked = Row.FullRepeatDays > 0;
+ this.FullAfterNNumericUpDown.Value = (decimal)Row.FullAfterN;
+ this.FullAfterNRadioButton.Checked = Row.FullAfterN > 0;
+ if (!Row.IsFilterNull()) this.FilterList = Row.FilterLines;
+ if (!Row.IsMaxFullsNull()) this.MaxFullsNumericUpDown.Value = Row.MaxFulls;
+ if (Row.IsMaxAgeDaysNull()) Row.MaxAgeDays = 0;
+ this.MaxAgeCheckBox.Checked = Row.MaxAgeDays > 0;
+ this.MaxAgeNnumericUpDown.Value = (decimal)Row.MaxAgeDays;
+ if (Row.IsMaxFullsNull()) Row.MaxFulls = 4;
+ this.MaxFullsCheckBox.Checked = Row.MaxFulls > 0;
+ this.MaxFullsNumericUpDown.Value = (decimal)Row.MaxFulls;
+ this.PasswordMethodComboBox.SelectedIndex = Row.GetCheckSrc();
+
+ itsAdvanced.Map = Row.MapDrives;
+ itsAdvanced.AutoDelete = Row.AutoCleanup;
+ this.passwordControl1.CheckMod = aRow.CheckMod;
+ this.passwordControl1.Checksum = aRow.Checksum;
+ if (Settings.Values.IsCheckSrcNull()) Settings.Values.CheckSrc = false;
+ if (!Settings.Values.CheckSrc) this.PasswordMethodComboBox.Items.RemoveAt(2); // No global option if not set
+ if (!Row.IsDestinationNull())
+ {
+ foreach (Control C in this.BackEndTableLayoutPanel.Controls)
+ ((RadioButton)C).Checked = Row.Destination.StartsWith(((Duplicati.Library.Interface.IBackend)C.Tag).ProtocolKey); //((RadioButton)C).Text + @":\\");
+ }
+ }
+ ///
+ /// Rips the configuration from the backend control
+ ///
+ /// The Options from the control
+ /// The backup destination
+ ///
+ private bool GetConfiguration(out Dictionary outOptions, out string outDestination)
+ {
+ // This makes me feel like a kiddie, and out args are evil
+ outDestination = null;
+ outOptions = null;
+ if (GuiControl == null) return false;
+ // First, call the 'Leave' thing
+ GuiControl.Leave(GuiInterface);
+ bool Result = false;
+ // Now, go in with reflection and get that m_options thing
+ try
+ {
+ System.Reflection.FieldInfo fld = GuiInterface.GetType().GetField("m_options", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+ if (fld != null)
+ {
+ Dictionary Options = (Dictionary)fld.GetValue(GuiInterface);
+ outOptions = new Dictionary();
+ // Now, we can call the GetConfiguration thing and convert the Options to usable ones.
+ outDestination = GuiControl.GetConfiguration(new Dictionary(),
+ Options, outOptions);
+ Result = true;
+ }
+ }
+ catch (Exception Ex)
+ {
+ MessageBox.Show(Ex.Message);
+ }
+ return Result;
+ }
+ ///
+ /// Returns a new un-attached JobsRow filled with edit results
+ ///
+ /// a new un-attached JobsRow
+ private Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow GetNewRow()
+ {
+ Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow NewRow = null;
+ // The table will die, yet the row lives on...
+ using (Duplicati.Scheduler.Data.SchedulerDataSet.JobsDataTable TempTable = new Duplicati.Scheduler.Data.SchedulerDataSet.JobsDataTable())
+ {
+ NewRow = TempTable.NewJobsRow();
+ NewRow.ItemArray = Row.ItemArray;
+ GetRow(NewRow);
+ }
+ return NewRow;
+ }
+ ///
+ /// Populate a JobsRow with results from the controls
+ ///
+ /// Row to fill
+ private void GetRow(Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow aRow)
+ {
+ // Now, if User has been in the Destination tab, we may have a new
+ // set of destination and options, fetch them.
+ if (GuiControl != null && VisitedDestination)
+ {
+ Dictionary Opts = new Dictionary();
+ string Dest = string.Empty;
+ if (GetConfiguration(out Opts, out Dest))
+ {
+ aRow.SetOptions(Opts);
+ aRow.Destination = Dest;
+ }
+ }
+ // Get stuff from the controls
+ aRow.Source = string.Join(System.IO.Path.PathSeparator.ToString(), this.SourceFolderTreeControl.SelectedFolders);
+ aRow.FullOnly = this.FullAlwaysRadioButton.Checked;
+ aRow.FullAfterN = this.FullAfterNRadioButton.Checked ? (int)this.FullAfterNNumericUpDown.Value : 0;
+ aRow.FullRepeatDays = this.FullDaysRadioButton.Checked ? (int)this.FullDaysNumericUpDown.Value : 0;
+ aRow.FilterLines = this.FilterList;
+ aRow.MaxFulls = this.MaxFullsCheckBox.Checked ? (int)this.MaxFullsNumericUpDown.Value : 0;
+ aRow.MaxAgeDays = this.MaxAgeCheckBox.Checked ? (int)this.MaxAgeNnumericUpDown.Value : 0;
+ aRow.Enabled = this.TaskEditor.GetTrigger().Enabled;
+ aRow.TriggerXML = TaskEditControl.TriggerToXml(this.TaskEditor.GetTrigger());
+ if (itsAdvanced.DialogResult == DialogResult.OK)
+ {
+ aRow.AutoCleanup = itsAdvanced.AutoDelete;
+ aRow.MapDrives = itsAdvanced.Map;
+ }
+ aRow.Checksum = Settings.Values.Checksum;
+ aRow.CheckMod = Settings.Values.CheckMod;
+ aRow.SetCheckSrc(this.PasswordMethodComboBox.SelectedIndex);
+ }
+ ///
+ /// Updates a summary with the latest
+ ///
+ private void GetSummary()
+ {
+ this.jobSummary1.SetSummary(GetNewRow(), TaskScheduler.Describe(this.TaskEditor.GetTrigger())); // (Row.TaskName));
+ this.jobSummary1.Enabled = this.TaskEditor.GetTrigger().Enabled;
+ this.SummaryTabPage.ImageIndex = this.jobSummary1.ValidateSettings() ? 5 : 6;
+ }
+ ///
+ /// Pressed the OK button, update the row and close
+ ///
+ ///
+ ///
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ // JobSummary has error checking, do it
+ if (!this.jobSummary1.ValidateSettings())
+ {
+ MessageBox.Show("The errors must be resolved first.");
+ return;
+ }
+ GetRow(Row); // Populate the row
+ // Get the trigger
+ itsTrigger = this.TaskEditor.GetTrigger();
+ // And report all OK
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+ ///
+ /// Pressed CANCEL, just close
+ ///
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ // Has user been in the Destination Tab
+ private bool VisitedDestination = false;
+ ///
+ /// Changed a TAB either directly or with NEXT or BACK
+ ///
+ private void MainTabControlSelectedIndexChanged(object sender, EventArgs e)
+ {
+ // Can we go back?
+ this.BackButton.Enabled = this.MainTabControl.SelectedIndex > 0;
+ // Show user the tooltip
+ this.ExplainToolStripLabel.Text = this.MainTabControl.SelectedTab.ToolTipText;
+ // Are we on the summary page?
+ bool LastPage = (this.MainTabControl.SelectedIndex == this.MainTabControl.TabPages.Count - 1);
+ // What's next
+ this.NextButton.Text = LastPage ? " FINISHED " : " NEXT > ";
+ // Is we in the Destination place?
+ VisitedDestination = VisitedDestination || this.MainTabControl.SelectedTab.Text == "Destination";
+ // If summary page, populate it with the latest stuff
+ if (LastPage) GetSummary();
+ }
+ ///
+ /// Pressed BACK - go to previous page
+ ///
+ private void BackButton_Click(object sender, EventArgs e)
+ {
+ this.MainTabControl.SelectedIndex -= 1;
+ }
+ ///
+ /// Pressed NEXT - go to next page or show 'finished'
+ ///
+ private void NextButton_Click(object sender, EventArgs e)
+ {
+ if (this.NextButton.Text == " FINISHED ")
+ this.OKButton_Click(sender, e);
+ else
+ this.MainTabControl.SelectedIndex++;
+ }
+ ///
+ /// Get/Set the filters
+ ///
+ private string[] FilterList
+ {
+ get { return (from object qO in this.FilterListBox.Items select qO.ToString()).ToArray(); }
+ set { this.FilterListBox.Items.Clear(); this.FilterListBox.Items.AddRange(value); }
+ }
+ ///
+ /// Pressed FILTERS - edit the filters
+ ///
+ private void FiltersToolStripButton_Click(object sender, EventArgs e)
+ {
+ FilterDialog fd = new FilterDialog();
+ fd.Filter = this.FilterList;
+ if (fd.ShowDialog() == DialogResult.OK) this.FilterList = fd.Filter;
+ }
+ ///
+ /// One of the checkboxes or radio buttons changes
+ ///
+ private void CheckedChanged(object sender, EventArgs e)
+ {
+ this.MaxFullsNumericUpDown.Enabled = this.MaxFullsCheckBox.Checked;
+ this.MaxAgeNnumericUpDown.Enabled = this.MaxAgeCheckBox.Checked;
+ this.FullAfterNNumericUpDown.Enabled = this.FullAfterNRadioButton.Checked;
+ this.FullDaysNumericUpDown.Enabled = this.FullDaysRadioButton.Checked;
+ }
+
+ private AdvancedDialog itsAdvanced = new AdvancedDialog();
+ ///
+ /// Pressed the ADVANCED button
+ ///
+ private void AdvancedButtonClick(object sender, EventArgs e)
+ {
+ itsAdvanced.ShowDialog();
+ }
+ ///
+ /// Changes the Source TAB page
+ ///
+ private void SourceTabControl_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (this.SourceTabControl.SelectedTab == this.ListViewTabPage)
+ {
+ this.SourceListBox.Items.Clear();
+ this.SourceListBox.Items.AddRange(this.SourceFolderTreeControl.SelectedFolders);
+ }
+ }
+ ///
+ /// Changes the password method
+ ///
+ private void PasswordMethodComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ this.passwordControl1.Enabled = this.PasswordMethodComboBox.SelectedIndex == 1;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/JobDialog.resx b/Duplicati/Scheduler/JobDialog.resx
new file mode 100644
index 000000000..b7930c8ac
--- /dev/null
+++ b/Duplicati/Scheduler/JobDialog.resx
@@ -0,0 +1,914 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ 465, 17
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADa
+ EAAAAk1TRnQBSQFMAgEBBwEAATgBAgE4AQIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+ AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+ AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+ AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+ AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+ AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+ ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+ AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+ AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+ AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+ AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+ AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+ AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+ AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+ AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+ ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+ Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+ AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+ AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+ AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+ ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+ Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+ AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+ AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+ AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+ AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+ AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+ AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wUAAfMBmAFyAk8CcgNJ
+ AQcBAAT/AfQBmAF4AnIBlwFyA0kBHAH/IgAB/wGYAU8BmAO7AXIBUAF4AZkBeAFQAQcD/wEIAVABcQGd
+ ArsBSQFQAXgBmQF4AVABHAQAAfQBvAFzAUUBRAFuAQcB9BUAAf8CeAEIArsBugG0AUkCeAH/AngBSQL/
+ AZkBTwGdARkB9AH/AfQBSQJ4Af8CeAFJAwAB8AFvAUYEJQEkAUQBvBQAAZgBeAGZAXgBugG0AboBtAFJ
+ AZkD/wGZAUkB/wEIAVABugG8AQcB8gL0AUkBmQP/AZkBSQIAARsBTAFGAiYCTQEmAiUBRAG8EgAB9AGX
+ AQgClwG6A7QBUAKZAf8CeAFJAf8BcgGQAdwBBwF1ARoB/wH0AVACmQH/AngBSQEAAfQBbwFMAk0B4wL/
+ AXUBJgIlAUQB9BEAApgBCAGdAZgEtAGRAXMBmQEIAXgCUAHwAU8BugIJAQcBkwHxAf8B7wFzAZkBCAF4
+ AVABcgEAARoBTANNAXUC/wHjAiYBJQEkAQcRAAF4AQgBmAK7A7QCswGRAXICUAFzAVABmAFxAdwCCQEZ
+ AbwBFgHyAf8B7wFyAlABcQGYAQABkwVNAnUBTQMmASUBbhEAAZcBGwGXAZ0BuwG0AboBtAG6AZ0BugGR
+ AnIBCAFPAZgBkALcAQkBGQHxARYBbwHzA/QBGQG6AZgBAAFvBOMBdQL/Ak0CJgElAUQRAAGXAcIBmAGX
+ ArsBtAG6AbsBnQJ3AZcBcgEIAU8BmAGQAtwBCQEZAfIBkwEWBPQB8wG6AZgBAAFvBHUBlAL/AXUBTQIm
+ ASUBRREAAXgBCAGYAZ4BCAHCA7oBlwJ3ApcBmQFyAZgBcQHcAgkB8QEZAQcBkwH/AfMB/wH0ARkBnQGY
+ AQABkwR1Ab0C/wGaAU0CJgElAXMRAAEIAZkBCALBAcICuwK6Ap0BlwOYAfABTwG6ARkBCQEZAfMB8gGZ
+ AfQC/wH0ARkBcQEIAQABGgGTA5QBvQL/Ab0CTQEmAUYBvBEAAfQBlwEbAQgBwQIIArsCugG7AZgBCAFQ
+ AfMB/wFyAZADGQHzAZMBlAH0A/8BuwFyARsBAAH0AXQBlAGaAZQBmgL/AZQCTQFGAW8B9BIAAQgBmALC
+ AfEBwgG7AQkDuwEIAXgBmAEAAf8B8AFQAboDGQIaA/8BCQFxAQgB/wIAARsBbwKUAnUB4wJNAkwB8BMA
+ Af8CmAIbAcICCAK7AQgCmAH/AQAC/wGZAU8BnQEZBf8BuwFxAZgC/wMAARsBdAGTAnUB4wFNAUwBbwEb
+ FQAB/wEIAZcFCAGYAZcBmAH/AgAD/wEIAXIBcQGdArsBmAJyAQgD/wQAAfQBGgGTAm8BkwEaAfQYAAH0
+ AQgBmAKXAXgBCAH0BAAE/wH0AZkBeAJyAXgBmQH0Af8BwwL/IAAB/wEbARoBkwJ0AUwDSwFMASsBJQFM
+ ARoBAAGSCW0BSwEkAiUBSwGSCP8B8gEcAUoDSQFzAf8B8Q6RAbsDmQKaBJkDTAEsAisBGgFtAfQC8QUb
+ AXQCTAEsASsBJQFLAf8B9AT/AfABHAHrAUkBUAF4AZkBeAFQARwBkQG7BP8C9Ab/AfEBkQKZAQcBGQHz
+ Af8B8wEJAbUBRgF1AU0CLAErAUwBbQH0AZkBmAGZAZgCdAEcASsBdQFNAiwBKwElBP8B8gGSAXICkAFJ
+ AngB/wJ4AUkBkQG8AfQBBwGSAe8B7AEHB/8BkQH/AQkB3QH0BP8BGQElAZoD/wFNASUBbQH0AZgBeAGY
+ AXgBmAFzAXQBJQGaA/8BTQElAfMB9AHxAfcBcgGQA5YBSQGZA/8BmQFJAZEB8AHyAWwBZQFmAWUBrgH0
+ Bv8BkQEAAd0BCQH0BP8BGQFMAZoBUwEsAlMBTAFtAfYBmQF4AZgDeAF0ASUBmgFTASwCUwEkAewB6gFu
+ AZEBuQOWAbkBUAKZAf8CeAFJAZEB8AHzAWYDZQEHB/8BkQIAAfEBCQHzA/8B9AEcAUwBmgEaAXUBTAEa
+ AW0B/wHDApkBeAGYAXgBFgFSAUwBmgEaAXUBTAFLAUQBdAHxAboDlgK5Ae8BcwGZAQgBeAFQAXEBkQHw
+ AfIBbAJlAWYBBwH0Bv8BkQMAAfQBCQEZAvQCCQG8AUwBJQFMARoBAAFtAf8BoAGZAaABeQF4AXQBbwF5
+ AXQBKwIlAXQBbQFLARsB/wG6AZABlgS5Ae8BcgJQAXEBlgGRAfAB8QJlAWYBZQFsAQcG/wGRBQAB3QIZ
+ AQkHAAFtAf8FoAHjAZkBeQHwApkBeQEbAW0BSwEbAf8B8wG6AZYKuQGRAfAB/wG1AbsB9AGRAWUBbAEH
+ AfQC8wL/AZEFAAHdAhkBCQcAAW0B/wGgAZkBoAF5AXUBbwJ5AwkBuwEbAW0BRAEcA/8B8gG7CLkBlgGR
+ AfAF/wGuAWUBbAHvAe0B7wH0Af8BkQMAAfQBCQEZAfQBGQIJAfQFAAFtAf8DoAF6AeMBegF5AQcB3QMJ
+ AfEBbQFFAUsBcwEbAv8C8QG7ArkClgG6AbwB8gGRAfAG/wGRAWUBbAFmAWwB7wH0AZECAAEZAd0B9AH/
+ AfQDGQEJAfAEAAFtAf8BoAF5AaABTAF1AnkBuwEJAbUBuwG1AfEBbQFEA0sBcwG8Af8B8gH0AbsBugG7
+ AfQD/wGRAfAH/wGLA2UBiwHyAZEBAAIZAfQC/wH0BBkCCQMAAW0B9gKgAZoBFwGgAXkBmQQJAbUB8QFt
+ AUQDSwFKAUsBkwHyAfMB9AX/ARsBkQHwB/8B9AGuAmUB7wH/AZEB/wG8AZkCdAFSAUwESwFzAe0B9AIA
+ AW0B9gGgAXkB4wF0AeUBWAHvAbUBuwO0AfEBbQGTAW4BRQRLAfAI/wGRAfAI/wH0Aa4BZQG8Af8BkQOZ
+ ApoEmQGTAnQBSwFzAgABbQH2AaABegHjAZoBoAF5AQkBtQEJArUBtAHxAW0B/wH0Ae8BbgNLAfMI/wGR
+ AbwJ/wH0AfAC/wGRA5kEmgOZAnQBSwF0AgAB6gL/A/YB/wH2Av8F9AHqA/8B9AEHAW4BSwHzCP8CtAy8
+ AbsBkQH/ARsBGgGZBXQBUgF0ARwBGgH/AgAB7QHqDG0B6gHtBf8B9AHvAfMC/wH2Av8BwwP/AbQNkQHx
+ AUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAHwAQECAAL/AgABwAMAAfABDwIA
+ AYADAAHgAQcCAAGAAwABwAEDBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEB
+ BgABgAEBAgABgAEBAgABwAEDAgABgAEBAgAB4AEHAgABwAEDAgAB8AEPAgAB8AEPAgAC/wMAAQEeAAGA
+ BwABwAcAAeABAQYAAfgBfwYAAfgBfwYAAeABHwYAAcABDwYAAYABBwcAAQMHAAEDBwABAwcAAQMGAAs=
+
+
+
+ 324, 17
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYNJREFUSEvV1r1K
+ w1AYxvFzFd6Bd+EFiOCod6AggiA4KKKTOugiWHCu4qA4ObiVFqQV/KjY2qRp0ybVpEm/bD7bDg2Pnpaq
+ KIHqkFMDf8iU98d7hhxSLMgQuCz4pzS49N9LJW8xbF/n0LnZTKZnoBZCX6Q8j9XQKcZnt0AmVgJtbHoT
+ 8zthyEUBYl4EoTqKmdk4QuyhgKCfjKT3Zq+FzvoboiC6mWhSDNryMS+azPcMpZICQs+QHhN9PM9jEp1N
+ Daqq9zc0KqByuTJaIO07qNP1wKLBkf0AtdoeWOQLclwPLPIFGWYXLPIFVWouWOQLelENsMgXVJTqYJEv
+ SMhpYNH/AXG8Bhb5bij1qIBFvqD7OwksGoB0rUp/rhzorS16fYNEnGfSZSTSM9SqDZBcVsDcdhhTywe4
+ iFwFDool4phc2sfC7jGaTROkIEpQnmWsH54zu1Mv7p3ANBuwTBukJCsov9/U6rVXGIYFy3Jg27+v0+5g
+ 2D6/78JxXLhuC47tQlV0vAH+hUZFnK9GkQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ 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
+ //2tPwEyK1oCymFEHAAAAABJRU5ErkJggg==
+
+
+
+
+ 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
+ 3gAAAABJRU5ErkJggg==
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/JobSummary.Designer.cs b/Duplicati/Scheduler/JobSummary.Designer.cs
new file mode 100644
index 000000000..a0b8ac92e
--- /dev/null
+++ b/Duplicati/Scheduler/JobSummary.Designer.cs
@@ -0,0 +1,326 @@
+namespace Duplicati.Scheduler
+{
+ partial class JobSummary
+ {
+ ///
+ /// 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.Windows.Forms.Label label3;
+ System.Windows.Forms.Label label2;
+ System.Windows.Forms.Label nameLabel;
+ System.Windows.Forms.Label sourceLabel;
+ System.Windows.Forms.Label destinationLabel;
+ System.Windows.Forms.Label asLabel;
+ System.Windows.Forms.Label fullRepeatStrLabel;
+ System.Windows.Forms.Label label1;
+ System.Windows.Forms.Label label4;
+ this.MaxAgeTextBox = new System.Windows.Forms.RichTextBox();
+ this.MaxFullTextBox = new System.Windows.Forms.RichTextBox();
+ this.nameTextBox = new System.Windows.Forms.RichTextBox();
+ this.sourceTextBox = new System.Windows.Forms.RichTextBox();
+ this.destinationTextBox = new System.Windows.Forms.RichTextBox();
+ this.DescriptionTextBox = new System.Windows.Forms.RichTextBox();
+ this.fullRepeatStrTextBox = new System.Windows.Forms.RichTextBox();
+ this.SourceErrorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+ this.DestErrorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+ this.EnableLabel = new System.Windows.Forms.Label();
+ this.PassRichTextBox = new System.Windows.Forms.RichTextBox();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.listBox1 = new System.Windows.Forms.ListBox();
+ label3 = new System.Windows.Forms.Label();
+ label2 = new System.Windows.Forms.Label();
+ nameLabel = new System.Windows.Forms.Label();
+ sourceLabel = new System.Windows.Forms.Label();
+ destinationLabel = new System.Windows.Forms.Label();
+ asLabel = new System.Windows.Forms.Label();
+ fullRepeatStrLabel = new System.Windows.Forms.Label();
+ label1 = new System.Windows.Forms.Label();
+ label4 = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.SourceErrorProvider)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.DestErrorProvider)).BeginInit();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // label3
+ //
+ label3.AutoSize = true;
+ label3.Location = new System.Drawing.Point(45, 277);
+ label3.Name = "label3";
+ label3.Size = new System.Drawing.Size(219, 19);
+ label3.TabIndex = 35;
+ label3.Text = "Delete full backups older than";
+ //
+ // label2
+ //
+ label2.AutoSize = true;
+ label2.Location = new System.Drawing.Point(216, 244);
+ label2.Name = "label2";
+ label2.Size = new System.Drawing.Size(48, 19);
+ label2.TabIndex = 32;
+ label2.Text = "Keep ";
+ //
+ // nameLabel
+ //
+ nameLabel.AutoSize = true;
+ nameLabel.Location = new System.Drawing.Point(208, 18);
+ nameLabel.Name = "nameLabel";
+ nameLabel.Size = new System.Drawing.Size(56, 19);
+ nameLabel.TabIndex = 22;
+ nameLabel.Text = "Name:";
+ //
+ // sourceLabel
+ //
+ sourceLabel.AutoSize = true;
+ sourceLabel.Location = new System.Drawing.Point(128, 51);
+ sourceLabel.Name = "sourceLabel";
+ sourceLabel.Size = new System.Drawing.Size(136, 19);
+ sourceLabel.TabIndex = 24;
+ sourceLabel.Text = "Backup files from ";
+ //
+ // destinationLabel
+ //
+ destinationLabel.AutoSize = true;
+ destinationLabel.Location = new System.Drawing.Point(147, 84);
+ destinationLabel.Name = "destinationLabel";
+ destinationLabel.Size = new System.Drawing.Size(117, 19);
+ destinationLabel.TabIndex = 26;
+ destinationLabel.Text = "Put backups in ";
+ //
+ // asLabel
+ //
+ asLabel.AutoSize = true;
+ asLabel.Location = new System.Drawing.Point(167, 117);
+ asLabel.Name = "asLabel";
+ asLabel.Size = new System.Drawing.Size(97, 19);
+ asLabel.TabIndex = 28;
+ asLabel.Text = "Run backup ";
+ //
+ // fullRepeatStrLabel
+ //
+ fullRepeatStrLabel.AutoSize = true;
+ fullRepeatStrLabel.Location = new System.Drawing.Point(103, 211);
+ fullRepeatStrLabel.Name = "fullRepeatStrLabel";
+ fullRepeatStrLabel.Size = new System.Drawing.Size(161, 19);
+ fullRepeatStrLabel.TabIndex = 30;
+ fullRepeatStrLabel.Text = "Do a full backup after";
+ //
+ // label1
+ //
+ label1.AutoSize = true;
+ label1.Location = new System.Drawing.Point(373, 244);
+ label1.Name = "label1";
+ label1.Size = new System.Drawing.Size(98, 19);
+ label1.TabIndex = 37;
+ label1.Text = "full backups.";
+ //
+ // MaxAgeTextBox
+ //
+ this.MaxAgeTextBox.Location = new System.Drawing.Point(270, 274);
+ this.MaxAgeTextBox.Name = "MaxAgeTextBox";
+ this.MaxAgeTextBox.ReadOnly = true;
+ this.MaxAgeTextBox.Size = new System.Drawing.Size(97, 27);
+ this.MaxAgeTextBox.TabIndex = 34;
+ this.MaxAgeTextBox.TabStop = false;
+ this.MaxAgeTextBox.Text = "";
+ //
+ // MaxFullTextBox
+ //
+ this.MaxFullTextBox.Location = new System.Drawing.Point(270, 241);
+ this.MaxFullTextBox.Name = "MaxFullTextBox";
+ this.MaxFullTextBox.ReadOnly = true;
+ this.MaxFullTextBox.Size = new System.Drawing.Size(97, 27);
+ this.MaxFullTextBox.TabIndex = 33;
+ this.MaxFullTextBox.TabStop = false;
+ this.MaxFullTextBox.Text = "";
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Location = new System.Drawing.Point(270, 15);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.ReadOnly = true;
+ this.nameTextBox.Size = new System.Drawing.Size(238, 27);
+ this.nameTextBox.TabIndex = 23;
+ this.nameTextBox.TabStop = false;
+ this.nameTextBox.Text = "";
+ //
+ // sourceTextBox
+ //
+ this.sourceTextBox.Location = new System.Drawing.Point(270, 48);
+ this.sourceTextBox.Name = "sourceTextBox";
+ this.sourceTextBox.ReadOnly = true;
+ this.sourceTextBox.Size = new System.Drawing.Size(238, 27);
+ this.sourceTextBox.TabIndex = 25;
+ this.sourceTextBox.TabStop = false;
+ this.sourceTextBox.Text = "";
+ this.toolTip1.SetToolTip(this.sourceTextBox, "Double-click for a better view");
+ this.sourceTextBox.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.sourceTextBox_MouseDoubleClick);
+ //
+ // destinationTextBox
+ //
+ this.destinationTextBox.DetectUrls = false;
+ this.destinationTextBox.Location = new System.Drawing.Point(270, 81);
+ this.destinationTextBox.Name = "destinationTextBox";
+ this.destinationTextBox.ReadOnly = true;
+ this.destinationTextBox.Size = new System.Drawing.Size(238, 27);
+ this.destinationTextBox.TabIndex = 27;
+ this.destinationTextBox.TabStop = false;
+ this.destinationTextBox.Text = "";
+ //
+ // DescriptionTextBox
+ //
+ this.DescriptionTextBox.Location = new System.Drawing.Point(270, 114);
+ this.DescriptionTextBox.Name = "DescriptionTextBox";
+ this.DescriptionTextBox.ReadOnly = true;
+ this.DescriptionTextBox.Size = new System.Drawing.Size(238, 83);
+ this.DescriptionTextBox.TabIndex = 29;
+ this.DescriptionTextBox.TabStop = false;
+ this.DescriptionTextBox.Text = "";
+ //
+ // fullRepeatStrTextBox
+ //
+ this.fullRepeatStrTextBox.Location = new System.Drawing.Point(270, 208);
+ this.fullRepeatStrTextBox.Name = "fullRepeatStrTextBox";
+ this.fullRepeatStrTextBox.ReadOnly = true;
+ this.fullRepeatStrTextBox.Size = new System.Drawing.Size(238, 27);
+ this.fullRepeatStrTextBox.TabIndex = 31;
+ this.fullRepeatStrTextBox.TabStop = false;
+ this.fullRepeatStrTextBox.Text = "";
+ //
+ // SourceErrorProvider
+ //
+ this.SourceErrorProvider.ContainerControl = this;
+ //
+ // DestErrorProvider
+ //
+ this.DestErrorProvider.ContainerControl = this;
+ //
+ // EnableLabel
+ //
+ this.EnableLabel.AutoSize = true;
+ this.EnableLabel.ForeColor = System.Drawing.Color.OrangeRed;
+ this.EnableLabel.Location = new System.Drawing.Point(12, 18);
+ this.EnableLabel.Name = "EnableLabel";
+ this.EnableLabel.Size = new System.Drawing.Size(94, 19);
+ this.EnableLabel.TabIndex = 36;
+ this.EnableLabel.Text = "Not enabled";
+ this.EnableLabel.Visible = false;
+ //
+ // label4
+ //
+ label4.AutoSize = true;
+ label4.Location = new System.Drawing.Point(166, 309);
+ label4.Name = "label4";
+ label4.Size = new System.Drawing.Size(98, 19);
+ label4.TabIndex = 39;
+ label4.Text = "Backups are ";
+ //
+ // PassRichTextBox
+ //
+ this.PassRichTextBox.BackColor = System.Drawing.SystemColors.Control;
+ this.PassRichTextBox.Location = new System.Drawing.Point(270, 306);
+ this.PassRichTextBox.Name = "PassRichTextBox";
+ this.PassRichTextBox.ReadOnly = true;
+ this.PassRichTextBox.Size = new System.Drawing.Size(238, 27);
+ this.PassRichTextBox.TabIndex = 38;
+ this.PassRichTextBox.TabStop = false;
+ this.PassRichTextBox.Text = "";
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.listBox1);
+ this.panel1.Location = new System.Drawing.Point(271, 51);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(237, 310);
+ this.panel1.TabIndex = 40;
+ this.panel1.Visible = false;
+ //
+ // listBox1
+ //
+ this.listBox1.BackColor = System.Drawing.SystemColors.Control;
+ this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.listBox1.FormattingEnabled = true;
+ this.listBox1.ItemHeight = 19;
+ this.listBox1.Location = new System.Drawing.Point(0, 0);
+ this.listBox1.Name = "listBox1";
+ this.listBox1.Size = new System.Drawing.Size(237, 308);
+ this.listBox1.TabIndex = 0;
+ this.listBox1.Click += new System.EventHandler(this.listBox1_Click);
+ //
+ // JobSummary
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.MaxAgeTextBox);
+ this.Controls.Add(this.MaxFullTextBox);
+ this.Controls.Add(this.PassRichTextBox);
+ this.Controls.Add(this.fullRepeatStrTextBox);
+ this.Controls.Add(this.DescriptionTextBox);
+ this.Controls.Add(this.destinationTextBox);
+ this.Controls.Add(this.sourceTextBox);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(label4);
+ this.Controls.Add(label1);
+ this.Controls.Add(this.EnableLabel);
+ this.Controls.Add(label3);
+ this.Controls.Add(label2);
+ this.Controls.Add(nameLabel);
+ this.Controls.Add(this.nameTextBox);
+ this.Controls.Add(sourceLabel);
+ this.Controls.Add(destinationLabel);
+ this.Controls.Add(asLabel);
+ this.Controls.Add(fullRepeatStrLabel);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "JobSummary";
+ this.Size = new System.Drawing.Size(520, 364);
+ ((System.ComponentModel.ISupportInitialize)(this.SourceErrorProvider)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.DestErrorProvider)).EndInit();
+ this.panel1.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.RichTextBox MaxAgeTextBox;
+ private System.Windows.Forms.RichTextBox MaxFullTextBox;
+ private System.Windows.Forms.RichTextBox nameTextBox;
+ private System.Windows.Forms.RichTextBox sourceTextBox;
+ private System.Windows.Forms.RichTextBox destinationTextBox;
+ private System.Windows.Forms.RichTextBox DescriptionTextBox;
+ private System.Windows.Forms.RichTextBox fullRepeatStrTextBox;
+ private System.Windows.Forms.ErrorProvider SourceErrorProvider;
+ private System.Windows.Forms.ErrorProvider DestErrorProvider;
+ private System.Windows.Forms.Label EnableLabel;
+ private System.Windows.Forms.RichTextBox PassRichTextBox;
+ private System.Windows.Forms.ToolTip toolTip1;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.ListBox listBox1;
+ }
+}
diff --git a/Duplicati/Scheduler/JobSummary.cs b/Duplicati/Scheduler/JobSummary.cs
new file mode 100644
index 000000000..3d63cd04b
--- /dev/null
+++ b/Duplicati/Scheduler/JobSummary.cs
@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Shows a summary page
+ ///
+ public partial class JobSummary : UserControl
+ {
+ ///
+ /// Shows a summary page with error indicators
+ ///
+ public JobSummary()
+ {
+ InitializeComponent();
+ }
+ ///
+ /// Enabling this only makes it mad
+ ///
+ public new bool Enabled
+ {
+ get { return !this.EnableLabel.Visible; }
+ // Show the disabled label (says 'not enabled' in red) and grey the Description
+ set { this.EnableLabel.Visible = !value; this.DescriptionTextBox.Enabled = value; }
+ }
+ ///
+ /// Set the values
+ ///
+ /// The job row
+ /// Text description of the job trigger
+ public void SetSummary(Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow aRow, string aDetails)
+ {
+ this.nameTextBox.Text = aRow.Name;
+ this.DescriptionTextBox.Text = aDetails;
+ this.sourceTextBox.Text = aRow.Source;
+ this.destinationTextBox.Text = aRow.Destination;
+ if (aRow.FullOnly || (aRow.FullRepeatDays == 0 && aRow.FullAfterN == 0)) this.fullRepeatStrTextBox.Text = "Always do full backups";
+ else this.fullRepeatStrTextBox.Text = aRow.FullRepeatDays > 0 ? aRow.FullRepeatDays + " days " : aRow.FullAfterN.ToString()+" incrementals";
+ this.MaxFullTextBox.Text = aRow.MaxFulls > 0 ? "the last "+aRow.MaxFulls.ToString("N0") : "all" ;
+ this.MaxAgeTextBox.Text = aRow.MaxAgeDays > 0 ? aRow.MaxAgeDays.ToString("N0") + " days" : "" ;
+ this.PassRichTextBox.Text = new string[] { "not password protected.", "protected by local password.", "protected by global password." }[aRow.GetCheckSrc()];
+ }
+ public void Clear()
+ {
+ this.nameTextBox.Text =
+ this.DescriptionTextBox.Text =
+ this.sourceTextBox.Text =
+ this.destinationTextBox.Text =
+ this.fullRepeatStrTextBox.Text =
+ this.MaxFullTextBox.Text =
+ this.MaxAgeTextBox.Text =
+ this.PassRichTextBox.Text =
+ string.Empty;
+ Enabled = false;
+ }
+ ///
+ /// Sets the errors
+ ///
+ /// true if no errors
+ public bool ValidateSettings()
+ {
+ bool SrcOK = !string.IsNullOrEmpty(this.sourceTextBox.Text);
+ bool DstOK = !string.IsNullOrEmpty(this.destinationTextBox.Text) && !this.destinationTextBox.Text.EndsWith("://");
+ this.DestErrorProvider.SetError(this.destinationTextBox, DstOK ? string.Empty : "A destination for the backup must be supplied. Use the Destination tab.");
+ this.SourceErrorProvider.SetError(this.sourceTextBox, SrcOK ? string.Empty : "A source set of folders to backup must be supplied. Use the Source tab.");
+ return SrcOK && DstOK;
+ }
+ ///
+ /// Pressed double-clicked Source - show a list box
+ ///
+ private void sourceTextBox_MouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ // This is to give User a better look at source
+ this.listBox1.Items.Clear();
+ this.listBox1.Items.Add("");
+ this.listBox1.Items.AddRange(this.sourceTextBox.Text.Split(System.IO.Path.PathSeparator));
+ this.panel1.Visible = true;
+ this.panel1.BringToFront();
+ }
+ ///
+ /// Pressed the list box, hide it
+ ///
+ private void listBox1_Click(object sender, EventArgs e)
+ {
+ this.panel1.Visible = false;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/JobSummary.resx b/Duplicati/Scheduler/JobSummary.resx
new file mode 100644
index 000000000..f7c35bd59
--- /dev/null
+++ b/Duplicati/Scheduler/JobSummary.resx
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ 326, 17
+
+
+ 17, 17
+
+
+ False
+
+
+ 178, 17
+
+
+ 326, 17
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/LogView.Designer.cs b/Duplicati/Scheduler/LogView.Designer.cs
new file mode 100644
index 000000000..badd32b07
--- /dev/null
+++ b/Duplicati/Scheduler/LogView.Designer.cs
@@ -0,0 +1,723 @@
+namespace Duplicati.Scheduler
+{
+ partial class LogView
+ {
+ ///
+ /// 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 Windows Form 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.Windows.Forms.Label addedFilesLabel;
+ System.Windows.Forms.Label addedFoldersLabel;
+ System.Windows.Forms.Label examinedFilesLabel;
+ System.Windows.Forms.Label openedFilesLabel;
+ System.Windows.Forms.Label sizeOfModifiedLabel;
+ System.Windows.Forms.Label sizeOfAddedLabel;
+ System.Windows.Forms.Label sizeOfExaminedLabel;
+ System.Windows.Forms.Label unprocessedLabel;
+ System.Windows.Forms.Label tooLargeFilesLabel;
+ System.Windows.Forms.Label filesWithErrorLabel;
+ System.Windows.Forms.Label beginTimeLabel;
+ System.Windows.Forms.Label endTimeLabel;
+ System.Windows.Forms.Label durationLabel;
+ System.Windows.Forms.Label deletedFilesLabel;
+ System.Windows.Forms.Label deletedFoldersLabel;
+ System.Windows.Forms.Label modifiedFilesLabel;
+ System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+ System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LogView));
+ this.historyBindingSource = new System.Windows.Forms.BindingSource(this.components);
+ this.historyDataSet = new Duplicati.Scheduler.Data.HistoryDataSet();
+ this.logListBindingSource = new System.Windows.Forms.BindingSource(this.components);
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.logListDataGridView = new System.Windows.Forms.DataGridView();
+ this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.TypeCol = new System.Windows.Forms.DataGridViewImageColumn();
+ this.dataGridViewTextBoxColumn6 = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.dataGridViewTextBoxColumn7 = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.TimeBeginTextBox = new System.Windows.Forms.TextBox();
+ this.StatsBindingSource = new System.Windows.Forms.BindingSource(this.components);
+ this.historyStatsBindingSource = new System.Windows.Forms.BindingSource(this.components);
+ this.TimeEndTextBox = new System.Windows.Forms.TextBox();
+ this.addedFilesTextBox = new System.Windows.Forms.TextBox();
+ this.addedFoldersTextBox = new System.Windows.Forms.TextBox();
+ this.examinedFilesTextBox = new System.Windows.Forms.TextBox();
+ this.openedFilesTextBox = new System.Windows.Forms.TextBox();
+ this.sizeOfModifiedTextBox = new System.Windows.Forms.TextBox();
+ this.sizeOfAddedTextBox = new System.Windows.Forms.TextBox();
+ this.sizeOfExaminedTextBox = new System.Windows.Forms.TextBox();
+ this.unprocessedTextBox = new System.Windows.Forms.TextBox();
+ this.tooLargeFilesTextBox = new System.Windows.Forms.TextBox();
+ this.filesWithErrorTextBox = new System.Windows.Forms.TextBox();
+ this.durationTextBox = new System.Windows.Forms.TextBox();
+ this.deletedFilesTextBox = new System.Windows.Forms.TextBox();
+ this.deletedFoldersTextBox = new System.Windows.Forms.TextBox();
+ this.modifiedFilesTextBox = new System.Windows.Forms.TextBox();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.historyDataGridView = new System.Windows.Forms.DataGridView();
+ this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.dataGridViewTextBoxColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.BackupType = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ addedFilesLabel = new System.Windows.Forms.Label();
+ addedFoldersLabel = new System.Windows.Forms.Label();
+ examinedFilesLabel = new System.Windows.Forms.Label();
+ openedFilesLabel = new System.Windows.Forms.Label();
+ sizeOfModifiedLabel = new System.Windows.Forms.Label();
+ sizeOfAddedLabel = new System.Windows.Forms.Label();
+ sizeOfExaminedLabel = new System.Windows.Forms.Label();
+ unprocessedLabel = new System.Windows.Forms.Label();
+ tooLargeFilesLabel = new System.Windows.Forms.Label();
+ filesWithErrorLabel = new System.Windows.Forms.Label();
+ beginTimeLabel = new System.Windows.Forms.Label();
+ endTimeLabel = new System.Windows.Forms.Label();
+ durationLabel = new System.Windows.Forms.Label();
+ deletedFilesLabel = new System.Windows.Forms.Label();
+ deletedFoldersLabel = new System.Windows.Forms.Label();
+ modifiedFilesLabel = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.historyBindingSource)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.historyDataSet)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.logListBindingSource)).BeginInit();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.logListDataGridView)).BeginInit();
+ this.groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.StatsBindingSource)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.historyStatsBindingSource)).BeginInit();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.historyDataGridView)).BeginInit();
+ this.SuspendLayout();
+ //
+ // addedFilesLabel
+ //
+ addedFilesLabel.AutoSize = true;
+ addedFilesLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ addedFilesLabel.Location = new System.Drawing.Point(31, 89);
+ addedFilesLabel.Name = "addedFilesLabel";
+ addedFilesLabel.Size = new System.Drawing.Size(66, 13);
+ addedFilesLabel.TabIndex = 47;
+ addedFilesLabel.Text = "Added Files:";
+ //
+ // addedFoldersLabel
+ //
+ addedFoldersLabel.AutoSize = true;
+ addedFoldersLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ addedFoldersLabel.Location = new System.Drawing.Point(17, 110);
+ addedFoldersLabel.Name = "addedFoldersLabel";
+ addedFoldersLabel.Size = new System.Drawing.Size(80, 13);
+ addedFoldersLabel.TabIndex = 49;
+ addedFoldersLabel.Text = "Added Folders:";
+ //
+ // examinedFilesLabel
+ //
+ examinedFilesLabel.AutoSize = true;
+ examinedFilesLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ examinedFilesLabel.Location = new System.Drawing.Point(16, 131);
+ examinedFilesLabel.Name = "examinedFilesLabel";
+ examinedFilesLabel.Size = new System.Drawing.Size(81, 13);
+ examinedFilesLabel.TabIndex = 51;
+ examinedFilesLabel.Text = "Examined Files:";
+ //
+ // openedFilesLabel
+ //
+ openedFilesLabel.AutoSize = true;
+ openedFilesLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ openedFilesLabel.Location = new System.Drawing.Point(24, 152);
+ openedFilesLabel.Name = "openedFilesLabel";
+ openedFilesLabel.Size = new System.Drawing.Size(73, 13);
+ openedFilesLabel.TabIndex = 53;
+ openedFilesLabel.Text = "Opened Files:";
+ //
+ // sizeOfModifiedLabel
+ //
+ sizeOfModifiedLabel.AutoSize = true;
+ sizeOfModifiedLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ sizeOfModifiedLabel.Location = new System.Drawing.Point(181, 87);
+ sizeOfModifiedLabel.Name = "sizeOfModifiedLabel";
+ sizeOfModifiedLabel.Size = new System.Drawing.Size(88, 13);
+ sizeOfModifiedLabel.TabIndex = 55;
+ sizeOfModifiedLabel.Text = "Size Of Modified:";
+ //
+ // sizeOfAddedLabel
+ //
+ sizeOfAddedLabel.AutoSize = true;
+ sizeOfAddedLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ sizeOfAddedLabel.Location = new System.Drawing.Point(190, 108);
+ sizeOfAddedLabel.Name = "sizeOfAddedLabel";
+ sizeOfAddedLabel.Size = new System.Drawing.Size(79, 13);
+ sizeOfAddedLabel.TabIndex = 57;
+ sizeOfAddedLabel.Text = "Size Of Added:";
+ //
+ // sizeOfExaminedLabel
+ //
+ sizeOfExaminedLabel.AutoSize = true;
+ sizeOfExaminedLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ sizeOfExaminedLabel.Location = new System.Drawing.Point(175, 129);
+ sizeOfExaminedLabel.Name = "sizeOfExaminedLabel";
+ sizeOfExaminedLabel.Size = new System.Drawing.Size(94, 13);
+ sizeOfExaminedLabel.TabIndex = 59;
+ sizeOfExaminedLabel.Text = "Size Of Examined:";
+ //
+ // unprocessedLabel
+ //
+ unprocessedLabel.AutoSize = true;
+ unprocessedLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ unprocessedLabel.Location = new System.Drawing.Point(24, 173);
+ unprocessedLabel.Name = "unprocessedLabel";
+ unprocessedLabel.Size = new System.Drawing.Size(73, 13);
+ unprocessedLabel.TabIndex = 61;
+ unprocessedLabel.Text = "Unprocessed:";
+ //
+ // tooLargeFilesLabel
+ //
+ tooLargeFilesLabel.AutoSize = true;
+ tooLargeFilesLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ tooLargeFilesLabel.Location = new System.Drawing.Point(186, 150);
+ tooLargeFilesLabel.Name = "tooLargeFilesLabel";
+ tooLargeFilesLabel.Size = new System.Drawing.Size(83, 13);
+ tooLargeFilesLabel.TabIndex = 63;
+ tooLargeFilesLabel.Text = "Too Large Files:";
+ //
+ // filesWithErrorLabel
+ //
+ filesWithErrorLabel.AutoSize = true;
+ filesWithErrorLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ filesWithErrorLabel.Location = new System.Drawing.Point(185, 171);
+ filesWithErrorLabel.Name = "filesWithErrorLabel";
+ filesWithErrorLabel.Size = new System.Drawing.Size(84, 13);
+ filesWithErrorLabel.TabIndex = 65;
+ filesWithErrorLabel.Text = "Files With Error:";
+ //
+ // beginTimeLabel
+ //
+ beginTimeLabel.AutoSize = true;
+ beginTimeLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ beginTimeLabel.Location = new System.Drawing.Point(34, 24);
+ beginTimeLabel.Name = "beginTimeLabel";
+ beginTimeLabel.Size = new System.Drawing.Size(62, 13);
+ beginTimeLabel.TabIndex = 67;
+ beginTimeLabel.Text = "Begin Time:";
+ //
+ // endTimeLabel
+ //
+ endTimeLabel.AutoSize = true;
+ endTimeLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ endTimeLabel.Location = new System.Drawing.Point(42, 47);
+ endTimeLabel.Name = "endTimeLabel";
+ endTimeLabel.Size = new System.Drawing.Size(54, 13);
+ endTimeLabel.TabIndex = 69;
+ endTimeLabel.Text = "End Time:";
+ //
+ // durationLabel
+ //
+ durationLabel.AutoSize = true;
+ durationLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ durationLabel.Location = new System.Drawing.Point(44, 67);
+ durationLabel.Name = "durationLabel";
+ durationLabel.Size = new System.Drawing.Size(52, 13);
+ durationLabel.TabIndex = 71;
+ durationLabel.Text = "Duration:";
+ //
+ // deletedFilesLabel
+ //
+ deletedFilesLabel.AutoSize = true;
+ deletedFilesLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ deletedFilesLabel.Location = new System.Drawing.Point(197, 24);
+ deletedFilesLabel.Name = "deletedFilesLabel";
+ deletedFilesLabel.Size = new System.Drawing.Size(72, 13);
+ deletedFilesLabel.TabIndex = 73;
+ deletedFilesLabel.Text = "Deleted Files:";
+ //
+ // deletedFoldersLabel
+ //
+ deletedFoldersLabel.AutoSize = true;
+ deletedFoldersLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ deletedFoldersLabel.Location = new System.Drawing.Point(183, 45);
+ deletedFoldersLabel.Name = "deletedFoldersLabel";
+ deletedFoldersLabel.Size = new System.Drawing.Size(86, 13);
+ deletedFoldersLabel.TabIndex = 75;
+ deletedFoldersLabel.Text = "Deleted Folders:";
+ //
+ // modifiedFilesLabel
+ //
+ modifiedFilesLabel.AutoSize = true;
+ modifiedFilesLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ modifiedFilesLabel.Location = new System.Drawing.Point(194, 66);
+ modifiedFilesLabel.Name = "modifiedFilesLabel";
+ modifiedFilesLabel.Size = new System.Drawing.Size(75, 13);
+ modifiedFilesLabel.TabIndex = 77;
+ modifiedFilesLabel.Text = "Modified Files:";
+ //
+ // historyBindingSource
+ //
+ this.historyBindingSource.AllowNew = false;
+ this.historyBindingSource.DataMember = "History";
+ this.historyBindingSource.DataSource = this.historyDataSet;
+ this.historyBindingSource.CurrentChanged += new System.EventHandler(this.historyBindingSource_CurrentChanged);
+ //
+ // historyDataSet
+ //
+ this.historyDataSet.DataSetName = "HistoryDataSet";
+ this.historyDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
+ //
+ // logListBindingSource
+ //
+ this.logListBindingSource.DataSource = typeof(Duplicati.Library.Logging.AppendLog.LogEntry);
+ this.logListBindingSource.Sort = "DATE ASC";
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.ColumnCount = 2;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.Controls.Add(this.groupBox3, 0, 1);
+ this.tableLayoutPanel1.Controls.Add(this.groupBox2, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.groupBox1, 0, 0);
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 2;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(729, 442);
+ this.tableLayoutPanel1.TabIndex = 0;
+ //
+ // groupBox3
+ //
+ this.tableLayoutPanel1.SetColumnSpan(this.groupBox3, 2);
+ this.groupBox3.Controls.Add(this.logListDataGridView);
+ this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox3.Location = new System.Drawing.Point(3, 224);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(723, 215);
+ this.groupBox3.TabIndex = 2;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Log";
+ //
+ // logListDataGridView
+ //
+ this.logListDataGridView.AllowUserToAddRows = false;
+ this.logListDataGridView.AllowUserToDeleteRows = false;
+ this.logListDataGridView.AutoGenerateColumns = false;
+ this.logListDataGridView.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.logListDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.logListDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.dataGridViewTextBoxColumn1,
+ this.TypeCol,
+ this.dataGridViewTextBoxColumn6,
+ this.dataGridViewTextBoxColumn7});
+ this.logListDataGridView.DataSource = this.logListBindingSource;
+ this.logListDataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.logListDataGridView.Location = new System.Drawing.Point(3, 23);
+ this.logListDataGridView.Name = "logListDataGridView";
+ this.logListDataGridView.ReadOnly = true;
+ this.logListDataGridView.Size = new System.Drawing.Size(717, 189);
+ this.logListDataGridView.TabIndex = 0;
+ this.logListDataGridView.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.logListDataGridView_CellFormatting);
+ //
+ // dataGridViewTextBoxColumn1
+ //
+ this.dataGridViewTextBoxColumn1.DataPropertyName = "Date";
+ dataGridViewCellStyle1.Format = "T";
+ this.dataGridViewTextBoxColumn1.DefaultCellStyle = dataGridViewCellStyle1;
+ this.dataGridViewTextBoxColumn1.HeaderText = "";
+ this.dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1";
+ this.dataGridViewTextBoxColumn1.ReadOnly = true;
+ //
+ // TypeCol
+ //
+ this.TypeCol.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells;
+ this.TypeCol.DataPropertyName = "Type";
+ this.TypeCol.HeaderText = "";
+ this.TypeCol.Name = "TypeCol";
+ this.TypeCol.ReadOnly = true;
+ this.TypeCol.Resizable = System.Windows.Forms.DataGridViewTriState.True;
+ this.TypeCol.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
+ this.TypeCol.Width = 19;
+ //
+ // dataGridViewTextBoxColumn6
+ //
+ this.dataGridViewTextBoxColumn6.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+ this.dataGridViewTextBoxColumn6.DataPropertyName = "Message";
+ this.dataGridViewTextBoxColumn6.HeaderText = "Message";
+ this.dataGridViewTextBoxColumn6.Name = "dataGridViewTextBoxColumn6";
+ this.dataGridViewTextBoxColumn6.ReadOnly = true;
+ //
+ // dataGridViewTextBoxColumn7
+ //
+ this.dataGridViewTextBoxColumn7.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells;
+ this.dataGridViewTextBoxColumn7.DataPropertyName = "ExMessage";
+ this.dataGridViewTextBoxColumn7.HeaderText = "ExMessage";
+ this.dataGridViewTextBoxColumn7.Name = "dataGridViewTextBoxColumn7";
+ this.dataGridViewTextBoxColumn7.ReadOnly = true;
+ this.dataGridViewTextBoxColumn7.Width = 110;
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.TimeBeginTextBox);
+ this.groupBox2.Controls.Add(this.TimeEndTextBox);
+ this.groupBox2.Controls.Add(addedFilesLabel);
+ this.groupBox2.Controls.Add(this.addedFilesTextBox);
+ this.groupBox2.Controls.Add(addedFoldersLabel);
+ this.groupBox2.Controls.Add(this.addedFoldersTextBox);
+ this.groupBox2.Controls.Add(examinedFilesLabel);
+ this.groupBox2.Controls.Add(this.examinedFilesTextBox);
+ this.groupBox2.Controls.Add(openedFilesLabel);
+ this.groupBox2.Controls.Add(this.openedFilesTextBox);
+ this.groupBox2.Controls.Add(sizeOfModifiedLabel);
+ this.groupBox2.Controls.Add(this.sizeOfModifiedTextBox);
+ this.groupBox2.Controls.Add(sizeOfAddedLabel);
+ this.groupBox2.Controls.Add(this.sizeOfAddedTextBox);
+ this.groupBox2.Controls.Add(sizeOfExaminedLabel);
+ this.groupBox2.Controls.Add(this.sizeOfExaminedTextBox);
+ this.groupBox2.Controls.Add(unprocessedLabel);
+ this.groupBox2.Controls.Add(this.unprocessedTextBox);
+ this.groupBox2.Controls.Add(tooLargeFilesLabel);
+ this.groupBox2.Controls.Add(this.tooLargeFilesTextBox);
+ this.groupBox2.Controls.Add(filesWithErrorLabel);
+ this.groupBox2.Controls.Add(this.filesWithErrorTextBox);
+ this.groupBox2.Controls.Add(beginTimeLabel);
+ this.groupBox2.Controls.Add(endTimeLabel);
+ this.groupBox2.Controls.Add(durationLabel);
+ this.groupBox2.Controls.Add(this.durationTextBox);
+ this.groupBox2.Controls.Add(deletedFilesLabel);
+ this.groupBox2.Controls.Add(this.deletedFilesTextBox);
+ this.groupBox2.Controls.Add(deletedFoldersLabel);
+ this.groupBox2.Controls.Add(this.deletedFoldersTextBox);
+ this.groupBox2.Controls.Add(modifiedFilesLabel);
+ this.groupBox2.Controls.Add(this.modifiedFilesTextBox);
+ this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.groupBox2.Location = new System.Drawing.Point(367, 3);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(359, 215);
+ this.groupBox2.TabIndex = 1;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Statistics";
+ //
+ // TimeBeginTextBox
+ //
+ this.TimeBeginTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "BeginTime", true));
+ this.TimeBeginTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.TimeBeginTextBox.Location = new System.Drawing.Point(103, 21);
+ this.TimeBeginTextBox.Name = "TimeBeginTextBox";
+ this.TimeBeginTextBox.ReadOnly = true;
+ this.TimeBeginTextBox.Size = new System.Drawing.Size(68, 21);
+ this.TimeBeginTextBox.TabIndex = 80;
+ this.TimeBeginTextBox.TabStop = false;
+ //
+ // StatsBindingSource
+ //
+ this.StatsBindingSource.DataSource = this.historyStatsBindingSource;
+ //
+ // historyStatsBindingSource
+ //
+ this.historyStatsBindingSource.DataMember = "History_Stats";
+ this.historyStatsBindingSource.DataSource = this.historyBindingSource;
+ //
+ // TimeEndTextBox
+ //
+ this.TimeEndTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "EndTime", true));
+ this.TimeEndTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.TimeEndTextBox.Location = new System.Drawing.Point(103, 42);
+ this.TimeEndTextBox.Name = "TimeEndTextBox";
+ this.TimeEndTextBox.ReadOnly = true;
+ this.TimeEndTextBox.Size = new System.Drawing.Size(68, 21);
+ this.TimeEndTextBox.TabIndex = 79;
+ this.TimeEndTextBox.TabStop = false;
+ //
+ // addedFilesTextBox
+ //
+ this.addedFilesTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "AddedFiles", true));
+ this.addedFilesTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.addedFilesTextBox.Location = new System.Drawing.Point(103, 84);
+ this.addedFilesTextBox.Name = "addedFilesTextBox";
+ this.addedFilesTextBox.ReadOnly = true;
+ this.addedFilesTextBox.Size = new System.Drawing.Size(68, 21);
+ this.addedFilesTextBox.TabIndex = 48;
+ this.addedFilesTextBox.TabStop = false;
+ //
+ // addedFoldersTextBox
+ //
+ this.addedFoldersTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "AddedFolders", true));
+ this.addedFoldersTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.addedFoldersTextBox.Location = new System.Drawing.Point(103, 105);
+ this.addedFoldersTextBox.Name = "addedFoldersTextBox";
+ this.addedFoldersTextBox.ReadOnly = true;
+ this.addedFoldersTextBox.Size = new System.Drawing.Size(68, 21);
+ this.addedFoldersTextBox.TabIndex = 50;
+ this.addedFoldersTextBox.TabStop = false;
+ //
+ // examinedFilesTextBox
+ //
+ this.examinedFilesTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "ExaminedFiles", true));
+ this.examinedFilesTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.examinedFilesTextBox.Location = new System.Drawing.Point(103, 126);
+ this.examinedFilesTextBox.Name = "examinedFilesTextBox";
+ this.examinedFilesTextBox.ReadOnly = true;
+ this.examinedFilesTextBox.Size = new System.Drawing.Size(68, 21);
+ this.examinedFilesTextBox.TabIndex = 52;
+ this.examinedFilesTextBox.TabStop = false;
+ //
+ // openedFilesTextBox
+ //
+ this.openedFilesTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "OpenedFiles", true));
+ this.openedFilesTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.openedFilesTextBox.Location = new System.Drawing.Point(103, 147);
+ this.openedFilesTextBox.Name = "openedFilesTextBox";
+ this.openedFilesTextBox.ReadOnly = true;
+ this.openedFilesTextBox.Size = new System.Drawing.Size(68, 21);
+ this.openedFilesTextBox.TabIndex = 54;
+ this.openedFilesTextBox.TabStop = false;
+ //
+ // sizeOfModifiedTextBox
+ //
+ this.sizeOfModifiedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "SizeOfModified", true));
+ this.sizeOfModifiedTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.sizeOfModifiedTextBox.Location = new System.Drawing.Point(275, 84);
+ this.sizeOfModifiedTextBox.Name = "sizeOfModifiedTextBox";
+ this.sizeOfModifiedTextBox.ReadOnly = true;
+ this.sizeOfModifiedTextBox.Size = new System.Drawing.Size(68, 21);
+ this.sizeOfModifiedTextBox.TabIndex = 56;
+ this.sizeOfModifiedTextBox.TabStop = false;
+ //
+ // sizeOfAddedTextBox
+ //
+ this.sizeOfAddedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "SizeOfAdded", true));
+ this.sizeOfAddedTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.sizeOfAddedTextBox.Location = new System.Drawing.Point(275, 105);
+ this.sizeOfAddedTextBox.Name = "sizeOfAddedTextBox";
+ this.sizeOfAddedTextBox.ReadOnly = true;
+ this.sizeOfAddedTextBox.Size = new System.Drawing.Size(68, 21);
+ this.sizeOfAddedTextBox.TabIndex = 58;
+ this.sizeOfAddedTextBox.TabStop = false;
+ //
+ // sizeOfExaminedTextBox
+ //
+ this.sizeOfExaminedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "SizeOfExamined", true));
+ this.sizeOfExaminedTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.sizeOfExaminedTextBox.Location = new System.Drawing.Point(275, 126);
+ this.sizeOfExaminedTextBox.Name = "sizeOfExaminedTextBox";
+ this.sizeOfExaminedTextBox.ReadOnly = true;
+ this.sizeOfExaminedTextBox.Size = new System.Drawing.Size(68, 21);
+ this.sizeOfExaminedTextBox.TabIndex = 60;
+ this.sizeOfExaminedTextBox.TabStop = false;
+ //
+ // unprocessedTextBox
+ //
+ this.unprocessedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "Unprocessed", true));
+ this.unprocessedTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.unprocessedTextBox.Location = new System.Drawing.Point(103, 168);
+ this.unprocessedTextBox.Name = "unprocessedTextBox";
+ this.unprocessedTextBox.ReadOnly = true;
+ this.unprocessedTextBox.Size = new System.Drawing.Size(68, 21);
+ this.unprocessedTextBox.TabIndex = 62;
+ this.unprocessedTextBox.TabStop = false;
+ //
+ // tooLargeFilesTextBox
+ //
+ this.tooLargeFilesTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "TooLargeFiles", true));
+ this.tooLargeFilesTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tooLargeFilesTextBox.Location = new System.Drawing.Point(275, 147);
+ this.tooLargeFilesTextBox.Name = "tooLargeFilesTextBox";
+ this.tooLargeFilesTextBox.ReadOnly = true;
+ this.tooLargeFilesTextBox.Size = new System.Drawing.Size(68, 21);
+ this.tooLargeFilesTextBox.TabIndex = 64;
+ this.tooLargeFilesTextBox.TabStop = false;
+ //
+ // filesWithErrorTextBox
+ //
+ this.filesWithErrorTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "FilesWithError", true));
+ this.filesWithErrorTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.filesWithErrorTextBox.Location = new System.Drawing.Point(275, 168);
+ this.filesWithErrorTextBox.Name = "filesWithErrorTextBox";
+ this.filesWithErrorTextBox.ReadOnly = true;
+ this.filesWithErrorTextBox.Size = new System.Drawing.Size(68, 21);
+ this.filesWithErrorTextBox.TabIndex = 66;
+ this.filesWithErrorTextBox.TabStop = false;
+ //
+ // durationTextBox
+ //
+ this.durationTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "Duration", true));
+ this.durationTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.durationTextBox.Location = new System.Drawing.Point(103, 62);
+ this.durationTextBox.Name = "durationTextBox";
+ this.durationTextBox.ReadOnly = true;
+ this.durationTextBox.Size = new System.Drawing.Size(68, 21);
+ this.durationTextBox.TabIndex = 72;
+ this.durationTextBox.TabStop = false;
+ //
+ // deletedFilesTextBox
+ //
+ this.deletedFilesTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "DeletedFiles", true));
+ this.deletedFilesTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.deletedFilesTextBox.Location = new System.Drawing.Point(275, 21);
+ this.deletedFilesTextBox.Name = "deletedFilesTextBox";
+ this.deletedFilesTextBox.ReadOnly = true;
+ this.deletedFilesTextBox.Size = new System.Drawing.Size(68, 21);
+ this.deletedFilesTextBox.TabIndex = 74;
+ this.deletedFilesTextBox.TabStop = false;
+ //
+ // deletedFoldersTextBox
+ //
+ this.deletedFoldersTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "DeletedFolders", true));
+ this.deletedFoldersTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.deletedFoldersTextBox.Location = new System.Drawing.Point(275, 42);
+ this.deletedFoldersTextBox.Name = "deletedFoldersTextBox";
+ this.deletedFoldersTextBox.ReadOnly = true;
+ this.deletedFoldersTextBox.Size = new System.Drawing.Size(68, 21);
+ this.deletedFoldersTextBox.TabIndex = 76;
+ this.deletedFoldersTextBox.TabStop = false;
+ //
+ // modifiedFilesTextBox
+ //
+ this.modifiedFilesTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.StatsBindingSource, "ModifiedFiles", true));
+ this.modifiedFilesTextBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.modifiedFilesTextBox.Location = new System.Drawing.Point(275, 63);
+ this.modifiedFilesTextBox.Name = "modifiedFilesTextBox";
+ this.modifiedFilesTextBox.ReadOnly = true;
+ this.modifiedFilesTextBox.Size = new System.Drawing.Size(68, 21);
+ this.modifiedFilesTextBox.TabIndex = 78;
+ this.modifiedFilesTextBox.TabStop = false;
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.historyDataGridView);
+ this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox1.Location = new System.Drawing.Point(3, 3);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(358, 215);
+ this.groupBox1.TabIndex = 0;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Select event:";
+ //
+ // historyDataGridView
+ //
+ this.historyDataGridView.AutoGenerateColumns = false;
+ this.historyDataGridView.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.historyDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.historyDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.dataGridViewTextBoxColumn2,
+ this.dataGridViewTextBoxColumn3,
+ this.BackupType});
+ this.historyDataGridView.DataSource = this.historyBindingSource;
+ this.historyDataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.historyDataGridView.Location = new System.Drawing.Point(3, 23);
+ this.historyDataGridView.Name = "historyDataGridView";
+ this.historyDataGridView.Size = new System.Drawing.Size(352, 189);
+ this.historyDataGridView.TabIndex = 0;
+ //
+ // dataGridViewTextBoxColumn2
+ //
+ this.dataGridViewTextBoxColumn2.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+ this.dataGridViewTextBoxColumn2.DataPropertyName = "ActionDate";
+ dataGridViewCellStyle2.Format = "G";
+ dataGridViewCellStyle2.NullValue = null;
+ this.dataGridViewTextBoxColumn2.DefaultCellStyle = dataGridViewCellStyle2;
+ this.dataGridViewTextBoxColumn2.HeaderText = "Date";
+ this.dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2";
+ //
+ // dataGridViewTextBoxColumn3
+ //
+ this.dataGridViewTextBoxColumn3.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells;
+ this.dataGridViewTextBoxColumn3.DataPropertyName = "Action";
+ this.dataGridViewTextBoxColumn3.HeaderText = "Action";
+ this.dataGridViewTextBoxColumn3.Name = "dataGridViewTextBoxColumn3";
+ this.dataGridViewTextBoxColumn3.Width = 79;
+ //
+ // BackupType
+ //
+ this.BackupType.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells;
+ this.BackupType.DataPropertyName = "BackupType";
+ this.BackupType.HeaderText = "";
+ this.BackupType.Name = "BackupType";
+ this.BackupType.Width = 19;
+ //
+ // LogView
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(729, 442);
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "LogView";
+ this.Text = "LogView";
+ ((System.ComponentModel.ISupportInitialize)(this.historyBindingSource)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.historyDataSet)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.logListBindingSource)).EndInit();
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.logListDataGridView)).EndInit();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.StatsBindingSource)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.historyStatsBindingSource)).EndInit();
+ this.groupBox1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.historyDataGridView)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.BindingSource logListBindingSource;
+ private System.Windows.Forms.BindingSource historyBindingSource;
+ private Duplicati.Scheduler.Data.HistoryDataSet historyDataSet;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.DataGridView historyDataGridView;
+ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2;
+ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn3;
+ private System.Windows.Forms.DataGridViewTextBoxColumn BackupType;
+ private System.Windows.Forms.DataGridView logListDataGridView;
+ private System.Windows.Forms.TextBox addedFilesTextBox;
+ private System.Windows.Forms.TextBox addedFoldersTextBox;
+ private System.Windows.Forms.TextBox examinedFilesTextBox;
+ private System.Windows.Forms.TextBox openedFilesTextBox;
+ private System.Windows.Forms.TextBox sizeOfModifiedTextBox;
+ private System.Windows.Forms.TextBox sizeOfAddedTextBox;
+ private System.Windows.Forms.TextBox sizeOfExaminedTextBox;
+ private System.Windows.Forms.TextBox unprocessedTextBox;
+ private System.Windows.Forms.TextBox tooLargeFilesTextBox;
+ private System.Windows.Forms.TextBox filesWithErrorTextBox;
+ private System.Windows.Forms.TextBox durationTextBox;
+ private System.Windows.Forms.TextBox deletedFilesTextBox;
+ private System.Windows.Forms.TextBox deletedFoldersTextBox;
+ private System.Windows.Forms.TextBox modifiedFilesTextBox;
+ private System.Windows.Forms.TextBox TimeBeginTextBox;
+ private System.Windows.Forms.TextBox TimeEndTextBox;
+ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
+ private System.Windows.Forms.DataGridViewImageColumn TypeCol;
+ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn6;
+ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn7;
+ private System.Windows.Forms.BindingSource StatsBindingSource;
+ private System.Windows.Forms.BindingSource historyStatsBindingSource;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/LogView.cs b/Duplicati/Scheduler/LogView.cs
new file mode 100644
index 000000000..d1c8d013d
--- /dev/null
+++ b/Duplicati/Scheduler/LogView.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// View log files
+ ///
+ public partial class LogView : Form
+ {
+ ///
+ /// Shows history and log files
+ ///
+ /// Job to show
+ public LogView(string aJobName)
+ {
+ InitializeComponent();
+ Initialize(aJobName);
+ }
+ ///
+ /// Set the form for a Job
+ ///
+ /// Job
+ private void Initialize(string aJobName)
+ {
+ this.Text = aJobName;
+ this.historyDataSet = new Duplicati.Scheduler.Data.HistoryDataSet();
+ this.historyDataSet.Load();
+ this.historyBindingSource.Filter = "Name = '" + aJobName + "'";
+ this.historyBindingSource.DataSource = this.historyDataSet.History;
+ this.historyBindingSource.MoveLast();
+ this.historyDataGridView.AutoResizeColumns();
+ this.sizeOfAddedTextBox.DataBindings["Text"].Format += new ConvertEventHandler(SizeFormat);
+ this.sizeOfExaminedTextBox.DataBindings["Text"].Format += new ConvertEventHandler(SizeFormat);
+ this.sizeOfModifiedTextBox.DataBindings["Text"].Format += new ConvertEventHandler(SizeFormat);
+ this.TimeBeginTextBox.DataBindings["Text"].Format += new ConvertEventHandler(DateFormat);
+ this.TimeEndTextBox.DataBindings["Text"].Format += new ConvertEventHandler(DateFormat);
+ }
+
+ void DateFormat(object sender, ConvertEventArgs e)
+ {
+ e.Value = ((DateTime)e.Value).ToString("T");
+ }
+
+ void SizeFormat(object sender, ConvertEventArgs e)
+ {
+ e.Value = Duplicati.Library.Utility.Utility.FormatSizeString((long)e.Value);
+ }
+ ///
+ /// User selected a different history entry, adjust all
+ ///
+ private void historyBindingSource_CurrentChanged(object sender, EventArgs e)
+ {
+ // Get the new row from the BindingSource
+ Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow Row =
+ (Duplicati.Scheduler.Data.HistoryDataSet.HistoryRow)((DataRowView)this.historyBindingSource.Current).Row;
+ if (Row.IsLogFileNameNull()) Row.LogFileName = string.Empty;
+ string LogFile = Row.LogFileName;
+ if (string.IsNullOrEmpty(LogFile) || !System.IO.File.Exists(LogFile))
+ this.logListBindingSource.DataSource = null;
+ else // Put the log file into the grid
+ this.logListBindingSource.DataSource = new Duplicati.Library.Logging.AppendLog.LogList(
+ System.IO.File.ReadAllLines(LogFile));
+ }
+ ///
+ /// Returns a 16X16 bitmap of an Icon
+ ///
+ private static Image Bitmap16(Icon aIcon)
+ {
+ Bitmap Result = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
+ using (Graphics Gr = Graphics.FromImage(Result))
+ {
+ Gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
+ Gr.DrawImage(aIcon.ToBitmap(), 0, 0, 16, 16);
+ }
+ return Result;
+ }
+ ///
+ /// Correlates log message type to an Icon
+ ///
+ private Dictionary TypeIcons = new Dictionary()
+ {
+ { Duplicati.Library.Logging.LogMessageType.Error, Bitmap16(System.Drawing.SystemIcons.Error) },
+ { Duplicati.Library.Logging.LogMessageType.Information, Bitmap16(System.Drawing.SystemIcons.Information) },
+ { Duplicati.Library.Logging.LogMessageType.Profiling, Bitmap16(System.Drawing.SystemIcons.Question) },
+ { Duplicati.Library.Logging.LogMessageType.Warning, Bitmap16(System.Drawing.SystemIcons.Warning) },
+ };
+ ///
+ /// Draws the icons depending on the log message type
+ ///
+ private void logListDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
+ {
+ if (e.RowIndex >= 0 && e.ColumnIndex == this.TypeCol.Index)
+ {
+ e.Value = TypeIcons[(Duplicati.Library.Logging.LogMessageType)e.Value];
+ e.FormattingApplied = true;
+ }
+ }
+ }
+
+}
diff --git a/Duplicati/Scheduler/LogView.resx b/Duplicati/Scheduler/LogView.resx
new file mode 100644
index 000000000..2e2e6766e
--- /dev/null
+++ b/Duplicati/Scheduler/LogView.resx
@@ -0,0 +1,690 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ 414, 18
+
+
+ 283, 18
+
+
+ 117, 18
+
+
+ 736, 18
+
+
+ 17, 57
+
+
+ True
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/LogWatcher.cs b/Duplicati/Scheduler/LogWatcher.cs
new file mode 100644
index 000000000..430b327f5
--- /dev/null
+++ b/Duplicati/Scheduler/LogWatcher.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Duplicati.Scheduler
+{
+ public class LogWatcher : System.IO.FileSystemWatcher
+ {
+ public LogWatcher(string aLogDir)
+ : base(aLogDir, "*.txt")
+ {
+ this.NotifyFilter = System.IO.NotifyFilters.Attributes;
+ }
+
+ }
+}
diff --git a/Duplicati/Scheduler/PasswordControl.Designer.cs b/Duplicati/Scheduler/PasswordControl.Designer.cs
new file mode 100644
index 000000000..4c877d1d5
--- /dev/null
+++ b/Duplicati/Scheduler/PasswordControl.Designer.cs
@@ -0,0 +1,148 @@
+namespace Duplicati.Scheduler
+{
+ partial class PasswordControl
+ {
+ ///
+ /// 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()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PasswordControl));
+ this.PaGroupBox = new System.Windows.Forms.GroupBox();
+ this.SecureGroupBox = new System.Windows.Forms.GroupBox();
+ this.secureTextBox1 = new Utility.SecureTextBox();
+ this.ChangeButton = new System.Windows.Forms.Button();
+ this.PasswordHelptext = new System.Windows.Forms.Label();
+ this.EncryptionModuleLabel = new System.Windows.Forms.Label();
+ this.EncryptionModuleDropDown = new System.Windows.Forms.ComboBox();
+ this.PaGroupBox.SuspendLayout();
+ this.SecureGroupBox.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // PaGroupBox
+ //
+ this.PaGroupBox.Controls.Add(this.SecureGroupBox);
+ this.PaGroupBox.Controls.Add(this.EncryptionModuleLabel);
+ this.PaGroupBox.Controls.Add(this.EncryptionModuleDropDown);
+ this.PaGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.PaGroupBox.Location = new System.Drawing.Point(0, 0);
+ this.PaGroupBox.Name = "PaGroupBox";
+ this.PaGroupBox.Size = new System.Drawing.Size(517, 173);
+ this.PaGroupBox.TabIndex = 26;
+ this.PaGroupBox.TabStop = false;
+ this.PaGroupBox.Text = "Password";
+ //
+ // SecureGroupBox
+ //
+ this.SecureGroupBox.Controls.Add(this.secureTextBox1);
+ this.SecureGroupBox.Controls.Add(this.ChangeButton);
+ this.SecureGroupBox.Controls.Add(this.PasswordHelptext);
+ this.SecureGroupBox.Location = new System.Drawing.Point(6, 16);
+ this.SecureGroupBox.Name = "SecureGroupBox";
+ this.SecureGroupBox.Size = new System.Drawing.Size(503, 118);
+ this.SecureGroupBox.TabIndex = 28;
+ this.SecureGroupBox.TabStop = false;
+ //
+ // secureTextBox1
+ //
+ this.secureTextBox1.Location = new System.Drawing.Point(13, 26);
+ this.secureTextBox1.Name = "secureTextBox1";
+ this.secureTextBox1.ReadOnly = true;
+ this.secureTextBox1.ShortcutsEnabled = false;
+ this.secureTextBox1.Size = new System.Drawing.Size(387, 27);
+ this.secureTextBox1.TabIndex = 26;
+ this.secureTextBox1.Text = "*********************************************************************************" +
+ "*************************************************************";
+ this.secureTextBox1.UseSystemPasswordChar = true;
+ //
+ // ChangeButton
+ //
+ this.ChangeButton.Location = new System.Drawing.Point(406, 25);
+ this.ChangeButton.Name = "ChangeButton";
+ this.ChangeButton.Size = new System.Drawing.Size(84, 28);
+ this.ChangeButton.TabIndex = 27;
+ this.ChangeButton.Text = "Change";
+ this.ChangeButton.UseVisualStyleBackColor = true;
+ this.ChangeButton.Click += new System.EventHandler(this.ChangeButtonClick);
+ //
+ // PasswordHelptext
+ //
+ this.PasswordHelptext.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic);
+ this.PasswordHelptext.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.PasswordHelptext.Location = new System.Drawing.Point(10, 56);
+ this.PasswordHelptext.Name = "PasswordHelptext";
+ this.PasswordHelptext.Size = new System.Drawing.Size(480, 48);
+ this.PasswordHelptext.TabIndex = 16;
+ this.PasswordHelptext.Text = resources.GetString("PasswordHelptext.Text");
+ //
+ // EncryptionModuleLabel
+ //
+ this.EncryptionModuleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.EncryptionModuleLabel.AutoSize = true;
+ this.EncryptionModuleLabel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.EncryptionModuleLabel.Location = new System.Drawing.Point(16, 143);
+ this.EncryptionModuleLabel.Name = "EncryptionModuleLabel";
+ this.EncryptionModuleLabel.Size = new System.Drawing.Size(143, 19);
+ this.EncryptionModuleLabel.TabIndex = 18;
+ this.EncryptionModuleLabel.Text = "Encryption method";
+ //
+ // EncryptionModuleDropDown
+ //
+ this.EncryptionModuleDropDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.EncryptionModuleDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.EncryptionModuleDropDown.FormattingEnabled = true;
+ this.EncryptionModuleDropDown.Location = new System.Drawing.Point(165, 140);
+ this.EncryptionModuleDropDown.Name = "EncryptionModuleDropDown";
+ this.EncryptionModuleDropDown.Size = new System.Drawing.Size(331, 27);
+ this.EncryptionModuleDropDown.TabIndex = 19;
+ //
+ // PasswordControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.Gainsboro;
+ this.Controls.Add(this.PaGroupBox);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "PasswordControl";
+ this.Size = new System.Drawing.Size(517, 173);
+ this.PaGroupBox.ResumeLayout(false);
+ this.PaGroupBox.PerformLayout();
+ this.SecureGroupBox.ResumeLayout(false);
+ this.SecureGroupBox.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox PaGroupBox;
+ private System.Windows.Forms.Label PasswordHelptext;
+ private System.Windows.Forms.Label EncryptionModuleLabel;
+ private System.Windows.Forms.ComboBox EncryptionModuleDropDown;
+ private Utility.SecureTextBox secureTextBox1;
+ private System.Windows.Forms.Button ChangeButton;
+ private System.Windows.Forms.GroupBox SecureGroupBox;
+ }
+}
diff --git a/Duplicati/Scheduler/PasswordControl.cs b/Duplicati/Scheduler/PasswordControl.cs
new file mode 100644
index 000000000..1170fc0b2
--- /dev/null
+++ b/Duplicati/Scheduler/PasswordControl.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// A Duplicati style password control
+ ///
+ public partial class PasswordControl : UserControl
+ {
+ ///
+ /// Selected encryption module
+ ///
+ public string CheckMod
+ {
+ get { return this.EncryptionModuleDropDown.SelectedText; }
+ set
+ {
+ if (!string.IsNullOrEmpty(value) && this.EncryptionModuleDropDown.Items.Contains(value))
+ this.EncryptionModuleDropDown.SelectedText = value;
+ }
+ }
+ ///
+ /// Entered password as a protected string
+ ///
+ public byte[] Checksum
+ {
+ get { return this.Enabled ? this.secureTextBox1.ProtectedValue : new byte[0]; }
+ set { itsValue = Utility.Tools.SecureUnprotect( value ); }
+ }
+ private System.Security.SecureString itsValue;
+ ///
+ /// Entered password as a SecureString
+ ///
+ public System.Security.SecureString Value
+ {
+ get { return this.secureTextBox1.Value; }
+ }
+ ///
+ /// A Duplicati style password control
+ ///
+ public PasswordControl()
+ {
+ InitializeComponent();
+ // Get the modules into the combo
+ this.EncryptionModuleDropDown.Items.AddRange(
+ (from Library.Interface.IEncryption qE in Library.DynamicLoader.EncryptionLoader.Modules
+ select qE.DisplayName).ToArray());
+ if (this.EncryptionModuleDropDown.Items.Count > 0)
+ this.EncryptionModuleDropDown.SelectedIndex = 0;
+ }
+ ///
+ /// Change Button clicked, force user to enter old password prior to entering new one
+ ///
+ ///
+ ///
+ private void ChangeButtonClick(object sender, EventArgs e)
+ {
+ if (itsValue.Length > 0)
+ {
+ for (bool OK = false; !OK; )
+ {
+ System.Security.SecureString Check = EnterPassDialog.FetchPassword();
+ if (!(OK = Utility.Tools.GotIt(Check, itsValue)) &&
+ MessageBox.Show("Invalid, try again?", "INVALID", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+ return;
+ }
+ }
+ this.secureTextBox1.ReadOnly = false;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/PasswordControl.resx b/Duplicati/Scheduler/PasswordControl.resx
new file mode 100644
index 000000000..200dae9e7
--- /dev/null
+++ b/Duplicati/Scheduler/PasswordControl.resx
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ * It is highly recommended that you use a strong password, as that will ensure that no-one but you can retrieve the files. Be sure to remember the password, as the backups will be useless without it.
+* Changing the password will not change previous backup's passwords.
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Pipe.cs b/Duplicati/Scheduler/Pipe.cs
new file mode 100644
index 000000000..f56bd4aaa
--- /dev/null
+++ b/Duplicati/Scheduler/Pipe.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Named pipe server
+ ///
+ public static class Pipe
+ {
+ ///
+ /// What to call with a new message [NOT an event]
+ ///
+ /// The message
+ public delegate void NewMessageDelegate(string aNewOne);
+ ///
+ /// Named pipe server
+ ///
+ ///
+ public static void Server(NewMessageDelegate aNewMessage)
+ {
+ // Just keep trying to connect (in the background).
+ new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
+ { Thread(aNewMessage); })) { Name = Program.PipeServerThreadName, IsBackground = true }
+ .Start();
+ }
+ ///
+ /// The server thread
+ ///
+ ///
+ private static void Thread(NewMessageDelegate aNewMessage)
+ {
+ while (true)
+ {
+ using (Utility.NamedPipeServerStream PipeStream = new Utility.NamedPipeServerStream(
+ Program.PipeBaseName, Utility.User.UserName, System.IO.Pipes.PipeDirection.In))
+ {
+ // Try to connect
+ Debug.WriteLine("Advertising with in-pipe:" + PipeStream.Name);
+ try { PipeStream.Server.WaitForConnection(); }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex); // Do something??
+ }
+ Debug.WriteLine("Connected = " + PipeStream.Server.IsConnected.ToString());
+ // Just keep on reading
+ using (System.IO.StreamReader Reader = new System.IO.StreamReader(PipeStream.Server))
+ while (PipeStream.Server.IsConnected)
+ {
+ while (PipeStream.Server.IsConnected)
+ {
+ try
+ {
+ string In = Reader.ReadLine();
+ if (In != null && aNewMessage != null) aNewMessage(In);
+ Debug.WriteIf(In == null, '+');
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ }
+ PipeStream.Server.Close();
+ // Close up and wait for next one
+ }
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Program.cs b/Duplicati/Scheduler/Program.cs
new file mode 100644
index 000000000..eb41bb148
--- /dev/null
+++ b/Duplicati/Scheduler/Program.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// The Duplicati Scheduler - Uses the Task Scheduler to run Duplicati Backups
+ ///
+ static class Program
+ {
+ ///
+ /// The name of the mother package (all hail)
+ ///
+ public const string Package = "Duplicati";
+ ///
+ /// The official name of this
+ ///
+ public const string Name = "Duplicati.Scheduler";
+ ///
+ /// The base name of the named pipe to the executive
+ ///
+ public const string PipeBaseName = "Duplicati.Pipe";
+ ///
+ /// The name of the thread that advertises the pipe server
+ ///
+ public const string PipeServerThreadName = "Duplicati.PipeServer";
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ // Only allow one of me by locking a mutex
+ bool SingleInstance = false;
+ using (System.Threading.Mutex Single = new System.Threading.Mutex(true, Name, out SingleInstance))
+ {
+ if (SingleInstance)
+ {
+#if !DEBUG
+ try
+#endif
+ {
+ // Debug log?
+ Utility.Tools.TryCatch((Action)delegate()
+ {
+ if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DUPERRORLOG")))
+ {
+ System.Diagnostics.Debug.Listeners.Add(new System.Diagnostics.TextWriterTraceListener(System.IO.File.CreateText(Environment.GetEnvironmentVariable("DEPERRLOG"))));
+ Console.SetOut(System.IO.File.AppendText(Environment.GetEnvironmentVariable("DEPERRLOG")));
+ }
+ });
+ // Set up the application
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ // throw new Exception("It's all gone horribly wrong!");
+ // TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
+ //Utility.Su.Impersonate("User", Environment.UserDomainName, "asd"); // TEST
+ //Environment.SetEnvironmentVariable("TMP", "C:\\temp"); // TEST
+
+ // Check if user can access the database
+ if (System.IO.File.Exists(Duplicati.Scheduler.Data.SchedulerDataSet.DefaultPath()) &&
+ new System.IO.FileInfo(Duplicati.Scheduler.Data.SchedulerDataSet.DefaultPath()).IsReadOnly &&
+ MessageBox.Show("The database file, "+Duplicati.Scheduler.Data.SchedulerDataSet.DefaultPath()+" is not writable by "+Utility.User.UserName+"; continue?", "READONLY", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.No)
+ return;
+
+ Application.Run(new Scheduler());
+ }
+#if !DEBUG
+ catch (Exception Ex)
+ {
+ Utility.Tools.ProcessError("Duplicati", Name, Ex);
+ }
+#endif
+ }
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Properties/AssemblyInfo.cs b/Duplicati/Scheduler/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..c48c54e59
--- /dev/null
+++ b/Duplicati/Scheduler/Properties/AssemblyInfo.cs
@@ -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("Duplicati.Scheduler")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Duplicati.Scheduler")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[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("1cd53a21-efbf-4baa-8728-4dd8f0610e5d")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Duplicati/Scheduler/Properties/Resources.Designer.cs b/Duplicati/Scheduler/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..8173ef16e
--- /dev/null
+++ b/Duplicati/Scheduler/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4961
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Duplicati.Scheduler.Properties
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Duplicati.Scheduler.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Properties/Resources.resx b/Duplicati/Scheduler/Properties/Resources.resx
new file mode 100644
index 000000000..ffecec851
--- /dev/null
+++ b/Duplicati/Scheduler/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Properties/Settings.Designer.cs b/Duplicati/Scheduler/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..751ac95ec
--- /dev/null
+++ b/Duplicati/Scheduler/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4961
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Duplicati.Scheduler.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+ internal 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;
+ }
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Properties/Settings.settings b/Duplicati/Scheduler/Properties/Settings.settings
new file mode 100644
index 000000000..abf36c5d3
--- /dev/null
+++ b/Duplicati/Scheduler/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Duplicati/Scheduler/Scheduler.Designer.cs b/Duplicati/Scheduler/Scheduler.Designer.cs
new file mode 100644
index 000000000..ff200c4db
--- /dev/null
+++ b/Duplicati/Scheduler/Scheduler.Designer.cs
@@ -0,0 +1,371 @@
+namespace Duplicati.Scheduler
+{
+ partial class Scheduler
+ {
+ ///
+ /// 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 Windows Form 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(Scheduler));
+ this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+ this.SettingsToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+ this.AddToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.DelToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.EditToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.helpToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
+ this.LogToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.FilesToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.PrevToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.SelectToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
+ this.NextToolStripButton = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.toolStripButton2 = new System.Windows.Forms.ToolStripButton();
+ this.serviceController1 = new System.ServiceProcess.ServiceController();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.jobSummary1 = new Duplicati.Scheduler.JobSummary();
+ this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+ this.toolStripProgressBar1 = new System.Windows.Forms.ToolStripProgressBar();
+ this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
+ this.JobsBindingSource = new System.Windows.Forms.BindingSource(this.components);
+ this.SchedulerDataSet = new Duplicati.Scheduler.Data.SchedulerDataSet();
+ this.optionsBindingSource = new System.Windows.Forms.BindingSource(this.components);
+ this.toolStrip1.SuspendLayout();
+ this.panel1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ this.statusStrip1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.JobsBindingSource)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SchedulerDataSet)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.optionsBindingSource)).BeginInit();
+ this.SuspendLayout();
+ //
+ // toolStrip1
+ //
+ this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
+ this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.SettingsToolStripButton,
+ this.toolStripSeparator3,
+ this.AddToolStripButton,
+ this.DelToolStripButton,
+ this.EditToolStripButton,
+ this.helpToolStripButton,
+ this.toolStripLabel1,
+ this.LogToolStripButton,
+ this.FilesToolStripButton,
+ this.toolStripSeparator1,
+ this.PrevToolStripButton,
+ this.SelectToolStripDropDownButton,
+ this.NextToolStripButton,
+ this.toolStripSeparator2,
+ this.toolStripButton2});
+ this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip1.Name = "toolStrip1";
+ this.toolStrip1.Size = new System.Drawing.Size(620, 25);
+ this.toolStrip1.TabIndex = 1;
+ this.toolStrip1.Text = "toolStrip1";
+ //
+ // SettingsToolStripButton
+ //
+ this.SettingsToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.SettingsToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("SettingsToolStripButton.Image")));
+ this.SettingsToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.SettingsToolStripButton.Name = "SettingsToolStripButton";
+ this.SettingsToolStripButton.Size = new System.Drawing.Size(62, 22);
+ this.SettingsToolStripButton.Text = "Settings...";
+ this.SettingsToolStripButton.ToolTipText = "Change program settings";
+ this.SettingsToolStripButton.Click += new System.EventHandler(this.SettingsToolStripButton_Click);
+ //
+ // toolStripSeparator3
+ //
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25);
+ //
+ // AddToolStripButton
+ //
+ this.AddToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.AddToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("AddToolStripButton.Image")));
+ this.AddToolStripButton.Name = "AddToolStripButton";
+ this.AddToolStripButton.RightToLeftAutoMirrorImage = true;
+ this.AddToolStripButton.Size = new System.Drawing.Size(23, 22);
+ this.AddToolStripButton.Text = "Add new";
+ this.AddToolStripButton.ToolTipText = "Add a new backup job";
+ this.AddToolStripButton.Click += new System.EventHandler(this.AddToolStripButton_Click);
+ //
+ // DelToolStripButton
+ //
+ this.DelToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.DelToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("DelToolStripButton.Image")));
+ this.DelToolStripButton.Name = "DelToolStripButton";
+ this.DelToolStripButton.RightToLeftAutoMirrorImage = true;
+ this.DelToolStripButton.Size = new System.Drawing.Size(23, 22);
+ this.DelToolStripButton.Text = "Delete";
+ this.DelToolStripButton.ToolTipText = "Delete this backup job";
+ this.DelToolStripButton.Click += new System.EventHandler(this.DelToolStripButton_Click);
+ //
+ // EditToolStripButton
+ //
+ this.EditToolStripButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("EditToolStripButton.BackgroundImage")));
+ this.EditToolStripButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.EditToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.EditToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("EditToolStripButton.Image")));
+ this.EditToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.EditToolStripButton.Name = "EditToolStripButton";
+ this.EditToolStripButton.Size = new System.Drawing.Size(41, 22);
+ this.EditToolStripButton.Text = " EDIT ";
+ this.EditToolStripButton.ToolTipText = "Change this backup job";
+ this.EditToolStripButton.Click += new System.EventHandler(this.EditToolStripButton_Click);
+ //
+ // helpToolStripButton
+ //
+ this.helpToolStripButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image")));
+ this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.helpToolStripButton.Name = "helpToolStripButton";
+ this.helpToolStripButton.Size = new System.Drawing.Size(23, 22);
+ this.helpToolStripButton.Text = "He&lp";
+ //
+ // toolStripLabel1
+ //
+ this.toolStripLabel1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.toolStripLabel1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.toolStripLabel1.Name = "toolStripLabel1";
+ this.toolStripLabel1.Size = new System.Drawing.Size(57, 22);
+ this.toolStripLabel1.Text = "Schedule";
+ //
+ // LogToolStripButton
+ //
+ this.LogToolStripButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("LogToolStripButton.BackgroundImage")));
+ this.LogToolStripButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.LogToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.LogToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("LogToolStripButton.Image")));
+ this.LogToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.LogToolStripButton.Name = "LogToolStripButton";
+ this.LogToolStripButton.Size = new System.Drawing.Size(43, 22);
+ this.LogToolStripButton.Text = " Log ";
+ this.LogToolStripButton.ToolTipText = "View backup history and logs";
+ this.LogToolStripButton.Click += new System.EventHandler(this.LogToolStripButton_Click);
+ //
+ // FilesToolStripButton
+ //
+ this.FilesToolStripButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("FilesToolStripButton.BackgroundImage")));
+ this.FilesToolStripButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.FilesToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.FilesToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("FilesToolStripButton.Image")));
+ this.FilesToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.FilesToolStripButton.Name = "FilesToolStripButton";
+ this.FilesToolStripButton.Size = new System.Drawing.Size(56, 22);
+ this.FilesToolStripButton.Text = " Restore ";
+ this.FilesToolStripButton.ToolTipText = "Restore or list backup files";
+ this.FilesToolStripButton.Click += new System.EventHandler(this.FilesToolStripButton_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+ //
+ // PrevToolStripButton
+ //
+ this.PrevToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.PrevToolStripButton.Enabled = false;
+ this.PrevToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("PrevToolStripButton.Image")));
+ this.PrevToolStripButton.Name = "PrevToolStripButton";
+ this.PrevToolStripButton.RightToLeftAutoMirrorImage = true;
+ this.PrevToolStripButton.Size = new System.Drawing.Size(23, 22);
+ this.PrevToolStripButton.Text = "previous";
+ this.PrevToolStripButton.Click += new System.EventHandler(this.PositionButtons_Click);
+ //
+ // SelectToolStripDropDownButton
+ //
+ this.SelectToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
+ this.SelectToolStripDropDownButton.Image = ((System.Drawing.Image)(resources.GetObject("SelectToolStripDropDownButton.Image")));
+ this.SelectToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.SelectToolStripDropDownButton.Name = "SelectToolStripDropDownButton";
+ this.SelectToolStripDropDownButton.Size = new System.Drawing.Size(51, 22);
+ this.SelectToolStripDropDownButton.Text = "Select";
+ this.SelectToolStripDropDownButton.ToolTipText = "Select a backup job";
+ this.SelectToolStripDropDownButton.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.SelectToolStripDropDownButton_DropDownItemClicked);
+ this.SelectToolStripDropDownButton.DropDownOpening += new System.EventHandler(this.SelectToolStripDropDownButton_DropDownOpening);
+ //
+ // NextToolStripButton
+ //
+ this.NextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.NextToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("NextToolStripButton.Image")));
+ this.NextToolStripButton.Name = "NextToolStripButton";
+ this.NextToolStripButton.RightToLeftAutoMirrorImage = true;
+ this.NextToolStripButton.Size = new System.Drawing.Size(23, 22);
+ this.NextToolStripButton.Text = "next";
+ this.NextToolStripButton.Click += new System.EventHandler(this.PositionButtons_Click);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+ //
+ // toolStripButton2
+ //
+ this.toolStripButton2.CheckOnClick = true;
+ this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image")));
+ this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.toolStripButton2.Name = "toolStripButton2";
+ this.toolStripButton2.Size = new System.Drawing.Size(23, 22);
+ this.toolStripButton2.Text = "toolStripButton2";
+ this.toolStripButton2.Visible = false;
+ //
+ // serviceController1
+ //
+ this.serviceController1.ServiceName = "Duplicati.Service";
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.panel2);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(624, 442);
+ this.panel1.TabIndex = 14;
+ //
+ // panel2
+ //
+ this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.panel2.Controls.Add(this.jobSummary1);
+ this.panel2.Controls.Add(this.statusStrip1);
+ this.panel2.Controls.Add(this.toolStrip1);
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel2.Location = new System.Drawing.Point(0, 0);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(624, 442);
+ this.panel2.TabIndex = 14;
+ //
+ // jobSummary1
+ //
+ this.jobSummary1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.jobSummary1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.jobSummary1.Location = new System.Drawing.Point(0, 25);
+ this.jobSummary1.Margin = new System.Windows.Forms.Padding(4);
+ this.jobSummary1.Name = "jobSummary1";
+ this.jobSummary1.Size = new System.Drawing.Size(620, 391);
+ this.jobSummary1.TabIndex = 2;
+ //
+ // statusStrip1
+ //
+ this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripProgressBar1,
+ this.toolStripStatusLabel1});
+ this.statusStrip1.Location = new System.Drawing.Point(0, 416);
+ this.statusStrip1.Name = "statusStrip1";
+ this.statusStrip1.Size = new System.Drawing.Size(620, 22);
+ this.statusStrip1.TabIndex = 3;
+ this.statusStrip1.Text = "statusStrip1";
+ //
+ // toolStripProgressBar1
+ //
+ this.toolStripProgressBar1.Name = "toolStripProgressBar1";
+ this.toolStripProgressBar1.Size = new System.Drawing.Size(100, 16);
+ //
+ // toolStripStatusLabel1
+ //
+ this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
+ this.toolStripStatusLabel1.Size = new System.Drawing.Size(16, 17);
+ this.toolStripStatusLabel1.Text = " ";
+ //
+ // JobsBindingSource
+ //
+ this.JobsBindingSource.DataMember = "Jobs";
+ this.JobsBindingSource.DataSource = this.SchedulerDataSet;
+ this.JobsBindingSource.CurrentChanged += new System.EventHandler(this.JobsBindingSource_CurrentChanged);
+ //
+ // SchedulerDataSet
+ //
+ this.SchedulerDataSet.DataSetName = "SchedulerDataSet";
+ this.SchedulerDataSet.LastLoaded = new System.DateTime(((long)(0)));
+ this.SchedulerDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
+ this.SchedulerDataSet.XMLPath = null;
+ //
+ // optionsBindingSource
+ //
+ this.optionsBindingSource.DataMember = "Options";
+ this.optionsBindingSource.DataSource = this.SchedulerDataSet;
+ //
+ // Scheduler
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(624, 442);
+ this.Controls.Add(this.panel1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "Scheduler";
+ this.Text = "Schedule";
+ this.toolStrip1.ResumeLayout(false);
+ this.toolStrip1.PerformLayout();
+ this.panel1.ResumeLayout(false);
+ this.panel2.ResumeLayout(false);
+ this.panel2.PerformLayout();
+ this.statusStrip1.ResumeLayout(false);
+ this.statusStrip1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.JobsBindingSource)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SchedulerDataSet)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.optionsBindingSource)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.BindingSource JobsBindingSource;
+ private Duplicati.Scheduler.Data.SchedulerDataSet SchedulerDataSet;
+ private System.Windows.Forms.BindingSource optionsBindingSource;
+ private System.Windows.Forms.ToolStrip toolStrip1;
+ private System.Windows.Forms.ToolStripButton AddToolStripButton;
+ private System.Windows.Forms.ToolStripButton DelToolStripButton;
+ private System.Windows.Forms.ToolStripButton EditToolStripButton;
+ private System.Windows.Forms.ToolStripLabel toolStripLabel1;
+ private System.Windows.Forms.ToolStripButton LogToolStripButton;
+ private System.ServiceProcess.ServiceController serviceController1;
+ private System.Windows.Forms.ToolStripButton FilesToolStripButton;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripButton PrevToolStripButton;
+ private System.Windows.Forms.ToolStripDropDownButton SelectToolStripDropDownButton;
+ private System.Windows.Forms.ToolStripButton NextToolStripButton;
+ private JobSummary jobSummary1;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripButton helpToolStripButton;
+ private System.Windows.Forms.StatusStrip statusStrip1;
+ private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar1;
+ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
+ private System.Windows.Forms.ToolStripButton SettingsToolStripButton;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+ private System.Windows.Forms.ToolStripButton toolStripButton2;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/Scheduler.cs b/Duplicati/Scheduler/Scheduler.cs
new file mode 100644
index 000000000..51b47e595
--- /dev/null
+++ b/Duplicati/Scheduler/Scheduler.cs
@@ -0,0 +1,311 @@
+using System;
+using System.Data;
+using System.Linq;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// The mother form, shows a Summary and a tool menu
+ ///
+ public partial class Scheduler : Form
+ {
+ ///
+ /// The mother form, shows a Summary and a tool menu
+ ///
+ public Scheduler()
+ {
+ InitializeComponent();
+ this.Text = "Schedule (" + Utility.User.UserName + ")";
+ // Load the database
+ this.SchedulerDataSet.Load();
+ // Advertise for pipe connections
+ Pipe.Server(OperationProgress);
+ // Put up the navigation buttons
+ EnableNav();
+#if DEBUG
+ this.toolStripButton2.Visible = true;
+#endif
+ }
+ private System.IO.FileSystemWatcher itsLogWatcher;
+ // This little guy just looks for new log files and turns the "Log" button green if one arrives
+ private void InitializeLogWatcher()
+ {
+ itsLogWatcher = new System.IO.FileSystemWatcher(Utility.Tools.LogFileDirectory(Program.Package), "*.txt") { NotifyFilter = System.IO.NotifyFilters.Attributes };
+ itsLogWatcher.Changed += new System.IO.FileSystemEventHandler(
+ delegate(object sender, System.IO.FileSystemEventArgs e)
+ {
+ this.BeginInvoke((Action)delegate() { this.LogToolStripButton.ForeColor = System.Drawing.Color.Green; });
+ });
+ itsLogWatcher.EnableRaisingEvents = true;
+ }
+ ///
+ /// Adds a new job to the task scheduler
+ ///
+ /// Job to add
+ /// Trigger to add
+ /// True if all went well
+ private bool NewTask(Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow aRow, Microsoft.Win32.TaskScheduler.Trigger aTrigger)
+ {
+ // DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG
+ if (this.toolStripButton2.Checked && aTrigger is Microsoft.Win32.TaskScheduler.TimeTrigger)
+ {
+ ((Microsoft.Win32.TaskScheduler.TimeTrigger)aTrigger).Repetition.Interval = TimeSpan.FromMinutes(5);
+ ((Microsoft.Win32.TaskScheduler.TimeTrigger)aTrigger).Repetition.Duration = TimeSpan.FromDays(1);
+ }
+ // Used for password
+ System.Security.SecureString ss = null;
+ bool Result = false;
+ do
+ {
+ DialogResult dr = DialogResult.None;
+ // Get the user credentials from the user
+ Result = Utility.Tools.NoException((Action)delegate()
+ {
+ dr = TaskScheduler.InvokeCredentialDialog(this, aRow.TaskName,
+ "Enter user account information for running this backup:", Utility.User.UserName, out ss);
+ });
+ // If there was an error or user pressed Cancel, bail.
+ if (!Result || dr != DialogResult.OK) return false;
+ // Send the Trigger to the task scheduler
+ Result = Utility.Tools.NoException((Action)delegate()
+ {
+ TaskScheduler.CreateOrUpdateTask(aRow.TaskName,
+ System.IO.Path.Combine(Application.StartupPath, "Duplicati.RunBackup.exe"),
+ "Duplicati backup task", Utility.User.UserName, ss, aTrigger,
+ "\"" + aRow.Name + "\" \"" + Duplicati.Scheduler.Data.SchedulerDataSet.DefaultPath() + "\"");
+ });
+ // Assume any error is a security thing and make user enter password again.
+ if (!Result && MessageBox.Show("Logon information is not valid for " + Utility.User.UserName + ", [OK] to try again?",
+ "Wrong", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) return false;
+ } while (!Result);
+ return Result; // gonna be true
+ }
+ ///
+ /// Pressed ADD button, add a new job
+ ///
+ private void AddToolStripButton_Click(object sender, EventArgs e)
+ {
+ bool OK = false;
+ // Get the name, must be unique
+ SchedulerNameDialog snd = new SchedulerNameDialog();
+ do
+ {
+ if (snd.ShowDialog() == DialogResult.Cancel) return;
+ OK = this.SchedulerDataSet.Jobs.FindByName(snd.BackupName) == null;
+ if (!OK) MessageBox.Show("Backup name " + snd.BackupName + " is already used.");
+ } while (!OK);
+ this.Cursor = Cursors.WaitCursor;
+ // Fire up the editor
+ JobDialog sd = new JobDialog(this.SchedulerDataSet.Jobs.NewJobsRow(snd.BackupName));
+ if (sd.ShowDialog() == DialogResult.OK && NewTask(sd.Row, sd.Trigger))
+ {
+ // Add this to the database
+ this.SchedulerDataSet.Jobs.AddJobsRow(sd.Row);
+ Save(sd.Row);
+ this.jobSummary1.Enabled = sd.Row.Enabled;
+ }
+ this.Cursor = Cursors.Default;
+ }
+ ///
+ /// Reflects the current JobsBindingSource row as a JobsRow
+ ///
+ private Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow CurrentRow
+ {
+ get
+ {
+ if (this.JobsBindingSource.Current == null) return null;
+ return (Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow)((DataRowView)this.JobsBindingSource.Current).Row;
+ }
+ }
+ ///
+ /// Pressed the EDIT button
+ ///
+ private void EditToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (CurrentRow == null) return;
+ this.Cursor = Cursors.WaitCursor;
+ // Fire up the editor
+ JobDialog sd = new JobDialog(CurrentRow);
+ // Get the trigger
+ sd.Trigger = TaskScheduler.GetTrigger(CurrentRow.TaskName);
+ // User said OK and the Task Scheduler took it OK, so save it
+ if (sd.ShowDialog() == DialogResult.OK && NewTask(sd.Row, sd.Trigger))
+ {
+ // Save the edited row
+ Save(sd.Row);
+ this.jobSummary1.Enabled = sd.Row.Enabled;
+ }
+ // Updates the screen
+ JobsBindingSource_CurrentChanged(null, null);
+ this.Cursor = Cursors.Default; // Should be in a 'finnaly'
+ }
+ ///
+ /// Save the database
+ ///
+ /// Altered row
+ private void Save(Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow aRow)
+ {
+ // Update the drive table
+ if (aRow != null)
+ {
+ System.Collections.Generic.Dictionary DriveMap = new System.Collections.Generic.Dictionary();
+ foreach (System.IO.DriveInfo di in System.IO.DriveInfo.GetDrives())
+ if ((di.IsReady && di.DriveType == System.IO.DriveType.Network))
+ DriveMap.Add(di.Name[0].ToString(), Utility.Tools.DriveToUNC(di.Name[0]));
+ aRow.SetDriveMaps(DriveMap);
+ }
+ Exception Ex = this.SchedulerDataSet.Save();
+ if (Ex != null)
+ MessageBox.Show("Can not save schedule: " + Ex.Message);
+ }
+ ///
+ /// Pressed the LOG button - show the history
+ ///
+ ///
+ ///
+ private void LogToolStripButton_Click(object sender, EventArgs e)
+ {
+ // If button was green, ungreen it
+ this.LogToolStripButton.ForeColor = this.FilesToolStripButton.ForeColor;
+ if (CurrentRow == null) return;
+ LogView lv = new LogView(CurrentRow.Name);
+ lv.ShowDialog();
+ }
+ ///
+ /// Pressed the RESTORE button - List the backups
+ ///
+ private void FilesToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (CurrentRow == null) return;
+ BackupListDialog fd = new BackupListDialog(CurrentRow.Name, CurrentRow.Destination, CurrentRow.Options);
+ fd.ShowDialog();
+ }
+ ///
+ /// Pressed the select dropdown, populate the drop-downs
+ ///
+ private void SelectToolStripDropDownButton_DropDownOpening(object sender, EventArgs e)
+ {
+ // Make a drop down entry for every job in the database
+ this.SelectToolStripDropDownButton.DropDownItems.Clear();
+ this.SelectToolStripDropDownButton.DropDownItems.AddRange(
+ (from Duplicati.Scheduler.Data.SchedulerDataSet.JobsRow qR in this.SchedulerDataSet.Jobs.Select()
+ select new ToolStripMenuItem(qR.Name)).ToArray());
+ }
+ ///
+ /// Clicked a SELECT drop-down - Go to that record
+ ///
+ ///
+ ///
+ private void SelectToolStripDropDownButton_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
+ {
+ // This is how one moves a bindingsource record...
+ int ix = this.JobsBindingSource.Find("Name", e.ClickedItem.Text);
+ if (ix >= 0) this.JobsBindingSource.Position = ix;
+ }
+ ///
+ /// Pressed a NEXT or PREV
+ ///
+ private void PositionButtons_Click(object sender, EventArgs e)
+ {
+ if (((ToolStripButton)sender).Text == "next") this.JobsBindingSource.MoveNext();
+ else this.JobsBindingSource.MovePrevious();
+ EnableNav();
+ }
+ ///
+ /// Make sure the correct NEXT, PREV, SELECT buttons are lit depending on the binding
+ ///
+ private void EnableNav()
+ {
+ this.SelectToolStripDropDownButton.Enabled = this.JobsBindingSource.Count > 1;
+ this.NextToolStripButton.Enabled = this.JobsBindingSource.Position < this.JobsBindingSource.Count-1;
+ this.PrevToolStripButton.Enabled = this.JobsBindingSource.Position > 0;
+ this.EditToolStripButton.Enabled =
+ this.DelToolStripButton.Enabled =
+ this.FilesToolStripButton.Enabled =
+ this.LogToolStripButton.Enabled =
+ this.JobsBindingSource.Count > 0;
+ this.SelectToolStripDropDownButton.Text = "Select (" + this.JobsBindingSource.Count.ToString() + ")";
+ }
+ ///
+ /// Selected a new record, adjust everything
+ ///
+ private void JobsBindingSource_CurrentChanged(object sender, EventArgs e)
+ {
+ if (CurrentRow == null)
+ {
+ this.jobSummary1.Clear();
+ }
+ else
+ {
+ this.jobSummary1.SetSummary(CurrentRow, TaskScheduler.Describe(CurrentRow.TaskName));
+ this.jobSummary1.Enabled = TaskScheduler.Enabled(CurrentRow.TaskName);
+ }
+ EnableNav();
+ if (CurrentRow == null) this.JobsBindingSource.MoveFirst(); // Will reenter if there are any more records
+ }
+ ///
+ /// Pressed the DELETE button
+ ///
+ private void DelToolStripButton_Click(object sender, EventArgs e)
+ {
+ if (CurrentRow == null || MessageBox.Show("Do you want to delete this job?", "DELETE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
+ CurrentRow.Delete();
+ Save(null);
+ // Updates the screen
+ JobsBindingSource_CurrentChanged(null, null);
+ }
+ ///
+ /// Update the progress bar
+ ///
+ private void SetProgress(int aProgress, string aMessage)
+ {
+ Debug.WriteLine(aMessage + ":" + aProgress.ToString());
+ try
+ {
+ if (aMessage.EndsWith("Completed")) aProgress = 100;
+ if (aProgress < 0)
+ {
+ this.toolStripProgressBar1.Style = ProgressBarStyle.Marquee;
+ }
+ else
+ {
+ this.toolStripProgressBar1.Style = ProgressBarStyle.Continuous;
+ //if (aProgress > this.toolStripProgressBar1.Maximum) this.toolStripProgressBar1.Maximum = aProgress + 20;
+ this.toolStripProgressBar1.Value = Math.Min(this.toolStripProgressBar1.Maximum, aProgress);
+ }
+ if (!string.IsNullOrEmpty(aMessage))
+ {
+ this.toolStripStatusLabel1.Text = aMessage;
+ this.toolStripStatusLabel1.ToolTipText = aMessage;
+ }
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ ///
+ /// Called from the pipe thread to indicate progress from the exec
+ ///
+ /// A message from the exec
+ private void OperationProgress(string aMessage)
+ {
+ if (!this.IsHandleCreated || string.IsNullOrEmpty(aMessage)) return;
+ // Decode the message
+ Duplicati.RunBackup.Pipe.ProgressArguments pa = new Duplicati.RunBackup.Pipe.ProgressArguments(aMessage);
+ // Update the screen, be sure to use the forms thread
+ if (pa.OK) this.BeginInvoke((Action)delegate()
+ { SetProgress(pa.Progress, pa.Job + ":" + pa.Operation + ":" + pa.Message); });
+ }
+ ///
+ /// Pressed the SETTINGS button, edit settings
+ ///
+ private void SettingsToolStripButton_Click(object sender, EventArgs e)
+ {
+ // Deals with its own save, cancel, etc.
+ new SettingsDialog(this.SchedulerDataSet.Settings).ShowDialog();
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/Scheduler.resx b/Duplicati/Scheduler/Scheduler.resx
new file mode 100644
index 000000000..5af2a4479
--- /dev/null
+++ b/Duplicati/Scheduler/Scheduler.resx
@@ -0,0 +1,828 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 642, 17
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAFNSURBVDhPY2AYtODuAvb/t+Zx/r86h+v/xRm8/0l26HWg
+ xj+PGv//edjw/+RkAdINOD+dF27AwR4R0g04PkkQaHvd/z8Pqv7vaBcnbMClmTz/z07l+38SqPFIv9D/
+ fd0iQM3l///eK/q/vkHm/6oauf9LKxX/zy9V/j+rSBXTwFNAf/55WA/UVAvElf//3CsB4rz/f+9m/v97
+ J/n/39tx///djADikP+TcjQxDTjUKwx27t/7pUCNBUCN2UCNqUCNCf//3YoGagz7/+9G0P9/1/3+d6Xp
+ Yhqws13i/5Zmqf/rwM6V/7+kQvH/31sxQI3h/6fmafyfkKX1vztD9397qv7/5kRDwmEyG+hPkHP/3Qj4
+ 35OhQ1gDekIB+fPfDX8g9vvfmqxPugHd6bpg/4JwfZwR6Qa0JBn8b4g3/F8Ta/y/MtqEdANITvvkagAA
+ JCPYnqPoI1MAAAAASUVORK5CYII=
+
+
+
+
+ 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
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ 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
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYNJREFUSEvV1r1K
+ w1AYxvFzFd6Bd+EFiOCod6AggiA4KKKTOugiWHCu4qA4ObiVFqQV/KjY2qRp0ybVpEm/bD7bDg2Pnpaq
+ KIHqkFMDf8iU98d7hhxSLMgQuCz4pzS49N9LJW8xbF/n0LnZTKZnoBZCX6Q8j9XQKcZnt0AmVgJtbHoT
+ 8zthyEUBYl4EoTqKmdk4QuyhgKCfjKT3Zq+FzvoboiC6mWhSDNryMS+azPcMpZICQs+QHhN9PM9jEp1N
+ Daqq9zc0KqByuTJaIO07qNP1wKLBkf0AtdoeWOQLclwPLPIFGWYXLPIFVWouWOQLelENsMgXVJTqYJEv
+ SMhpYNH/AXG8Bhb5bij1qIBFvqD7OwksGoB0rUp/rhzorS16fYNEnGfSZSTSM9SqDZBcVsDcdhhTywe4
+ iFwFDool4phc2sfC7jGaTROkIEpQnmWsH54zu1Mv7p3ANBuwTBukJCsov9/U6rVXGIYFy3Jg27+v0+5g
+ 2D6/78JxXLhuC47tQlV0vAH+hUZFnK9GkQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAAC9SURBVDhPY2AYMiC8/cF/sh0b3/3gf3DDNfIMiO95+H/p
+ /v///asvkG5ARPt9sObMWf//e5WeIM2A0NZ7YM2t64C2d/7975J/gHgDglvu/l+09///DqDmjDk//9vV
+ /fxvn7GdeANAoW1XfPt/+pzf//27vv3XKXz33yJhPWkGgAzRTzn/36ToxX+VrE//jSOXkW4AyBCDpBP/
+ ZdO+/tcNnkeeAWCXpF7+r+E7jXwDQIaoeEygzACykzHNNQIA0BRgmJLkyxEAAAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAACrSURBVDhPY2AYdKBw1vP/FDkqd+az/wnd98g3JGPK0//z
+ 9v/+n9B1hzxDEnqe/J+979f/zq1//7uVXibdkMiuR/+nbPv1v2Tp3/8J0//+t8k9S5ohgc0P/7eufQ/W
+ bFzy5b909LX/xpHLiDfEo+r+/5K57+CaFV16iNcMij770rv/A1uegW0mWTPIAIu8O/9tCq6QpxlkgGHW
+ bfI1gwzQSbtBmp8pSraDQjMAoH5foAtinnYAAAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI
+ ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9
+ HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN
+ rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K
+ TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx
+ oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8
+ 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI
+ xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX
+ LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd
+ KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC
+
+
+
+ 320, 17
+
+
+ 747, 17
+
+
+ 17, 17
+
+
+ 172, 17
+
+
+ 470, 17
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/SchedulerNameDialog.Designer.cs b/Duplicati/Scheduler/SchedulerNameDialog.Designer.cs
new file mode 100644
index 000000000..8c6415598
--- /dev/null
+++ b/Duplicati/Scheduler/SchedulerNameDialog.Designer.cs
@@ -0,0 +1,139 @@
+namespace Duplicati.Scheduler
+{
+ partial class SchedulerNameDialog
+ {
+ ///
+ /// 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 Windows Form 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(SchedulerNameDialog));
+ this.CanButton = new System.Windows.Forms.Button();
+ this.OKButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.NoteLabel = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // CanButton
+ //
+ this.CanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CanButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CanButton.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CanButton.Location = new System.Drawing.Point(350, 119);
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(84, 35);
+ this.CanButton.TabIndex = 24;
+ this.CanButton.Text = "Cancel";
+ this.CanButton.UseVisualStyleBackColor = true;
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // OKButton
+ //
+ this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OKButton.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.OKButton.Location = new System.Drawing.Point(259, 119);
+ this.OKButton.Name = "OKButton";
+ this.OKButton.Size = new System.Drawing.Size(84, 35);
+ this.OKButton.TabIndex = 22;
+ this.OKButton.Text = "OK";
+ this.OKButton.UseVisualStyleBackColor = true;
+ this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.label1.Location = new System.Drawing.Point(0, 0);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(4);
+ this.label1.Size = new System.Drawing.Size(179, 27);
+ this.label1.TabIndex = 3;
+ this.label1.Text = "Enter a new job name:";
+ //
+ // textBox1
+ //
+ this.textBox1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.textBox1.Location = new System.Drawing.Point(0, 27);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(448, 27);
+ this.textBox1.TabIndex = 4;
+ //
+ // NoteLabel
+ //
+ this.NoteLabel.AutoSize = true;
+ this.NoteLabel.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NoteLabel.Location = new System.Drawing.Point(4, 61);
+ this.NoteLabel.Name = "NoteLabel";
+ this.NoteLabel.Size = new System.Drawing.Size(338, 19);
+ this.NoteLabel.TabIndex = 25;
+ this.NoteLabel.Text = "* Must not include special characters, i.e. \'[\', \'\\\'";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.Location = new System.Drawing.Point(22, 80);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(305, 19);
+ this.label2.TabIndex = 26;
+ this.label2.Text = "Stick to letters and numbers, Space is OK.\r\n";
+ //
+ // SchedulerNameDialog
+ //
+ this.AcceptButton = this.OKButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.CanButton;
+ this.ClientSize = new System.Drawing.Size(448, 166);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.NoteLabel);
+ this.Controls.Add(this.textBox1);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.OKButton);
+ this.Controls.Add(this.CanButton);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "SchedulerNameDialog";
+ this.Text = "Job Name";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button CanButton;
+ private System.Windows.Forms.Button OKButton;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.Label NoteLabel;
+ private System.Windows.Forms.Label label2;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/SchedulerNameDialog.cs b/Duplicati/Scheduler/SchedulerNameDialog.cs
new file mode 100644
index 000000000..2aeb478db
--- /dev/null
+++ b/Duplicati/Scheduler/SchedulerNameDialog.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Get a new job name
+ ///
+ public partial class SchedulerNameDialog : Form
+ {
+ private string itsBackupName;
+ ///
+ /// The selected name
+ ///
+ public string BackupName
+ {
+ get { return itsBackupName; }
+ set { itsBackupName = this.textBox1.Text = value; }
+ }
+ ///
+ /// Get a new job name
+ ///
+ public SchedulerNameDialog()
+ {
+ InitializeComponent();
+ List Adder = new List(System.IO.Path.GetInvalidFileNameChars());
+ this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
+ }
+ // Stuff I don't like, some of them are probably OK; but, I don't care, I don't like um.
+ private string BadList = "+=!@#$%^&*[]{}:\\';\"" + new string(System.IO.Path.GetInvalidFileNameChars());
+ private volatile bool Ignore = false; // Stops re-entry
+ ///
+ /// User entered text, make sure it's not on the naughty list
+ ///
+ void textBox1_TextChanged(object sender, EventArgs e)
+ {
+ int Index = this.textBox1.Text.Length - 1;
+ if (!Ignore && !string.IsNullOrEmpty(this.textBox1.Text) && BadList.Contains(this.textBox1.Text[Index]))
+ {
+ Ignore = true;
+ this.textBox1.Text = this.textBox1.Text.Substring(0, Index);
+ this.textBox1.SelectionStart = this.textBox1.Text.Length;
+ System.Media.SystemSounds.Beep.Play();
+ }
+ Ignore = false;
+ }
+ ///
+ /// Pressed OK, store result and close
+ ///
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ itsBackupName = this.textBox1.Text;
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+ ///
+ /// Pressed CANCEL - just close
+ ///
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/SchedulerNameDialog.resx b/Duplicati/Scheduler/SchedulerNameDialog.resx
new file mode 100644
index 000000000..a3c9b8abc
--- /dev/null
+++ b/Duplicati/Scheduler/SchedulerNameDialog.resx
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/SettingsDialog.Designer.cs b/Duplicati/Scheduler/SettingsDialog.Designer.cs
new file mode 100644
index 000000000..15b034826
--- /dev/null
+++ b/Duplicati/Scheduler/SettingsDialog.Designer.cs
@@ -0,0 +1,533 @@
+namespace Duplicati.Scheduler
+{
+ partial class SettingsDialog
+ {
+ ///
+ /// 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 Windows Form 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(SettingsDialog));
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.RemoveLabel = new System.Windows.Forms.Label();
+ this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
+ this.label2 = new System.Windows.Forms.Label();
+ this.CanButton = new System.Windows.Forms.Button();
+ this.OKButton = new System.Windows.Forms.Button();
+ this.BubbleCheckBox = new System.Windows.Forms.CheckBox();
+ this.passwordControl1 = new Duplicati.Scheduler.PasswordControl();
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // checkBox1
+ //
+ this.checkBox1.AutoSize = true;
+ this.checkBox1.Location = new System.Drawing.Point(12, 12);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(269, 23);
+ this.checkBox1.TabIndex = 0;
+ this.checkBox1.Text = "Use this password for all backups.";
+ this.checkBox1.UseVisualStyleBackColor = true;
+ this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
+ //
+ // RemoveLabel
+ //
+ this.RemoveLabel.AutoSize = true;
+ this.RemoveLabel.Location = new System.Drawing.Point(27, 231);
+ this.RemoveLabel.Name = "RemoveLabel";
+ this.RemoveLabel.Size = new System.Drawing.Size(227, 19);
+ this.RemoveLabel.TabIndex = 2;
+ this.RemoveLabel.Text = "Remove log entries older than ";
+ //
+ // numericUpDown1
+ //
+ this.numericUpDown1.Location = new System.Drawing.Point(260, 227);
+ this.numericUpDown1.Maximum = new decimal(new int[] {
+ 10000,
+ 0,
+ 0,
+ 0});
+ this.numericUpDown1.Name = "numericUpDown1";
+ this.numericUpDown1.Size = new System.Drawing.Size(73, 27);
+ this.numericUpDown1.TabIndex = 3;
+ this.numericUpDown1.Value = new decimal(new int[] {
+ 90,
+ 0,
+ 0,
+ 0});
+ this.numericUpDown1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(339, 229);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(46, 19);
+ this.label2.TabIndex = 4;
+ this.label2.Text = "days.";
+ //
+ // CanButton
+ //
+ this.CanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CanButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CanButton.Location = new System.Drawing.Point(473, 272);
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(75, 33);
+ this.CanButton.TabIndex = 5;
+ this.CanButton.Text = "Cancel";
+ this.CanButton.UseVisualStyleBackColor = true;
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // OKButton
+ //
+ this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OKButton.Location = new System.Drawing.Point(392, 272);
+ this.OKButton.Name = "OKButton";
+ this.OKButton.Size = new System.Drawing.Size(75, 33);
+ this.OKButton.TabIndex = 6;
+ this.OKButton.Text = "OK";
+ this.OKButton.UseVisualStyleBackColor = true;
+ this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // BubbleCheckBox
+ //
+ this.BubbleCheckBox.AutoSize = true;
+ this.BubbleCheckBox.Location = new System.Drawing.Point(31, 274);
+ this.BubbleCheckBox.Name = "BubbleCheckBox";
+ this.BubbleCheckBox.Size = new System.Drawing.Size(361, 23);
+ this.BubbleCheckBox.TabIndex = 7;
+ this.BubbleCheckBox.Text = "Show backup status in toolbar notifier bubbles.";
+ this.BubbleCheckBox.UseVisualStyleBackColor = true;
+ this.BubbleCheckBox.Visible = false;
+ //
+ // passwordControl1
+ //
+ this.passwordControl1.BackColor = System.Drawing.Color.Gainsboro;
+ this.passwordControl1.CheckMod = "";
+ this.passwordControl1.Checksum = new byte[] {
+ ((byte)(1)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(208)),
+ ((byte)(140)),
+ ((byte)(157)),
+ ((byte)(223)),
+ ((byte)(1)),
+ ((byte)(21)),
+ ((byte)(209)),
+ ((byte)(17)),
+ ((byte)(140)),
+ ((byte)(122)),
+ ((byte)(0)),
+ ((byte)(192)),
+ ((byte)(79)),
+ ((byte)(194)),
+ ((byte)(151)),
+ ((byte)(235)),
+ ((byte)(1)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(48)),
+ ((byte)(183)),
+ ((byte)(91)),
+ ((byte)(129)),
+ ((byte)(98)),
+ ((byte)(50)),
+ ((byte)(81)),
+ ((byte)(67)),
+ ((byte)(164)),
+ ((byte)(141)),
+ ((byte)(23)),
+ ((byte)(21)),
+ ((byte)(92)),
+ ((byte)(22)),
+ ((byte)(163)),
+ ((byte)(166)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(2)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(16)),
+ ((byte)(102)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(1)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(32)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(230)),
+ ((byte)(20)),
+ ((byte)(12)),
+ ((byte)(27)),
+ ((byte)(88)),
+ ((byte)(176)),
+ ((byte)(90)),
+ ((byte)(225)),
+ ((byte)(54)),
+ ((byte)(47)),
+ ((byte)(201)),
+ ((byte)(171)),
+ ((byte)(23)),
+ ((byte)(240)),
+ ((byte)(125)),
+ ((byte)(95)),
+ ((byte)(34)),
+ ((byte)(28)),
+ ((byte)(80)),
+ ((byte)(198)),
+ ((byte)(72)),
+ ((byte)(136)),
+ ((byte)(121)),
+ ((byte)(56)),
+ ((byte)(135)),
+ ((byte)(95)),
+ ((byte)(13)),
+ ((byte)(240)),
+ ((byte)(4)),
+ ((byte)(242)),
+ ((byte)(32)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(14)),
+ ((byte)(128)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(2)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(32)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(115)),
+ ((byte)(213)),
+ ((byte)(202)),
+ ((byte)(86)),
+ ((byte)(242)),
+ ((byte)(62)),
+ ((byte)(219)),
+ ((byte)(207)),
+ ((byte)(39)),
+ ((byte)(54)),
+ ((byte)(126)),
+ ((byte)(232)),
+ ((byte)(45)),
+ ((byte)(168)),
+ ((byte)(8)),
+ ((byte)(169)),
+ ((byte)(11)),
+ ((byte)(205)),
+ ((byte)(229)),
+ ((byte)(214)),
+ ((byte)(254)),
+ ((byte)(108)),
+ ((byte)(2)),
+ ((byte)(65)),
+ ((byte)(19)),
+ ((byte)(51)),
+ ((byte)(26)),
+ ((byte)(216)),
+ ((byte)(132)),
+ ((byte)(41)),
+ ((byte)(123)),
+ ((byte)(116)),
+ ((byte)(144)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(120)),
+ ((byte)(234)),
+ ((byte)(183)),
+ ((byte)(150)),
+ ((byte)(107)),
+ ((byte)(36)),
+ ((byte)(213)),
+ ((byte)(47)),
+ ((byte)(80)),
+ ((byte)(14)),
+ ((byte)(118)),
+ ((byte)(205)),
+ ((byte)(4)),
+ ((byte)(54)),
+ ((byte)(169)),
+ ((byte)(85)),
+ ((byte)(137)),
+ ((byte)(127)),
+ ((byte)(213)),
+ ((byte)(201)),
+ ((byte)(178)),
+ ((byte)(106)),
+ ((byte)(77)),
+ ((byte)(165)),
+ ((byte)(50)),
+ ((byte)(55)),
+ ((byte)(141)),
+ ((byte)(115)),
+ ((byte)(123)),
+ ((byte)(37)),
+ ((byte)(144)),
+ ((byte)(104)),
+ ((byte)(81)),
+ ((byte)(164)),
+ ((byte)(134)),
+ ((byte)(32)),
+ ((byte)(101)),
+ ((byte)(240)),
+ ((byte)(58)),
+ ((byte)(188)),
+ ((byte)(146)),
+ ((byte)(137)),
+ ((byte)(119)),
+ ((byte)(154)),
+ ((byte)(94)),
+ ((byte)(69)),
+ ((byte)(154)),
+ ((byte)(5)),
+ ((byte)(52)),
+ ((byte)(155)),
+ ((byte)(219)),
+ ((byte)(48)),
+ ((byte)(64)),
+ ((byte)(112)),
+ ((byte)(91)),
+ ((byte)(31)),
+ ((byte)(39)),
+ ((byte)(142)),
+ ((byte)(200)),
+ ((byte)(190)),
+ ((byte)(30)),
+ ((byte)(65)),
+ ((byte)(105)),
+ ((byte)(218)),
+ ((byte)(106)),
+ ((byte)(169)),
+ ((byte)(119)),
+ ((byte)(228)),
+ ((byte)(109)),
+ ((byte)(236)),
+ ((byte)(60)),
+ ((byte)(186)),
+ ((byte)(151)),
+ ((byte)(86)),
+ ((byte)(225)),
+ ((byte)(69)),
+ ((byte)(92)),
+ ((byte)(2)),
+ ((byte)(169)),
+ ((byte)(65)),
+ ((byte)(210)),
+ ((byte)(248)),
+ ((byte)(115)),
+ ((byte)(177)),
+ ((byte)(239)),
+ ((byte)(15)),
+ ((byte)(75)),
+ ((byte)(15)),
+ ((byte)(118)),
+ ((byte)(207)),
+ ((byte)(77)),
+ ((byte)(84)),
+ ((byte)(44)),
+ ((byte)(111)),
+ ((byte)(202)),
+ ((byte)(242)),
+ ((byte)(162)),
+ ((byte)(180)),
+ ((byte)(118)),
+ ((byte)(85)),
+ ((byte)(13)),
+ ((byte)(158)),
+ ((byte)(225)),
+ ((byte)(47)),
+ ((byte)(239)),
+ ((byte)(140)),
+ ((byte)(238)),
+ ((byte)(156)),
+ ((byte)(5)),
+ ((byte)(97)),
+ ((byte)(224)),
+ ((byte)(104)),
+ ((byte)(136)),
+ ((byte)(87)),
+ ((byte)(25)),
+ ((byte)(136)),
+ ((byte)(68)),
+ ((byte)(37)),
+ ((byte)(254)),
+ ((byte)(163)),
+ ((byte)(103)),
+ ((byte)(133)),
+ ((byte)(152)),
+ ((byte)(113)),
+ ((byte)(113)),
+ ((byte)(70)),
+ ((byte)(100)),
+ ((byte)(85)),
+ ((byte)(0)),
+ ((byte)(152)),
+ ((byte)(103)),
+ ((byte)(159)),
+ ((byte)(233)),
+ ((byte)(225)),
+ ((byte)(134)),
+ ((byte)(70)),
+ ((byte)(92)),
+ ((byte)(178)),
+ ((byte)(62)),
+ ((byte)(45)),
+ ((byte)(145)),
+ ((byte)(228)),
+ ((byte)(160)),
+ ((byte)(103)),
+ ((byte)(64)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(0)),
+ ((byte)(164)),
+ ((byte)(254)),
+ ((byte)(131)),
+ ((byte)(153)),
+ ((byte)(161)),
+ ((byte)(3)),
+ ((byte)(37)),
+ ((byte)(154)),
+ ((byte)(74)),
+ ((byte)(35)),
+ ((byte)(34)),
+ ((byte)(48)),
+ ((byte)(90)),
+ ((byte)(239)),
+ ((byte)(43)),
+ ((byte)(253)),
+ ((byte)(130)),
+ ((byte)(255)),
+ ((byte)(5)),
+ ((byte)(108)),
+ ((byte)(236)),
+ ((byte)(239)),
+ ((byte)(244)),
+ ((byte)(105)),
+ ((byte)(138)),
+ ((byte)(130)),
+ ((byte)(182)),
+ ((byte)(176)),
+ ((byte)(85)),
+ ((byte)(108)),
+ ((byte)(134)),
+ ((byte)(156)),
+ ((byte)(243)),
+ ((byte)(67)),
+ ((byte)(9)),
+ ((byte)(198)),
+ ((byte)(186)),
+ ((byte)(73)),
+ ((byte)(166)),
+ ((byte)(120)),
+ ((byte)(47)),
+ ((byte)(50)),
+ ((byte)(197)),
+ ((byte)(154)),
+ ((byte)(228)),
+ ((byte)(78)),
+ ((byte)(154)),
+ ((byte)(158)),
+ ((byte)(42)),
+ ((byte)(168)),
+ ((byte)(187)),
+ ((byte)(252)),
+ ((byte)(146)),
+ ((byte)(60)),
+ ((byte)(146)),
+ ((byte)(187)),
+ ((byte)(98)),
+ ((byte)(43)),
+ ((byte)(31)),
+ ((byte)(229)),
+ ((byte)(31)),
+ ((byte)(253)),
+ ((byte)(151)),
+ ((byte)(168))};
+ this.passwordControl1.Enabled = false;
+ this.passwordControl1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.passwordControl1.Location = new System.Drawing.Point(30, 42);
+ this.passwordControl1.Margin = new System.Windows.Forms.Padding(4);
+ this.passwordControl1.Name = "passwordControl1";
+ this.passwordControl1.Size = new System.Drawing.Size(517, 165);
+ this.passwordControl1.TabIndex = 1;
+ //
+ // SettingsDialog
+ //
+ this.AcceptButton = this.OKButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.Gainsboro;
+ this.CancelButton = this.CanButton;
+ this.ClientSize = new System.Drawing.Size(560, 317);
+ this.Controls.Add(this.BubbleCheckBox);
+ this.Controls.Add(this.OKButton);
+ this.Controls.Add(this.CanButton);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.numericUpDown1);
+ this.Controls.Add(this.RemoveLabel);
+ this.Controls.Add(this.passwordControl1);
+ this.Controls.Add(this.checkBox1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "SettingsDialog";
+ this.Text = "Settings";
+ ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.CheckBox checkBox1;
+ private PasswordControl passwordControl1;
+ private System.Windows.Forms.Label RemoveLabel;
+ private System.Windows.Forms.NumericUpDown numericUpDown1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button CanButton;
+ private System.Windows.Forms.Button OKButton;
+ private System.Windows.Forms.CheckBox BubbleCheckBox;
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/SettingsDialog.cs b/Duplicati/Scheduler/SettingsDialog.cs
new file mode 100644
index 000000000..f54e99b38
--- /dev/null
+++ b/Duplicati/Scheduler/SettingsDialog.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Edit settings
+ ///
+ public partial class SettingsDialog : Form
+ {
+ ///
+ /// Edited settings
+ ///
+ public Duplicati.Scheduler.Data.SchedulerDataSet.SettingsDataTable Settings { get; private set; }
+ ///
+ /// Edit Settings
+ ///
+ ///
+ /// Here a global password may be set. If set, User may use it for backups, or not as User is want.
+ /// The bubbles thing is not used now.
+ ///
+ /// Settings to edit
+ public SettingsDialog(Duplicati.Scheduler.Data.SchedulerDataSet.SettingsDataTable aSettings)
+ {
+ InitializeComponent();
+ Settings = aSettings;
+ this.checkBox1.Checked = Settings.UseGlobalPassword;
+ this.passwordControl1.CheckMod = Settings.Values.CheckMod;
+ this.passwordControl1.Checksum = Settings.Values.Checksum;
+ this.numericUpDown1.Value = (decimal)Settings.Values.LogFileAgeDays;
+ if (Settings.Values.IsShowBubblesNull()) Settings.Values.ShowBubbles = true;
+ this.BubbleCheckBox.Checked = Settings.Values.ShowBubbles;
+ }
+ ///
+ /// Let user know what zero means
+ ///
+ private void numericUpDown1_ValueChanged(object sender, EventArgs e)
+ {
+ this.RemoveLabel.Text = this.numericUpDown1.Value == 0 ? "Keep all log entries." : "Remove log entries older than";
+ }
+ ///
+ /// Pressed OK, update settings and close
+ ///
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ Settings.Values.CheckSrc = this.checkBox1.Checked;
+ Settings.Values.CheckMod = this.passwordControl1.CheckMod;
+ Settings.Values.Checksum = this.passwordControl1.Checksum;
+ Settings.Values.LogFileAgeDays = (int)this.numericUpDown1.Value;
+ Settings.Values.ShowBubbles = this.BubbleCheckBox.Checked;
+ ((Duplicati.Scheduler.Data.SchedulerDataSet)Settings.DataSet).Save();
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+ ///
+ /// Pressed CANCEL - close
+ ///
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+
+ private void checkBox1_CheckedChanged(object sender, EventArgs e)
+ {
+ this.passwordControl1.Enabled = this.checkBox1.Checked;
+ }
+ }
+}
diff --git a/Duplicati/Scheduler/SettingsDialog.resx b/Duplicati/Scheduler/SettingsDialog.resx
new file mode 100644
index 000000000..a3c9b8abc
--- /dev/null
+++ b/Duplicati/Scheduler/SettingsDialog.resx
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/TaskEditControl.Designer.cs b/Duplicati/Scheduler/TaskEditControl.Designer.cs
new file mode 100644
index 000000000..5957b0367
--- /dev/null
+++ b/Duplicati/Scheduler/TaskEditControl.Designer.cs
@@ -0,0 +1,629 @@
+namespace Duplicati.Scheduler
+{
+ partial class TaskEditControl
+ {
+ ///
+ /// 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(TaskEditControl));
+ this.EnableCheckBox = new System.Windows.Forms.CheckBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.BeginDateTimePicker = new System.Windows.Forms.DateTimePicker();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.PeriodTabControl = new System.Windows.Forms.TabControl();
+ this.TabOnce = new System.Windows.Forms.TabPage();
+ this.OnceMonthCalendar = new System.Windows.Forms.MonthCalendar();
+ this.label2 = new System.Windows.Forms.Label();
+ this.TabDaily = new System.Windows.Forms.TabPage();
+ this.label4 = new System.Windows.Forms.Label();
+ this.DailyNumericUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label3 = new System.Windows.Forms.Label();
+ this.TabWeekly = new System.Windows.Forms.TabPage();
+ this.WeeklyGroupBox = new System.Windows.Forms.GroupBox();
+ this.checkBox7 = new System.Windows.Forms.CheckBox();
+ this.checkBox6 = new System.Windows.Forms.CheckBox();
+ this.checkBox5 = new System.Windows.Forms.CheckBox();
+ this.checkBox4 = new System.Windows.Forms.CheckBox();
+ this.checkBox3 = new System.Windows.Forms.CheckBox();
+ this.checkBox2 = new System.Windows.Forms.CheckBox();
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.WeeksNumericUpDown = new System.Windows.Forms.NumericUpDown();
+ this.label11 = new System.Windows.Forms.Label();
+ this.label12 = new System.Windows.Forms.Label();
+ this.TabMonthly = new System.Windows.Forms.TabPage();
+ this.MonthlyOrGroupBox = new System.Windows.Forms.GroupBox();
+ this.MonthlyOrCheckBox = new System.Windows.Forms.CheckBox();
+ this.WhichComboBox = new System.Windows.Forms.ComboBox();
+ this.DaysGroupBox1 = new System.Windows.Forms.GroupBox();
+ this.checkBox9 = new System.Windows.Forms.CheckBox();
+ this.checkBox10 = new System.Windows.Forms.CheckBox();
+ this.checkBox11 = new System.Windows.Forms.CheckBox();
+ this.checkBox12 = new System.Windows.Forms.CheckBox();
+ this.checkBox13 = new System.Windows.Forms.CheckBox();
+ this.checkBox14 = new System.Windows.Forms.CheckBox();
+ this.checkBox15 = new System.Windows.Forms.CheckBox();
+ this.label5 = new System.Windows.Forms.Label();
+ this.MonthlyDaysPicker = new Utility.DayPicker();
+ this.TabPageImageList = new System.Windows.Forms.ImageList(this.components);
+ this.panel2.SuspendLayout();
+ this.PeriodTabControl.SuspendLayout();
+ this.TabOnce.SuspendLayout();
+ this.TabDaily.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.DailyNumericUpDown)).BeginInit();
+ this.TabWeekly.SuspendLayout();
+ this.WeeklyGroupBox.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.WeeksNumericUpDown)).BeginInit();
+ this.TabMonthly.SuspendLayout();
+ this.MonthlyOrGroupBox.SuspendLayout();
+ this.DaysGroupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // EnableCheckBox
+ //
+ this.EnableCheckBox.AutoSize = true;
+ this.EnableCheckBox.Checked = true;
+ this.EnableCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.EnableCheckBox.Location = new System.Drawing.Point(3, 6);
+ this.EnableCheckBox.Name = "EnableCheckBox";
+ this.EnableCheckBox.Size = new System.Drawing.Size(84, 23);
+ this.EnableCheckBox.TabIndex = 0;
+ this.EnableCheckBox.Text = "Enabled";
+ this.EnableCheckBox.UseVisualStyleBackColor = true;
+ //
+ // label1
+ //
+ this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(425, 7);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(95, 19);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Begin Time:";
+ //
+ // BeginDateTimePicker
+ //
+ this.BeginDateTimePicker.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.BeginDateTimePicker.CustomFormat = "hh:mm tt";
+ this.BeginDateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+ this.BeginDateTimePicker.Location = new System.Drawing.Point(522, 3);
+ this.BeginDateTimePicker.Name = "BeginDateTimePicker";
+ this.BeginDateTimePicker.ShowUpDown = true;
+ this.BeginDateTimePicker.Size = new System.Drawing.Size(93, 27);
+ this.BeginDateTimePicker.TabIndex = 2;
+ //
+ // panel2
+ //
+ this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel2.Controls.Add(this.EnableCheckBox);
+ this.panel2.Controls.Add(this.label1);
+ this.panel2.Controls.Add(this.BeginDateTimePicker);
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel2.Location = new System.Drawing.Point(0, 0);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(620, 36);
+ this.panel2.TabIndex = 0;
+ //
+ // PeriodTabControl
+ //
+ this.PeriodTabControl.Controls.Add(this.TabOnce);
+ this.PeriodTabControl.Controls.Add(this.TabDaily);
+ this.PeriodTabControl.Controls.Add(this.TabWeekly);
+ this.PeriodTabControl.Controls.Add(this.TabMonthly);
+ this.PeriodTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.PeriodTabControl.ImageList = this.TabPageImageList;
+ this.PeriodTabControl.ItemSize = new System.Drawing.Size(70, 30);
+ this.PeriodTabControl.Location = new System.Drawing.Point(0, 36);
+ this.PeriodTabControl.Name = "PeriodTabControl";
+ this.PeriodTabControl.Padding = new System.Drawing.Point(3, 3);
+ this.PeriodTabControl.SelectedIndex = 0;
+ this.PeriodTabControl.Size = new System.Drawing.Size(620, 344);
+ this.PeriodTabControl.TabIndex = 0;
+ this.PeriodTabControl.SelectedIndexChanged += new System.EventHandler(this.PeriodTabControl_SelectedIndexChanged);
+ //
+ // TabOnce
+ //
+ this.TabOnce.BackColor = System.Drawing.Color.Gainsboro;
+ this.TabOnce.Controls.Add(this.OnceMonthCalendar);
+ this.TabOnce.Controls.Add(this.label2);
+ this.TabOnce.ImageIndex = 1;
+ this.TabOnce.Location = new System.Drawing.Point(4, 34);
+ this.TabOnce.Name = "TabOnce";
+ this.TabOnce.Padding = new System.Windows.Forms.Padding(3);
+ this.TabOnce.Size = new System.Drawing.Size(612, 306);
+ this.TabOnce.TabIndex = 0;
+ this.TabOnce.Text = "Once";
+ this.TabOnce.UseVisualStyleBackColor = true;
+ //
+ // OnceMonthCalendar
+ //
+ this.OnceMonthCalendar.Location = new System.Drawing.Point(246, 66);
+ this.OnceMonthCalendar.Name = "OnceMonthCalendar";
+ this.OnceMonthCalendar.TabIndex = 1;
+ this.OnceMonthCalendar.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.OnceMonthCalendar_DateChanged);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(67, 66);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(167, 19);
+ this.label2.TabIndex = 0;
+ this.label2.Text = "Run job only once on:";
+ //
+ // TabDaily
+ //
+ this.TabDaily.BackColor = System.Drawing.Color.Gainsboro;
+ this.TabDaily.Controls.Add(this.label4);
+ this.TabDaily.Controls.Add(this.DailyNumericUpDown);
+ this.TabDaily.Controls.Add(this.label3);
+ this.TabDaily.ImageIndex = 0;
+ this.TabDaily.Location = new System.Drawing.Point(4, 34);
+ this.TabDaily.Name = "TabDaily";
+ this.TabDaily.Padding = new System.Windows.Forms.Padding(3);
+ this.TabDaily.Size = new System.Drawing.Size(612, 306);
+ this.TabDaily.TabIndex = 1;
+ this.TabDaily.Text = "Daily";
+ this.TabDaily.UseVisualStyleBackColor = true;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(359, 64);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(46, 19);
+ this.label4.TabIndex = 5;
+ this.label4.Text = "days.";
+ //
+ // DailyNumericUpDown
+ //
+ this.DailyNumericUpDown.Location = new System.Drawing.Point(270, 62);
+ this.DailyNumericUpDown.Name = "DailyNumericUpDown";
+ this.DailyNumericUpDown.Size = new System.Drawing.Size(73, 27);
+ this.DailyNumericUpDown.TabIndex = 4;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(67, 64);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(197, 19);
+ this.label3.TabIndex = 3;
+ this.label3.Text = "Set this job to recur every ";
+ //
+ // TabWeekly
+ //
+ this.TabWeekly.BackColor = System.Drawing.Color.Gainsboro;
+ this.TabWeekly.Controls.Add(this.WeeklyGroupBox);
+ this.TabWeekly.Controls.Add(this.WeeksNumericUpDown);
+ this.TabWeekly.Controls.Add(this.label11);
+ this.TabWeekly.Controls.Add(this.label12);
+ this.TabWeekly.ImageIndex = 0;
+ this.TabWeekly.Location = new System.Drawing.Point(4, 34);
+ this.TabWeekly.Name = "TabWeekly";
+ this.TabWeekly.Size = new System.Drawing.Size(612, 306);
+ this.TabWeekly.TabIndex = 2;
+ this.TabWeekly.Text = "Weekly";
+ this.TabWeekly.UseVisualStyleBackColor = true;
+ //
+ // WeeklyGroupBox
+ //
+ this.WeeklyGroupBox.Controls.Add(this.checkBox7);
+ this.WeeklyGroupBox.Controls.Add(this.checkBox6);
+ this.WeeklyGroupBox.Controls.Add(this.checkBox5);
+ this.WeeklyGroupBox.Controls.Add(this.checkBox4);
+ this.WeeklyGroupBox.Controls.Add(this.checkBox3);
+ this.WeeklyGroupBox.Controls.Add(this.checkBox2);
+ this.WeeklyGroupBox.Controls.Add(this.checkBox1);
+ this.WeeklyGroupBox.Location = new System.Drawing.Point(140, 113);
+ this.WeeklyGroupBox.Name = "WeeklyGroupBox";
+ this.WeeklyGroupBox.Size = new System.Drawing.Size(342, 74);
+ this.WeeklyGroupBox.TabIndex = 20;
+ this.WeeklyGroupBox.TabStop = false;
+ //
+ // checkBox7
+ //
+ this.checkBox7.AutoSize = true;
+ this.checkBox7.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox7.Location = new System.Drawing.Point(294, 20);
+ this.checkBox7.Name = "checkBox7";
+ this.checkBox7.Size = new System.Drawing.Size(35, 37);
+ this.checkBox7.TabIndex = 6;
+ this.checkBox7.Text = "Sat";
+ this.checkBox7.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox7.UseVisualStyleBackColor = true;
+ //
+ // checkBox6
+ //
+ this.checkBox6.AutoSize = true;
+ this.checkBox6.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox6.Location = new System.Drawing.Point(254, 20);
+ this.checkBox6.Name = "checkBox6";
+ this.checkBox6.Size = new System.Drawing.Size(31, 37);
+ this.checkBox6.TabIndex = 5;
+ this.checkBox6.Text = "Fri";
+ this.checkBox6.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox6.UseVisualStyleBackColor = true;
+ //
+ // checkBox5
+ //
+ this.checkBox5.AutoSize = true;
+ this.checkBox5.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox5.Location = new System.Drawing.Point(202, 20);
+ this.checkBox5.Name = "checkBox5";
+ this.checkBox5.Size = new System.Drawing.Size(41, 37);
+ this.checkBox5.TabIndex = 4;
+ this.checkBox5.Text = "Thu";
+ this.checkBox5.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox5.UseVisualStyleBackColor = true;
+ //
+ // checkBox4
+ //
+ this.checkBox4.AutoSize = true;
+ this.checkBox4.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox4.Location = new System.Drawing.Point(152, 20);
+ this.checkBox4.Name = "checkBox4";
+ this.checkBox4.Size = new System.Drawing.Size(44, 37);
+ this.checkBox4.TabIndex = 3;
+ this.checkBox4.Text = "Wed";
+ this.checkBox4.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox4.UseVisualStyleBackColor = true;
+ //
+ // checkBox3
+ //
+ this.checkBox3.AutoSize = true;
+ this.checkBox3.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox3.Location = new System.Drawing.Point(106, 20);
+ this.checkBox3.Name = "checkBox3";
+ this.checkBox3.Size = new System.Drawing.Size(40, 37);
+ this.checkBox3.TabIndex = 2;
+ this.checkBox3.Text = "Tue";
+ this.checkBox3.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox3.UseVisualStyleBackColor = true;
+ //
+ // checkBox2
+ //
+ this.checkBox2.AutoSize = true;
+ this.checkBox2.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox2.Checked = true;
+ this.checkBox2.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBox2.Location = new System.Drawing.Point(57, 20);
+ this.checkBox2.Name = "checkBox2";
+ this.checkBox2.Size = new System.Drawing.Size(43, 37);
+ this.checkBox2.TabIndex = 1;
+ this.checkBox2.Text = "Mon";
+ this.checkBox2.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox2.UseVisualStyleBackColor = true;
+ //
+ // checkBox1
+ //
+ this.checkBox1.AutoSize = true;
+ this.checkBox1.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox1.Location = new System.Drawing.Point(13, 20);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(40, 37);
+ this.checkBox1.TabIndex = 0;
+ this.checkBox1.Text = "Sun";
+ this.checkBox1.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox1.UseVisualStyleBackColor = true;
+ //
+ // WeeksNumericUpDown
+ //
+ this.WeeksNumericUpDown.Location = new System.Drawing.Point(171, 59);
+ this.WeeksNumericUpDown.Maximum = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ this.WeeksNumericUpDown.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.WeeksNumericUpDown.Name = "WeeksNumericUpDown";
+ this.WeeksNumericUpDown.Size = new System.Drawing.Size(53, 27);
+ this.WeeksNumericUpDown.TabIndex = 8;
+ this.WeeksNumericUpDown.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(242, 61);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(81, 19);
+ this.label11.TabIndex = 7;
+ this.label11.Text = "weeks on:";
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(67, 61);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(97, 19);
+ this.label12.TabIndex = 6;
+ this.label12.Text = "Recur every ";
+ //
+ // TabMonthly
+ //
+ this.TabMonthly.BackColor = System.Drawing.Color.Gainsboro;
+ this.TabMonthly.Controls.Add(this.MonthlyOrGroupBox);
+ this.TabMonthly.Controls.Add(this.label5);
+ this.TabMonthly.Controls.Add(this.MonthlyDaysPicker);
+ this.TabMonthly.ImageIndex = 0;
+ this.TabMonthly.Location = new System.Drawing.Point(4, 34);
+ this.TabMonthly.Name = "TabMonthly";
+ this.TabMonthly.Size = new System.Drawing.Size(612, 306);
+ this.TabMonthly.TabIndex = 3;
+ this.TabMonthly.Text = "Monthly";
+ this.TabMonthly.UseVisualStyleBackColor = true;
+ //
+ // MonthlyOrGroupBox
+ //
+ this.MonthlyOrGroupBox.Controls.Add(this.MonthlyOrCheckBox);
+ this.MonthlyOrGroupBox.Controls.Add(this.WhichComboBox);
+ this.MonthlyOrGroupBox.Controls.Add(this.DaysGroupBox1);
+ this.MonthlyOrGroupBox.Enabled = false;
+ this.MonthlyOrGroupBox.Location = new System.Drawing.Point(328, 40);
+ this.MonthlyOrGroupBox.Name = "MonthlyOrGroupBox";
+ this.MonthlyOrGroupBox.Size = new System.Drawing.Size(273, 228);
+ this.MonthlyOrGroupBox.TabIndex = 3;
+ this.MonthlyOrGroupBox.TabStop = false;
+ this.MonthlyOrGroupBox.EnabledChanged += new System.EventHandler(this.MonthlyOrGroupBox_EnabledChanged);
+ //
+ // MonthlyOrCheckBox
+ //
+ this.MonthlyOrCheckBox.AutoSize = true;
+ this.MonthlyOrCheckBox.Location = new System.Drawing.Point(6, -1);
+ this.MonthlyOrCheckBox.Name = "MonthlyOrCheckBox";
+ this.MonthlyOrCheckBox.Size = new System.Drawing.Size(149, 23);
+ this.MonthlyOrCheckBox.TabIndex = 23;
+ this.MonthlyOrCheckBox.Text = "or run job every:";
+ this.MonthlyOrCheckBox.UseVisualStyleBackColor = true;
+ this.MonthlyOrCheckBox.CheckedChanged += new System.EventHandler(this.MonthlyOrCheckBox_CheckedChanged);
+ //
+ // WhichComboBox
+ //
+ this.WhichComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.WhichComboBox.FormattingEnabled = true;
+ this.WhichComboBox.Items.AddRange(new object[] {
+ "First",
+ "Second",
+ "Third",
+ "Last"});
+ this.WhichComboBox.Location = new System.Drawing.Point(6, 50);
+ this.WhichComboBox.Name = "WhichComboBox";
+ this.WhichComboBox.Size = new System.Drawing.Size(111, 27);
+ this.WhichComboBox.TabIndex = 22;
+ //
+ // DaysGroupBox1
+ //
+ this.DaysGroupBox1.Controls.Add(this.checkBox9);
+ this.DaysGroupBox1.Controls.Add(this.checkBox10);
+ this.DaysGroupBox1.Controls.Add(this.checkBox11);
+ this.DaysGroupBox1.Controls.Add(this.checkBox12);
+ this.DaysGroupBox1.Controls.Add(this.checkBox13);
+ this.DaysGroupBox1.Controls.Add(this.checkBox14);
+ this.DaysGroupBox1.Controls.Add(this.checkBox15);
+ this.DaysGroupBox1.Location = new System.Drawing.Point(6, 77);
+ this.DaysGroupBox1.Name = "DaysGroupBox1";
+ this.DaysGroupBox1.Size = new System.Drawing.Size(261, 119);
+ this.DaysGroupBox1.TabIndex = 20;
+ this.DaysGroupBox1.TabStop = false;
+ //
+ // checkBox9
+ //
+ this.checkBox9.AutoSize = true;
+ this.checkBox9.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox9.Location = new System.Drawing.Point(119, 64);
+ this.checkBox9.Name = "checkBox9";
+ this.checkBox9.Size = new System.Drawing.Size(35, 37);
+ this.checkBox9.TabIndex = 6;
+ this.checkBox9.Text = "Sat";
+ this.checkBox9.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox9.UseVisualStyleBackColor = true;
+ //
+ // checkBox10
+ //
+ this.checkBox10.AutoSize = true;
+ this.checkBox10.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox10.Location = new System.Drawing.Point(68, 64);
+ this.checkBox10.Name = "checkBox10";
+ this.checkBox10.Size = new System.Drawing.Size(31, 37);
+ this.checkBox10.TabIndex = 5;
+ this.checkBox10.Text = "Fri";
+ this.checkBox10.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox10.UseVisualStyleBackColor = true;
+ //
+ // checkBox11
+ //
+ this.checkBox11.AutoSize = true;
+ this.checkBox11.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox11.Location = new System.Drawing.Point(17, 64);
+ this.checkBox11.Name = "checkBox11";
+ this.checkBox11.Size = new System.Drawing.Size(41, 37);
+ this.checkBox11.TabIndex = 4;
+ this.checkBox11.Text = "Thu";
+ this.checkBox11.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox11.UseVisualStyleBackColor = true;
+ //
+ // checkBox12
+ //
+ this.checkBox12.AutoSize = true;
+ this.checkBox12.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox12.Location = new System.Drawing.Point(165, 22);
+ this.checkBox12.Name = "checkBox12";
+ this.checkBox12.Size = new System.Drawing.Size(44, 37);
+ this.checkBox12.TabIndex = 3;
+ this.checkBox12.Text = "Wed";
+ this.checkBox12.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox12.UseVisualStyleBackColor = true;
+ //
+ // checkBox13
+ //
+ this.checkBox13.AutoSize = true;
+ this.checkBox13.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox13.Location = new System.Drawing.Point(119, 22);
+ this.checkBox13.Name = "checkBox13";
+ this.checkBox13.Size = new System.Drawing.Size(40, 37);
+ this.checkBox13.TabIndex = 2;
+ this.checkBox13.Text = "Tue";
+ this.checkBox13.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox13.UseVisualStyleBackColor = true;
+ //
+ // checkBox14
+ //
+ this.checkBox14.AutoSize = true;
+ this.checkBox14.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox14.Checked = true;
+ this.checkBox14.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.checkBox14.Location = new System.Drawing.Point(68, 22);
+ this.checkBox14.Name = "checkBox14";
+ this.checkBox14.Size = new System.Drawing.Size(43, 37);
+ this.checkBox14.TabIndex = 1;
+ this.checkBox14.Text = "Mon";
+ this.checkBox14.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox14.UseVisualStyleBackColor = true;
+ //
+ // checkBox15
+ //
+ this.checkBox15.AutoSize = true;
+ this.checkBox15.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.checkBox15.Location = new System.Drawing.Point(17, 22);
+ this.checkBox15.Name = "checkBox15";
+ this.checkBox15.Size = new System.Drawing.Size(40, 37);
+ this.checkBox15.TabIndex = 0;
+ this.checkBox15.Text = "Sun";
+ this.checkBox15.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.checkBox15.UseVisualStyleBackColor = true;
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(3, 22);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(239, 19);
+ this.label5.TabIndex = 0;
+ this.label5.Text = "Run every month on these days:";
+ //
+ // MonthlyDaysPicker
+ //
+ this.MonthlyDaysPicker.DaysPicked = new int[0];
+ this.MonthlyDaysPicker.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MonthlyDaysPicker.Last = false;
+ this.MonthlyDaysPicker.Location = new System.Drawing.Point(3, 44);
+ this.MonthlyDaysPicker.MinimumSize = new System.Drawing.Size(200, 200);
+ this.MonthlyDaysPicker.Name = "MonthlyDaysPicker";
+ this.MonthlyDaysPicker.Size = new System.Drawing.Size(310, 224);
+ this.MonthlyDaysPicker.TabIndex = 1;
+ //
+ // TabPageImageList
+ //
+ this.TabPageImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("TabPageImageList.ImageStream")));
+ this.TabPageImageList.TransparentColor = System.Drawing.Color.Transparent;
+ this.TabPageImageList.Images.SetKeyName(0, "checkbox_unchecked.png");
+ this.TabPageImageList.Images.SetKeyName(1, "checkbox_checked.png");
+ //
+ // TaskEditControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.PeriodTabControl);
+ this.Controls.Add(this.panel2);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.Name = "TaskEditControl";
+ this.Size = new System.Drawing.Size(620, 380);
+ this.panel2.ResumeLayout(false);
+ this.panel2.PerformLayout();
+ this.PeriodTabControl.ResumeLayout(false);
+ this.TabOnce.ResumeLayout(false);
+ this.TabOnce.PerformLayout();
+ this.TabDaily.ResumeLayout(false);
+ this.TabDaily.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.DailyNumericUpDown)).EndInit();
+ this.TabWeekly.ResumeLayout(false);
+ this.TabWeekly.PerformLayout();
+ this.WeeklyGroupBox.ResumeLayout(false);
+ this.WeeklyGroupBox.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.WeeksNumericUpDown)).EndInit();
+ this.TabMonthly.ResumeLayout(false);
+ this.TabMonthly.PerformLayout();
+ this.MonthlyOrGroupBox.ResumeLayout(false);
+ this.MonthlyOrGroupBox.PerformLayout();
+ this.DaysGroupBox1.ResumeLayout(false);
+ this.DaysGroupBox1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DateTimePicker BeginDateTimePicker;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.CheckBox EnableCheckBox;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.TabControl PeriodTabControl;
+ private System.Windows.Forms.TabPage TabOnce;
+ private System.Windows.Forms.TabPage TabDaily;
+ private System.Windows.Forms.TabPage TabWeekly;
+ private System.Windows.Forms.TabPage TabMonthly;
+ private System.Windows.Forms.MonthCalendar OnceMonthCalendar;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.NumericUpDown DailyNumericUpDown;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.NumericUpDown WeeksNumericUpDown;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.GroupBox WeeklyGroupBox;
+ private System.Windows.Forms.CheckBox checkBox7;
+ private System.Windows.Forms.CheckBox checkBox6;
+ private System.Windows.Forms.CheckBox checkBox5;
+ private System.Windows.Forms.CheckBox checkBox4;
+ private System.Windows.Forms.CheckBox checkBox3;
+ private System.Windows.Forms.CheckBox checkBox2;
+ private System.Windows.Forms.CheckBox checkBox1;
+ private System.Windows.Forms.Label label5;
+ private Utility.DayPicker MonthlyDaysPicker;
+ private System.Windows.Forms.GroupBox MonthlyOrGroupBox;
+ private System.Windows.Forms.GroupBox DaysGroupBox1;
+ private System.Windows.Forms.CheckBox checkBox9;
+ private System.Windows.Forms.CheckBox checkBox10;
+ private System.Windows.Forms.CheckBox checkBox11;
+ private System.Windows.Forms.CheckBox checkBox12;
+ private System.Windows.Forms.CheckBox checkBox13;
+ private System.Windows.Forms.CheckBox checkBox14;
+ private System.Windows.Forms.CheckBox checkBox15;
+ private System.Windows.Forms.ComboBox WhichComboBox;
+ private System.Windows.Forms.CheckBox MonthlyOrCheckBox;
+ private System.Windows.Forms.ImageList TabPageImageList;
+
+ }
+}
diff --git a/Duplicati/Scheduler/TaskEditControl.cs b/Duplicati/Scheduler/TaskEditControl.cs
new file mode 100644
index 000000000..f3310ae86
--- /dev/null
+++ b/Duplicati/Scheduler/TaskEditControl.cs
@@ -0,0 +1,269 @@
+using System;
+using System.Windows.Forms;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Edit a task for the task scheduler
+ ///
+ ///
+ /// Actually edit a trigger:
+ /// Each Job gets a Task Scheduler Trigger that is stored in the Task Scheduler database.
+ /// It can be retrieved using: TaskScheduler.GetTrigger(JobRow.TaskName);
+ /// The TaskName is: "DUP." + aName + '.' + UserName.Replace('\\', '.')
+ /// If this is a new job, call SetTrigger with null and the user can make a new one.
+ ///
+ public partial class TaskEditControl : UserControl
+ {
+ ///
+ /// Edit a task for the task scheduler
+ ///
+ public TaskEditControl()
+ {
+ InitializeComponent();
+ if (this.DesignMode) return;
+ this.WhichComboBox.SelectedIndex = 0; // Can't select default in designer FSR
+ AbleMonthlyOrGroupBox(false);
+ this.OnceMonthCalendar.MinDate = DateTime.Now.Date;
+ this.MonthlyDaysPicker.DaysPicked = new int[] { 1 };
+ this.OnceMonthCalendar.MaxDate = this.OnceMonthCalendar.MinDate.AddYears(1); // That's enuf
+ foreach (TabPage P in this.PeriodTabControl.TabPages)
+ P.BackColor = this.BackColor;
+ }
+ ///
+ /// Retrieves the edited task scheduler trigger
+ ///
+ ///
+ public Microsoft.Win32.TaskScheduler.Trigger GetTrigger()
+ {
+ Microsoft.Win32.TaskScheduler.Trigger Result = null;
+ DateTime StartBoundary = this.BeginDateTimePicker.Value;
+ // The trigger type depends on the selected tab
+ if (this.PeriodTabControl.SelectedTab.Equals(this.TabOnce))
+ {
+ Result = new Microsoft.Win32.TaskScheduler.TimeTrigger();
+ StartBoundary = this.OnceMonthCalendar.SelectionStart.Date + this.BeginDateTimePicker.Value.TimeOfDay;
+ }
+ else if (this.PeriodTabControl.SelectedTab.Equals(this.TabDaily))
+ Result = new Microsoft.Win32.TaskScheduler.DailyTrigger((short)this.DailyNumericUpDown.Value);
+ else if (this.PeriodTabControl.SelectedTab.Equals(this.TabWeekly))
+ Result = new Microsoft.Win32.TaskScheduler.WeeklyTrigger(GetDayOfWeek(this.WeeklyGroupBox), (short)this.WeeksNumericUpDown.Value);
+ else if (this.PeriodTabControl.SelectedTab.Equals(this.TabMonthly) && this.MonthlyOrCheckBox.Checked)
+ Result = new Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger(GetDayOfWeek(this.DaysGroupBox1), Microsoft.Win32.TaskScheduler.MonthsOfTheYear.AllMonths, GetWhich());
+ else if (this.PeriodTabControl.SelectedTab.Equals(this.TabMonthly))
+ Result = new Microsoft.Win32.TaskScheduler.MonthlyTrigger(1, Microsoft.Win32.TaskScheduler.MonthsOfTheYear.AllMonths) { DaysOfMonth = this.MonthlyDaysPicker.DaysPicked1IfEmpty, };
+ else
+ return null;
+
+ Result.Enabled = this.EnableCheckBox.Checked;
+ Result.StartBoundary = StartBoundary;
+
+ return Result;
+ }
+ ///
+ /// Convert a Trigger to XML
+ ///
+ /// Trigger to convert
+ /// XML text
+ public static string TriggerToXml( Microsoft.Win32.TaskScheduler.Trigger aTrigger )
+ {
+ if (aTrigger is Microsoft.Win32.TaskScheduler.TimeTrigger)
+ {
+ return new System.Xml.Linq.XElement("Trigger",
+ new System.Xml.Linq.XAttribute("Type", "TimeTrigger"),
+ new System.Xml.Linq.XElement("StartBoundary",
+ ((Microsoft.Win32.TaskScheduler.TimeTrigger)aTrigger).StartBoundary.ToString("o"))).ToString();
+ }
+ if (aTrigger is Microsoft.Win32.TaskScheduler.DailyTrigger)
+ {
+ Microsoft.Win32.TaskScheduler.DailyTrigger t = (Microsoft.Win32.TaskScheduler.DailyTrigger)aTrigger;
+ return new System.Xml.Linq.XElement("Trigger",
+ new System.Xml.Linq.XAttribute("Type", "DailyTrigger"),
+ new System.Xml.Linq.XElement("Enabled", t.Enabled),
+ new System.Xml.Linq.XElement("StartBoundary", t.StartBoundary.ToString("o")),
+ new System.Xml.Linq.XElement("DaysInterval", t.DaysInterval)).ToString();
+ }
+ if (aTrigger is Microsoft.Win32.TaskScheduler.WeeklyTrigger)
+ {
+ Microsoft.Win32.TaskScheduler.WeeklyTrigger t = (Microsoft.Win32.TaskScheduler.WeeklyTrigger)aTrigger;
+ return new System.Xml.Linq.XElement("Trigger",
+ new System.Xml.Linq.XAttribute("Type", "WeeklyTrigger"),
+ new System.Xml.Linq.XElement("Enabled", t.Enabled),
+ new System.Xml.Linq.XElement("StartBoundary", t.StartBoundary.ToString("o")),
+ new System.Xml.Linq.XElement("DaysOfWeek", t.DaysOfWeek),
+ new System.Xml.Linq.XElement("WeeksInterval", t.WeeksInterval)
+ ).ToString();
+ }
+ if (aTrigger is Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger)
+ {
+ Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger t = (Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger)aTrigger;
+ return new System.Xml.Linq.XElement("Trigger",
+ new System.Xml.Linq.XAttribute("Type", "MonthlyDOWTrigger"),
+ new System.Xml.Linq.XElement("Enabled", t.Enabled),
+ new System.Xml.Linq.XElement("StartBoundary", t.StartBoundary.ToString("o")),
+ new System.Xml.Linq.XElement("DaysOfWeek", t.DaysOfWeek),
+ new System.Xml.Linq.XElement("MonthsOfYear", t.MonthsOfYear),
+ new System.Xml.Linq.XElement("WeeksOfMonth", t.WeeksOfMonth)
+ ).ToString();
+ }
+ if (aTrigger is Microsoft.Win32.TaskScheduler.MonthlyTrigger)
+ {
+ Microsoft.Win32.TaskScheduler.MonthlyTrigger t = (Microsoft.Win32.TaskScheduler.MonthlyTrigger)aTrigger;
+ return new System.Xml.Linq.XElement("Trigger",
+ new System.Xml.Linq.XAttribute("Type", "MonthlyTrigger"),
+ new System.Xml.Linq.XElement("Enabled", t.Enabled),
+ new System.Xml.Linq.XElement("StartBoundary", t.StartBoundary.ToString("o")),
+ new System.Xml.Linq.XElement("DayOfMonth", 1),
+ new System.Xml.Linq.XElement("MonthsOfYear", t.MonthsOfYear)
+ ).ToString();
+ }
+ return string.Empty;
+ }
+ ///
+ /// Sets the trigger to edit
+ ///
+ /// Trigger to edit or null for a new one
+ public void SetTrigger(Microsoft.Win32.TaskScheduler.Trigger aTrigger)
+ {
+ if (aTrigger == null) // Ahh, Make a new one, default to monthly
+ {
+ this.EnableCheckBox.Checked = true;
+ DateTime Now = DateTime.Now.AddMinutes(15);
+ this.OnceMonthCalendar.MinDate = Now.Date;
+ this.OnceMonthCalendar.SelectionStart = this.BeginDateTimePicker.Value = Now.Date.AddHours(Now.Hour + 1); // Set to next hour...
+ this.PeriodTabControl.SelectedTab = this.TabMonthly;
+ this.MonthlyOrCheckBox.Checked = false;
+ this.MonthlyDaysPicker.DaysPicked = new int[] { 1 };
+ return;
+ }
+ // Set the forms based on the type of trigger
+ this.EnableCheckBox.Checked = aTrigger.Enabled;
+ this.BeginDateTimePicker.Value = aTrigger.StartBoundary;
+ if (aTrigger is Microsoft.Win32.TaskScheduler.TimeTrigger)
+ {
+ this.PeriodTabControl.SelectedTab = this.TabOnce;
+ }
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.DailyTrigger)
+ {
+ this.PeriodTabControl.SelectedTab = this.TabDaily;
+ Microsoft.Win32.TaskScheduler.DailyTrigger dt = (Microsoft.Win32.TaskScheduler.DailyTrigger)aTrigger;
+ this.DailyNumericUpDown.Value = (decimal)dt.DaysInterval;
+ }
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.WeeklyTrigger)
+ {
+ this.PeriodTabControl.SelectedTab = this.TabWeekly;
+ Microsoft.Win32.TaskScheduler.WeeklyTrigger wt = (Microsoft.Win32.TaskScheduler.WeeklyTrigger)aTrigger;
+ SetDayOfWeek(this.WeeklyGroupBox, wt.DaysOfWeek);
+ this.WeeksNumericUpDown.Value = (decimal)wt.WeeksInterval;
+ }
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.MonthlyTrigger)
+ {
+ this.PeriodTabControl.SelectedTab = this.TabMonthly;
+ this.MonthlyOrCheckBox.Checked = false;
+ Microsoft.Win32.TaskScheduler.MonthlyTrigger mt = (Microsoft.Win32.TaskScheduler.MonthlyTrigger)aTrigger;
+ this.MonthlyDaysPicker.DaysPicked = mt.DaysOfMonth;
+ }
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger)
+ {
+ this.PeriodTabControl.SelectedTab = this.TabMonthly;
+ this.MonthlyOrCheckBox.Checked = true;
+ Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger mt = (Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger)aTrigger;
+ SetWhich(mt.WeeksOfMonth);
+ }
+ PeriodTabControl_SelectedIndexChanged(null, null); // In case it didnt change...
+ }
+ ///
+ /// Converts a short day name to a Task Scheduler DaysOfWeek
+ ///
+ /// a short day name, i.e. Mon
+ /// TaskScheduler.DaysOfTheWeek
+ private Microsoft.Win32.TaskScheduler.DaysOfTheWeek ToDaysOfWeek(string aShortDay)
+ {
+ return (Microsoft.Win32.TaskScheduler.DaysOfTheWeek)
+ (1 << Array.IndexOf(System.Globalization.DateTimeFormatInfo.InvariantInfo.AbbreviatedDayNames, aShortDay));
+ }
+ ///
+ /// Get day from GroupBox
+ ///
+ /// Box to fetch from
+ /// TaskScheduler.DaysOfTheWeek
+ private Microsoft.Win32.TaskScheduler.DaysOfTheWeek GetDayOfWeek(GroupBox aDOWBox)
+ {
+ short Result = 0;
+ foreach (Control C in aDOWBox.Controls)
+ if (C is CheckBox && ((CheckBox)C).Checked)
+ Result |= (short)ToDaysOfWeek(C.Text);
+ return (Microsoft.Win32.TaskScheduler.DaysOfTheWeek)Result;
+ }
+ ///
+ /// Set day in groupbox to TaskScheduler.DaysOfTheWeek
+ ///
+ /// Days group box
+ /// TaskScheduler.DaysOfTheWeek
+ private void SetDayOfWeek(GroupBox aDOWBox, Microsoft.Win32.TaskScheduler.DaysOfTheWeek aDOW)
+ {
+ foreach (Control C in aDOWBox.Controls)
+ ((CheckBox)C).Checked = (aDOW & ToDaysOfWeek( C.Text )) != 0;
+ }
+ ///
+ /// Get TaskScheduler.WhichWeek from ComboBox
+ ///
+ /// TaskScheduler.WhichWeek
+ private Microsoft.Win32.TaskScheduler.WhichWeek GetWhich()
+ {
+ return (Microsoft.Win32.TaskScheduler.WhichWeek)System.Enum.Parse(typeof(Microsoft.Win32.TaskScheduler.WhichWeek),
+ (string)this.WhichComboBox.SelectedItem+"Week");
+ }
+ ///
+ /// Sets ComboBox to TaskScheduler.WhichWeek
+ ///
+ /// TaskScheduler.WhichWeek
+ private void SetWhich(Microsoft.Win32.TaskScheduler.WhichWeek aWitch)
+ {
+ this.WhichComboBox.SelectedItem = aWitch.ToString().Replace("Week", string.Empty);
+ }
+ ///
+ /// User checked 'which' box,
+ ///
+ private void MonthlyOrCheckBox_CheckedChanged(object sender, EventArgs e)
+ {
+ AbleMonthlyOrGroupBox(this.MonthlyOrCheckBox.Checked);
+ this.MonthlyDaysPicker.Enabled = !this.MonthlyOrCheckBox.Checked;
+ }
+ ///
+ /// Go through all this to keep the checkbox enabled
+ ///
+ private void MonthlyOrGroupBox_EnabledChanged(object sender, EventArgs e)
+ {
+ if (!this.MonthlyOrGroupBox.Enabled)
+ AbleMonthlyOrGroupBox(false);
+ }
+ ///
+ /// Go through all this to keep the checkbox enabled
+ ///
+ private void AbleMonthlyOrGroupBox(bool aEnable)
+ {
+ this.MonthlyOrGroupBox.Enabled = true;
+ foreach (Control C in this.MonthlyOrGroupBox.Controls)
+ if (!C.Equals(this.MonthlyOrCheckBox)) C.Enabled = aEnable;
+ }
+ ///
+ /// Keep calendar in the future
+ ///
+ private void OnceMonthCalendar_DateChanged(object sender, DateRangeEventArgs e)
+ {
+ if(this.OnceMonthCalendar.SelectionStart.Date < DateTime.Now.Date)
+ this.OnceMonthCalendar.SelectionStart = DateTime.Now.Date;
+ this.OnceMonthCalendar.MinDate = DateTime.Now.Date;
+ this.BeginDateTimePicker.Value = this.OnceMonthCalendar.SelectionStart.Date + this.BeginDateTimePicker.Value.TimeOfDay;
+ }
+ ///
+ /// Checks/Unchecks the tab control's tab images
+ ///
+ private void PeriodTabControl_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ foreach(TabPage P in this.PeriodTabControl.TabPages)
+ P.ImageIndex = P.Equals(this.PeriodTabControl.SelectedTab) ? 1 : 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Duplicati/Scheduler/TaskEditControl.resx b/Duplicati/Scheduler/TaskEditControl.resx
new file mode 100644
index 000000000..e16ed6405
--- /dev/null
+++ b/Duplicati/Scheduler/TaskEditControl.resx
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADS
+ CAAAAk1TRnQBSQFMAgEBAgEAASABAAEgAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+ AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+ AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+ AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+ AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+ AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+ ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+ AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+ AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+ AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+ AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+ AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+ AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+ AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+ AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+ ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+ Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+ AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+ AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+ AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+ ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+ Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+ AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+ AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+ AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+ AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+ AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+ AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAC+oFAAXqAW0F6iUA
+ AeoBvAj/AeoFAAHqAbwD/wH0BP8B6iUAAeoBvAj/AeoFAAHqAbwC/wHzAS4BlwP/AeolAAHqAbwI/wHq
+ BQAB6gG8Av8BVwIuAZgC/wHqJQAB6gG8CP8B6gUAAeoBvAH/AfMBLwIuAVAC/wHqJQAB6gG8CP8B6gUA
+ AeoBvAH/AVcCLwIuAZkB/wHqJQAB6gG8CP8B6gUAAW0B8gEIBC8BLgFQAfYBbSUAAeoBvAj/AeoFAAH3
+ AQgBNQIvAZkBCAIvAXgB7yUAAeoBvAj/AeoFAAGSAQgCNQFXAfYB/wF4Ai8B8AH0JAAB6gG8CPQB6gUA
+ AW0B8QEbAQgD9AH/AXgBLwFQAfQB/yMAAeoJ7wHqBQAB6gHvAgcD7wEHAfMBeAEvAVcB9AH/IgAL6gUA
+ COoB6wHxAXgBLwF4Av85AAL/AfQBmAEvAXgC/zoAAf8B9AGZAS8BVwH0OwAB/wH0AfMBeAH0PQAB/wH0
+ Af8gAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/AgABHwEAAR8FAAEfAQABHwUA
+ AR8BAAEfBQABHwEAAR8FAAEfAQABHwUAAR8BAAEfBQABHwEAAR8FAAEfAQABHwUAAR8BAAEPBQABHwEA
+ AQcFAAEfAQABAwUAAR8BAAEBBAAD/wUAA/8BwAQAA/8B4AQAA/8B+AQACw==
+
+
+
\ No newline at end of file
diff --git a/Duplicati/Scheduler/TaskScheduler.cs b/Duplicati/Scheduler/TaskScheduler.cs
new file mode 100644
index 000000000..328b70ac7
--- /dev/null
+++ b/Duplicati/Scheduler/TaskScheduler.cs
@@ -0,0 +1,210 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Duplicati.Scheduler
+{
+ ///
+ /// Interface to the Task Scheduler
+ ///
+ public static class TaskScheduler
+ {
+ ///
+ /// Does a taskname exist?
+ ///
+ /// Task Name
+ /// True if existing
+ public static bool Exists(string aName)
+ {
+ bool Result = false;
+ // Get the service on the local machine
+ using (Microsoft.Win32.TaskScheduler.TaskService ts = new Microsoft.Win32.TaskScheduler.TaskService())
+ Result = ts.GetTask(aName) != null;
+ return Result;
+ }
+ ///
+ /// Returns a trigger given Task Name
+ ///
+ /// Task Name
+ /// Trigger or null
+ public static Microsoft.Win32.TaskScheduler.Trigger GetTrigger(string aName)
+ {
+ Microsoft.Win32.TaskScheduler.Trigger Result = null;
+ using (Microsoft.Win32.TaskScheduler.TaskService ts = new Microsoft.Win32.TaskScheduler.TaskService())
+ using( Microsoft.Win32.TaskScheduler.Task Task = ts.GetTask(aName) )
+ {
+ if (Task != null)
+ {
+ if (Task.Definition.Triggers.Count > 0)
+ Result = Task.Definition.Triggers[0]; // We only use one trigger...
+ }
+ }
+ return Result;
+ }
+ ///
+ /// Set a trigger
+ ///
+ /// Task Name
+ /// Trigger to set
+ /// True if all OK
+ public static bool SetTrigger(string aName, Microsoft.Win32.TaskScheduler.Trigger aTrigger)
+ {
+ bool Result = false;
+ using (Microsoft.Win32.TaskScheduler.TaskService ts = new Microsoft.Win32.TaskScheduler.TaskService())
+ using (Microsoft.Win32.TaskScheduler.Task Task = ts.GetTask(aName))
+ {
+ if (Task != null)
+ {
+ if (Task.Definition.Triggers.Count > 0)
+ Task.Definition.Triggers[0] = aTrigger; // We only use one trigger...
+ else
+ Task.Definition.Triggers.Add(aTrigger);
+ Result = true;
+ }
+ }
+ return Result;
+ }
+ ///
+ /// Updates a task, or creates it if not existing
+ ///
+ /// Task Name
+ /// Action to run
+ /// Plain text
+ /// Domain/User
+ /// Secure password
+ /// Trigger to use
+ /// Arguments to Action
+ public static void CreateOrUpdateTask(string aName, string aTask, string aDescription, string aUserName,
+ System.Security.SecureString aPassword,
+ Microsoft.Win32.TaskScheduler.Trigger aTrigger, string aArgument)
+ {
+ // Get the service on the local machine
+ using (Microsoft.Win32.TaskScheduler.TaskService ts = new Microsoft.Win32.TaskScheduler.TaskService())
+ {
+ // Create a new task definition and assign properties
+ Microsoft.Win32.TaskScheduler.TaskDefinition td = ts.NewTask();
+ td.RegistrationInfo.Description = aDescription;
+ td.RegistrationInfo.Author = "Duplicati Scheduler";
+
+ // Create a trigger that will fire the task
+ td.Triggers.Add(aTrigger);
+ td.Settings.WakeToRun = true;
+
+ // Create an action that will launch the task whenever the trigger fires
+ td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(aTask, aArgument, null));
+ if (ts.HighestSupportedVersion > new Version(1, 2))
+ {
+ td.Principal.LogonType = Microsoft.Win32.TaskScheduler.TaskLogonType.Password;
+ td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.LUA;
+ }
+
+ // Register the task in the root folder
+ string contents = null;
+ if (aPassword != null)
+ {
+ IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aPassword);
+ contents = System.Runtime.InteropServices.Marshal.PtrToStringAuto(ptr);
+ }
+ ts.RootFolder.RegisterTaskDefinition(aName, td, Microsoft.Win32.TaskScheduler.TaskCreation.CreateOrUpdate,
+ aUserName, contents, Microsoft.Win32.TaskScheduler.TaskLogonType.Password, null);
+ }
+ }
+ ///
+ /// Add a startup task (not used)
+ ///
+ /// Task Name
+ /// Action to run
+ /// Plain text
+ /// Domain/User
+ /// Secure password
+ public static void AddStartup(string aName, string aTask, string aDescription, string aUserName, System.Security.SecureString aPassword)
+ {
+ // Get the service on the local machine
+ using (Microsoft.Win32.TaskScheduler.TaskService ts = new Microsoft.Win32.TaskScheduler.TaskService())
+ {
+ // Create a new task definition and assign properties
+ Microsoft.Win32.TaskScheduler.TaskDefinition td = ts.NewTask();
+ td.RegistrationInfo.Description = aDescription;
+
+ // Create a trigger that will fire the task at boot
+ td.Triggers.Add(new Microsoft.Win32.TaskScheduler.BootTrigger());
+
+ // Create an action that will launch the task whenever the trigger fires
+ td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(aTask, null, null));
+ td.Principal.LogonType = Microsoft.Win32.TaskScheduler.TaskLogonType.Password;
+ td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest;
+
+ // Register the task in the root folder
+ ts.RootFolder.RegisterTaskDefinition(aName, td, Microsoft.Win32.TaskScheduler.TaskCreation.Create, aUserName,
+ System.Runtime.InteropServices.Marshal.PtrToStringAuto(System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aPassword)),
+ Microsoft.Win32.TaskScheduler.TaskLogonType.Password, null);
+ }
+ }
+ ///
+ /// Put up the official credentials dialog
+ ///
+ /// Mom
+ /// Task name
+ /// What to say
+ /// User name to show
+ /// Entered password
+ /// Dialog Result
+ public static System.Windows.Forms.DialogResult InvokeCredentialDialog(System.Windows.Forms.Form aParentForm,
+ string aTaskSchedulerName, string aCredentialPromptMessage, string aUserName, out System.Security.SecureString outPass)
+ {
+ outPass = null;
+ System.Windows.Forms.DialogResult Result = System.Windows.Forms.DialogResult.None;
+ using (Microsoft.Win32.TaskScheduler.CredentialsDialog dlg = new Microsoft.Win32.TaskScheduler.CredentialsDialog(
+ aTaskSchedulerName, aCredentialPromptMessage, aUserName))
+ {
+ dlg.Options |= Microsoft.Win32.TaskScheduler.CredentialsDialogOptions.Persist;
+ dlg.EncryptPassword = true;
+ Result = dlg.ShowDialog(aParentForm);
+ outPass = dlg.SecurePassword;
+ }
+ return Result;
+ }
+ ///
+ /// Returns if enabled
+ ///
+ /// Task Name
+ /// true if enabled
+ public static bool Enabled(string aName)
+ {
+ Microsoft.Win32.TaskScheduler.Trigger t = GetTrigger(aName);
+ return t!=null && t.Enabled;
+ }
+ ///
+ /// Return a text description of the trigger
+ ///
+ /// Task name
+ /// text description of the trigger
+ public static string Describe(string aName)
+ {
+ return Describe(GetTrigger(aName));
+ }
+ ///
+ /// Return a text description of the trigger
+ ///
+ /// Trigger
+ /// text description of the trigger
+ public static string Describe(Microsoft.Win32.TaskScheduler.Trigger aTrigger)
+ {
+ string Result = string.Empty;
+ if (aTrigger == null)
+ Result = "";
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.TimeTrigger)
+ Result = ((Microsoft.Win32.TaskScheduler.TimeTrigger)aTrigger).ToString();
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.DailyTrigger)
+ Result = ((Microsoft.Win32.TaskScheduler.DailyTrigger)aTrigger).ToString();
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.WeeklyTrigger)
+ Result = ((Microsoft.Win32.TaskScheduler.WeeklyTrigger)aTrigger).ToString();
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.MonthlyTrigger)
+ Result = ((Microsoft.Win32.TaskScheduler.MonthlyTrigger)aTrigger).ToString();
+ else if (aTrigger is Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger)
+ Result = ((Microsoft.Win32.TaskScheduler.MonthlyDOWTrigger)aTrigger).ToString();
+ return Result.Replace("each every", "each"); // fix grammer L:)
+ }
+ }
+}
diff --git a/Utility/AssemblyInfo.cs b/Utility/AssemblyInfo.cs
new file mode 100644
index 000000000..3ec37db69
--- /dev/null
+++ b/Utility/AssemblyInfo.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Utility
+{
+ public static class AssemblyInfo
+ {
+ public static string Info
+ {
+ get
+ {
+ return
+ "AssemblyTitle: " + Title +
+ "\nAssemblyVersion: " + Version +
+ "\nAssembly: " + System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().CodeBase) + '\n';
+ }
+ }
+ public static string Title
+ {
+ get
+ {
+ object[] attributes = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(System.Reflection.AssemblyTitleAttribute), false);
+ if (attributes.Length > 0)
+ {
+ System.Reflection.AssemblyTitleAttribute titleAttribute = (System.Reflection.AssemblyTitleAttribute)attributes[0];
+ if (titleAttribute.Title != "")
+ {
+ return titleAttribute.Title;
+ }
+ }
+ return System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
+ }
+ }
+
+ public static string Version
+ {
+ get
+ {
+ return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
+ }
+ }
+
+ public static string AssemblyDescription
+ {
+ get
+ {
+ object[] attributes = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(System.Reflection.AssemblyDescriptionAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((System.Reflection.AssemblyDescriptionAttribute)attributes[0]).Description;
+ }
+ }
+
+ public static string Product
+ {
+ get
+ {
+ object[] attributes = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(System.Reflection.AssemblyProductAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((System.Reflection.AssemblyProductAttribute)attributes[0]).Product;
+ }
+ }
+
+ public static string Copyright
+ {
+ get
+ {
+ object[] attributes = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(System.Reflection.AssemblyCopyrightAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((System.Reflection.AssemblyCopyrightAttribute)attributes[0]).Copyright;
+ }
+ }
+
+ public static string Company
+ {
+ get
+ {
+ object[] attributes = System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(System.Reflection.AssemblyCompanyAttribute), false);
+ if (attributes.Length == 0)
+ {
+ return "";
+ }
+ return ((System.Reflection.AssemblyCompanyAttribute)attributes[0]).Company;
+ }
+ }
+ }
+}
diff --git a/Utility/CredentialsDialog.cs b/Utility/CredentialsDialog.cs
new file mode 100644
index 000000000..56fbf9738
--- /dev/null
+++ b/Utility/CredentialsDialog.cs
@@ -0,0 +1,336 @@
+using System;
+using System.Drawing;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Text;
+using System.Windows.Forms;
+using System.ComponentModel;
+
+namespace Microsoft.Win32.TaskScheduler
+{
+ ///
+ /// Dialog box which prompts for user credentials using the Win32 CREDUI methods.
+ ///
+ [ToolboxItem(true), ToolboxItemFilter("System.Windows.Forms.Control.TopLevel"), Description("Dialog that prompts the user for credentials."), Designer("System.ComponentModel.Design.ComponentDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), DesignTimeVisible(true)]
+ public class CredentialsDialog : CommonDialog
+ {
+ private const int maxStringLength = 100;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public CredentialsDialog()
+ {
+ Reset();
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The caption.
+ /// The message.
+ /// Name of the user.
+ /// The options.
+ public CredentialsDialog(string caption) : this(caption, null, null, CredentialsDialogOptions.Default) { }
+ public CredentialsDialog(string caption, string message) : this(caption, message, null, CredentialsDialogOptions.Default) { }
+ public CredentialsDialog(string caption, string message, string userName) : this(caption, message, userName, CredentialsDialogOptions.Default) { }
+ public CredentialsDialog(string caption, string message, string userName, CredentialsDialogOptions options)
+ : this()
+ {
+ this.Caption = caption;
+ this.Message = message;
+ this.UserName = userName;
+ this.Options = options;
+ }
+
+ internal enum CredUIReturnCodes
+ {
+ NO_ERROR = 0,
+ ERROR_CANCELLED = 1223,
+ ERROR_NO_SUCH_LOGON_SESSION = 1312,
+ ERROR_NOT_FOUND = 1168,
+ ERROR_INVALID_ACCOUNT_NAME = 1315,
+ ERROR_INSUFFICIENT_BUFFER = 122,
+ ERROR_INVALID_PARAMETER = 87,
+ ERROR_INVALID_FLAGS = 1004,
+ }
+
+ ///
+ /// Gets or sets the Windows Error Code that caused this credential dialog to appear, if applicable.
+ ///
+ [System.ComponentModel.DefaultValue(0), Category("Data"), Description("Windows Error Code that caused this credential dialog")]
+ public int AuthenticationError { get; set; }
+
+ ///
+ /// Gets or sets the image to display as the banner for the dialog
+ ///
+ [System.ComponentModel.DefaultValue((string)null), Category("Appearance"), Description("Image to display in dialog banner")]
+ public Bitmap Banner { get; set; }
+
+ ///
+ /// Gets or sets the caption for the dialog
+ ///
+ [System.ComponentModel.DefaultValue((string)null), Category("Appearance"), Description("Caption to display for dialog")]
+ public string Caption { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether to encrypt password.
+ ///
+ /// true if password is to be encrypted; otherwise, false.
+ [System.ComponentModel.DefaultValue(false), Category("Behavior"), Description("Indicates whether to encrypt password")]
+ public bool EncryptPassword { get; set; }
+
+ ///
+ /// Gets or sets the message to display on the dialog
+ ///
+ [System.ComponentModel.DefaultValue((string)null), Category("Appearance"), Description("Message to display in the dialog")]
+ public string Message { get; set; }
+
+ ///
+ /// Gets or sets the options for the dialog.
+ ///
+ /// The options.
+ [System.ComponentModel.DefaultValue(typeof(CredentialsDialogOptions), "Default"), Category("Behavior"), Description("Options for the dialog")]
+ public CredentialsDialogOptions Options { get; set; }
+
+ ///
+ /// Gets the password entered by the user
+ ///
+ [System.ComponentModel.DefaultValue((string)null), Browsable(false)]
+ public string Password { get; private set; }
+
+ ///
+ /// Gets or sets a boolean indicating if the save check box was checked
+ ///
+ ///
+ /// Only valid if has the flag set.
+ ///
+ [System.ComponentModel.DefaultValue(false), Category("Behavior"), Description("Indicates if the save check box is checked.")]
+ public bool SaveChecked { get; set; }
+
+ ///
+ /// Gets the password entered by the user using an encrypted string
+ ///
+ [System.ComponentModel.DefaultValue(null), Browsable(false)]
+ public SecureString SecurePassword { get; private set; }
+
+ ///
+ /// Gets or sets the name of the target for these credentials
+ ///
+ ///
+ /// This value is used as a key to store the credentials if persisted
+ ///
+ [System.ComponentModel.DefaultValue((string)null), Category("Data"), Description("Target for the credentials")]
+ public string Target { get; set; }
+
+ ///
+ /// Gets or sets the username entered
+ ///
+ ///
+ /// If non-empty before calling , this value will be displayed in the dialog
+ ///
+ [System.ComponentModel.DefaultValue((string)null), Category("Data"), Description("User name displayed in the dialog")]
+ public string UserName { get; set; }
+
+ ///
+ /// Gets a default value for the target.
+ ///
+ /// The default target.
+ private string DefaultTarget
+ {
+ get { return Environment.UserDomainName; }
+ }
+
+ ///
+ /// Confirms the credentials.
+ ///
+ /// If set to true the credentials are stored in the credential manager.
+ public void ConfirmCredentials(bool storedCredentials)
+ {
+ CredUIReturnCodes ret = CredUIConfirmCredentials(this.Target, storedCredentials);
+ if (ret != CredUIReturnCodes.NO_ERROR && ret != CredUIReturnCodes.ERROR_INVALID_PARAMETER)
+ throw new InvalidOperationException(String.Format("Call to CredUIConfirmCredentials failed with error code: {0}", ret));
+ }
+
+ ///
+ /// When overridden in a derived class, resets the properties of a common dialog box to their default values.
+ ///
+ public override void Reset()
+ {
+ this.Target = this.UserName = this.Caption = this.Message = this.Password = null;
+ this.Banner = null;
+ this.EncryptPassword = this.SaveChecked = false;
+ this.Options = CredentialsDialogOptions.Default;
+ }
+
+ [DllImport("credui.dll", CharSet = CharSet.Unicode, EntryPoint = "CredUIConfirmCredentialsW")]
+ internal static extern CredUIReturnCodes CredUIConfirmCredentials(string targetName, [MarshalAs(UnmanagedType.Bool)] bool confirm);
+
+ [DllImport("credui.dll", CharSet = CharSet.Unicode, EntryPoint = "CredUIPromptForCredentialsW")]
+ internal static extern CredUIReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO creditUR,
+ string targetName,
+ IntPtr reserved1,
+ int iError,
+ StringBuilder userName,
+ int maxUserName,
+ StringBuilder password,
+ int maxPassword,
+ [MarshalAs(UnmanagedType.Bool)] ref bool pfSave,
+ CredentialsDialogOptions flags);
+
+ [DllImport("gdi32.dll")]
+ internal static extern bool DeleteObject(IntPtr hObject);
+
+ ///
+ /// When overridden in a derived class, specifies a common dialog box.
+ ///
+ /// A value that represents the window handle of the owner window for the common dialog box.
+ ///
+ /// true if the dialog box was successfully run; otherwise, false.
+ ///
+ protected override bool RunDialog(IntPtr parentWindowHandle)
+ {
+ CREDUI_INFO info = new CREDUI_INFO(parentWindowHandle, this.Caption, this.Message, this.Banner);
+ try
+ {
+
+ StringBuilder userName = new StringBuilder(this.UserName, maxStringLength);
+ StringBuilder password = new StringBuilder(maxStringLength);
+ bool save = this.SaveChecked;
+
+ if (string.IsNullOrEmpty(this.Target)) this.Target = this.DefaultTarget;
+ CredUIReturnCodes ret = CredUIPromptForCredentials(ref info, this.Target, IntPtr.Zero,
+ this.AuthenticationError, userName, maxStringLength, password, maxStringLength, ref save, this.Options);
+ switch (ret)
+ {
+ case CredUIReturnCodes.NO_ERROR:
+ /*if (save)
+ {
+ CredUIReturnCodes cret = CredUIConfirmCredentials(this.Target, false);
+ if (cret != CredUIReturnCodes.NO_ERROR && cret != CredUIReturnCodes.ERROR_INVALID_PARAMETER)
+ {
+ this.Options |= CredentialsDialogOptions.IncorrectPassword;
+ return false;
+ }
+ }*/
+ break;
+ case CredUIReturnCodes.ERROR_CANCELLED:
+ return false;
+ default:
+ throw new InvalidOperationException(String.Format("Call to CredUIPromptForCredentials failed with error code: {0}", ret));
+ }
+
+ if (this.EncryptPassword)
+ {
+ // Convert the password to a SecureString
+ SecureString newPassword = StringBuilderToSecureString(password);
+
+ // Clear the old password and set the new one (read-only)
+ if (this.SecurePassword != null)
+ this.SecurePassword.Dispose();
+ newPassword.MakeReadOnly();
+ this.SecurePassword = newPassword;
+ }
+ else
+ this.Password = password.ToString();
+
+ // Update other properties
+ this.UserName = userName.ToString();
+ this.SaveChecked = save;
+ return true;
+ }
+ finally
+ {
+ info.Dispose();
+ }
+ }
+
+ private static SecureString StringBuilderToSecureString(StringBuilder password)
+ {
+ // Copy the password into the secure string, zeroing the original buffer as we go
+ SecureString newPassword = new SecureString();
+ for (int i = 0; i < password.Length; i++)
+ {
+ newPassword.AppendChar(password[i]);
+ password[i] = '\0';
+ }
+ return newPassword;
+ }
+
+ //[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ internal struct CREDUI_INFO
+ {
+ public int cbSize;
+ public IntPtr hwndParent;
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string pszMessageText;
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string pszCaptionText;
+ public IntPtr hbmBanner;
+
+ public CREDUI_INFO(IntPtr hwndOwner, string caption, string message, Bitmap banner)
+ {
+ cbSize = Marshal.SizeOf(typeof(CREDUI_INFO));
+ hwndParent = hwndOwner;
+ pszCaptionText = caption;
+ pszMessageText = message;
+ hbmBanner = banner != null ? banner.GetHbitmap() : IntPtr.Zero;
+ }
+
+ public void Dispose()
+ {
+ if (hbmBanner != IntPtr.Zero)
+ DeleteObject(hbmBanner);
+ }
+ }
+ }
+
+ ///
+ /// Options for the display of the and its functionality.
+ ///
+ [Flags]
+ public enum CredentialsDialogOptions
+ {
+ ///
+ /// Default flags settings These are the following values:
+ /// , and
+ ///
+ Default = GenericCredentials | AlwaysShowUI | ExpectConfirmation,
+ /// No options are set.
+ None = 0,
+ /// Notify the user of insufficient credentials by displaying the "Logon unsuccessful" balloon tip.
+ IncorrectPassword = 0x1,
+ /// Do not store credentials or display check boxes. You can pass ShowSaveCheckBox with this flag to display the Save check box only, and the result is returned in the property.
+ DoNotPersist = 0x2,
+ /// Populate the combo box with local administrators only.
+ RequestAdministrator = 0x4,
+ /// Populate the combo box with user name/password only. Do not display certificates or smart cards in the combo box.
+ ExcludeCertificates = 0x8,
+ /// Populate the combo box with certificates and smart cards only. Do not allow a user name to be entered.
+ RequireCertificate = 0x10,
+ /// If the check box is selected, show the Save check box and return true in the property, otherwise, return false. Check box uses the value in the property by default.
+ ShowSaveCheckBox = 0x40,
+ /// Specifies that a user interface will be shown even if the credentials can be returned from an existing credential in credential manager. This flag is permitted only if GenericCredentials is also specified.
+ AlwaysShowUI = 0x80,
+ /// Populate the combo box with certificates or smart cards only. Do not allow a user name to be entered.
+ RequireSmartcard = 0x100,
+ ///
+ PasswordOnlyOk = 0x200,
+ ///
+ ValidateUsername = 0x400,
+ ///
+ CompleteUsername = 0x800,
+ /// Do not show the Save check box, but the credential is saved as though the box were shown and selected.
+ Persist = 0x1000,
+ /// This flag is meaningful only in locating a matching credential to prefill the dialog box, should authentication fail. When this flag is specified, wildcard credentials will not be matched. It has no effect when writing a credential. CredUI does not create credentials that contain wildcard characters. Any found were either created explicitly by the user or created programmatically, as happens when a RAS connection is made.
+ ServerCredential = 0x4000,
+ /// Specifies that the caller will call ConfirmCredentials after checking to determine whether the returned credentials are actually valid. This mechanism ensures that credentials that are not valid are not saved to the credential manager. Specify this flag in all cases unless DoNotPersist is specified.
+ ExpectConfirmation = 0x20000,
+ /// Consider the credentials entered by the user to be generic credentials, rather than windows credentials.
+ GenericCredentials = 0x40000,
+ /// The credential is a "runas" credential. The TargetName parameter specifies the name of the command or program being run. It is used for prompting purposes only.
+ UsernameTargetCredentials = 0x80000,
+ ///
+ KeepUsername = 0x100000,
+ }
+}
\ No newline at end of file
diff --git a/Utility/DayPicker.Designer.cs b/Utility/DayPicker.Designer.cs
new file mode 100644
index 000000000..b22d7d334
--- /dev/null
+++ b/Utility/DayPicker.Designer.cs
@@ -0,0 +1,124 @@
+namespace Utility
+{
+ partial class DayPicker
+ {
+ ///
+ /// 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.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.LastCheckBox = new System.Windows.Forms.CheckBox();
+ this.ClearButton = new System.Windows.Forms.Button();
+ this.groupBox2.SuspendLayout();
+ this.tableLayoutPanel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.tableLayoutPanel1);
+ this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox2.Location = new System.Drawing.Point(0, 0);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(200, 200);
+ this.groupBox2.TabIndex = 1;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Select days";
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single;
+ this.tableLayoutPanel1.ColumnCount = 7;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.30615F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.30615F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.30615F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.30615F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.30615F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.30615F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.16309F));
+ this.tableLayoutPanel1.Controls.Add(this.LastCheckBox, 3, 4);
+ this.tableLayoutPanel1.Controls.Add(this.ClearButton, 5, 4);
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 17);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 5;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(194, 180);
+ this.tableLayoutPanel1.TabIndex = 0;
+ //
+ // LastCheckBox
+ //
+ this.LastCheckBox.AutoSize = true;
+ this.tableLayoutPanel1.SetColumnSpan(this.LastCheckBox, 2);
+ this.LastCheckBox.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.LastCheckBox.Location = new System.Drawing.Point(85, 144);
+ this.LastCheckBox.Name = "LastCheckBox";
+ this.LastCheckBox.Size = new System.Drawing.Size(47, 32);
+ this.LastCheckBox.TabIndex = 0;
+ this.LastCheckBox.Text = "Last day";
+ this.LastCheckBox.UseVisualStyleBackColor = true;
+ //
+ // ClearButton
+ //
+ this.tableLayoutPanel1.SetColumnSpan(this.ClearButton, 2);
+ this.ClearButton.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.ClearButton.Location = new System.Drawing.Point(139, 144);
+ this.ClearButton.Name = "ClearButton";
+ this.ClearButton.Size = new System.Drawing.Size(51, 32);
+ this.ClearButton.TabIndex = 1;
+ this.ClearButton.Text = "Clear";
+ this.ClearButton.UseVisualStyleBackColor = true;
+ this.ClearButton.Click += new System.EventHandler(this.ClearButton_Click);
+ //
+ // DayPicker
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.groupBox2);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MinimumSize = new System.Drawing.Size(200, 200);
+ this.Name = "DayPicker";
+ this.Size = new System.Drawing.Size(200, 200);
+ this.groupBox2.ResumeLayout(false);
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ private System.Windows.Forms.CheckBox LastCheckBox;
+ private System.Windows.Forms.Button ClearButton;
+
+
+ }
+}
diff --git a/Utility/DayPicker.cs b/Utility/DayPicker.cs
new file mode 100644
index 000000000..6ff08ce45
--- /dev/null
+++ b/Utility/DayPicker.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Utility
+{
+ ///
+ /// Puts up a generic calander and allows selection of multiple days and/or 'last day'
+ ///
+ public partial class DayPicker : UserControl
+ {
+ ///
+ /// Fires when user clicks a day or last
+ ///
+ public event EventHandler CheckChanged;
+ ///
+ /// Is Last selected
+ ///
+ public bool Last { get { return this.LastCheckBox.Checked; } set { this.LastCheckBox.Checked = value; } }
+ ///
+ /// The days User selected
+ ///
+ public int[] DaysPicked
+ {
+ get
+ {
+ return (from CheckBox qC in this.DayChecks where qC.Checked select int.Parse(qC.Text)).ToArray();
+ }
+ set
+ {
+ DayChecks.ForEach(qC => qC.Checked = value.Contains(int.Parse(qC.Text)));
+ }
+ }
+ ///
+ /// Days picked by user or 1 if none
+ ///
+ public int[] DaysPicked1IfEmpty
+ {
+ get
+ {
+ return (from CheckBox qC in this.DayChecks where qC.Checked select int.Parse(qC.Text)).DefaultIfEmpty(1).ToArray();
+ }
+ }
+ ///
+ /// Puts up a generic calander and allows selection of multiple days and/or 'last day'
+ ///
+ public DayPicker()
+ {
+ InitializeComponent();
+ FillDates();
+ }
+ ///
+ /// Checkboxes in handy list that does not include 'Last'
+ ///
+ private List DayChecks = new List();
+ ///
+ /// Make the control
+ ///
+ private void FillDates()
+ {
+ EventHandler Anon = (EventHandler)delegate(object sender, EventArgs e)
+ { if (CheckChanged != null) CheckChanged(this, e); };
+ this.LastCheckBox.CheckedChanged += Anon;
+ // 30 days hath...
+ for (int d = 1; d < 32; d++)
+ {
+ CheckBox cb =
+ new CheckBox()
+ {
+ Appearance = System.Windows.Forms.Appearance.Button,
+ AutoSize = true,
+ Dock = System.Windows.Forms.DockStyle.Fill,
+ Location = new System.Drawing.Point(4, 4),
+ Name = "checkBox"+d.ToString(),
+ Size = new System.Drawing.Size(20, 28),
+ TabIndex = 10+d,
+ Text = d.ToString(),
+ TextAlign = System.Drawing.ContentAlignment.MiddleCenter,
+ UseVisualStyleBackColor = true,
+ Checked = d==1,
+ };
+ cb.CheckedChanged += Anon;
+ DayChecks.Add(cb);
+ this.tableLayoutPanel1.Controls.Add(cb);
+ }
+ }
+ ///
+ /// Pressed CLEAR, remove all checks
+ ///
+ ///
+ ///
+ private void ClearButton_Click(object sender, EventArgs e)
+ {
+ foreach (Control C in this.tableLayoutPanel1.Controls)
+ if (C is CheckBox) ((CheckBox)C).Checked = false;
+ }
+ }
+}
diff --git a/Utility/DayPicker.resx b/Utility/DayPicker.resx
new file mode 100644
index 000000000..ff31a6db5
--- /dev/null
+++ b/Utility/DayPicker.resx
@@ -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
+
+
\ No newline at end of file
diff --git a/Utility/FolderTreeControl.Designer.cs b/Utility/FolderTreeControl.Designer.cs
new file mode 100644
index 000000000..b1e7abc32
--- /dev/null
+++ b/Utility/FolderTreeControl.Designer.cs
@@ -0,0 +1,95 @@
+namespace Utility
+{
+ partial class FolderTreeControl
+ {
+ ///
+ /// 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(FolderTreeControl));
+ this.treeView = new System.Windows.Forms.TreeView();
+ this.TreeImageList = new System.Windows.Forms.ImageList(this.components);
+ this.OpenContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.OpenContextMenuStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // treeView
+ //
+ this.treeView.ContextMenuStrip = this.OpenContextMenuStrip;
+ this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.treeView.ImageIndex = 0;
+ this.treeView.ImageList = this.TreeImageList;
+ this.treeView.Location = new System.Drawing.Point(0, 0);
+ this.treeView.Name = "treeView";
+ this.treeView.SelectedImageIndex = 0;
+ this.treeView.Size = new System.Drawing.Size(150, 150);
+ this.treeView.TabIndex = 0;
+ this.treeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView_BeforeExpand);
+ this.treeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseClick);
+ //
+ // TreeImageList
+ //
+ this.TreeImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("TreeImageList.ImageStream")));
+ this.TreeImageList.TransparentColor = System.Drawing.Color.Transparent;
+ this.TreeImageList.Images.SetKeyName(0, "FolderUnchecked.png");
+ this.TreeImageList.Images.SetKeyName(1, "FolderPartial.png");
+ this.TreeImageList.Images.SetKeyName(2, "FolderChecked.png");
+ //
+ // OpenContextMenuStrip
+ //
+ this.OpenContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.openToolStripMenuItem});
+ this.OpenContextMenuStrip.Name = "OpenContextMenuStrip";
+ this.OpenContextMenuStrip.Size = new System.Drawing.Size(104, 26);
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image")));
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.openToolStripMenuItem.Text = "Open";
+ this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+ //
+ // FolderTreeControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.treeView);
+ this.Name = "FolderTreeControl";
+ this.OpenContextMenuStrip.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TreeView treeView;
+ private System.Windows.Forms.ImageList TreeImageList;
+ private System.Windows.Forms.ContextMenuStrip OpenContextMenuStrip;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ }
+}
diff --git a/Utility/FolderTreeControl.cs b/Utility/FolderTreeControl.cs
new file mode 100644
index 000000000..552063842
--- /dev/null
+++ b/Utility/FolderTreeControl.cs
@@ -0,0 +1,260 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Utility
+{
+ ///
+ /// A folder tree with 3-state checkboxes
+ ///
+ public partial class FolderTreeControl : UserControl
+ {
+ ///
+ /// A file tree with 3-state checkboxes
+ ///
+ public FolderTreeControl()
+ {
+ InitializeComponent();
+ InitializeTree();
+ this.treeView.BackColor = this.BackColor;
+ }
+ ///
+ /// Make the tree, only populate root nodes
+ ///
+ private void InitializeTree()
+ {
+ this.treeView.Nodes.Clear();
+ TreeNode Computer = UpdateNode(this.treeView.Nodes, "Computer", false);
+ foreach (System.IO.DriveInfo Drive in System.IO.DriveInfo.GetDrives())
+ if (Drive.IsReady) UpdateNode(Computer.Nodes, Drive.RootDirectory.Name, false);
+ Computer.ForeColor = this.ForeColor;
+ }
+ private bool InHere = false; // No re-entry
+ ///
+ /// Expanding, make the children nodes
+ ///
+ private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
+ {
+ if (!InHere)
+ {
+ InHere = true;
+ this.treeView.BeginUpdate();
+ Populate((string)e.Node.Tag, e.Node, e.Node.Checked && e.Node.ImageIndex != 1);
+ this.treeView.Sort();
+ e.Node.Expand(); // Sort collapses all, so we gotta force expand, which is why we need that InHere thing
+ this.treeView.EndUpdate();
+ InHere = false;
+ }
+ }
+ public string[] itsSelectedFolders = new string[0];
+ ///
+ /// List of selected folders
+ ///
+ public string[] SelectedFolders
+ {
+ get { return Selected(this.treeView.Nodes[0]); }
+ }
+ ///
+ /// Sets the list as selected
+ ///
+ /// Folders to select
+ public void SetSelectedFolders(string[] aFolderList)
+ {
+ itsSelectedFolders = aFolderList;
+ AddSelections();
+ }
+ ///
+ /// Get list of selected nodes [recursive]
+ ///
+ /// Node to search
+ /// List of selected nodes
+ private string[] Selected(TreeNode aNode)
+ {
+ if (aNode.Checked && aNode.ImageIndex != 1) return new string[] { (string)aNode.Tag };
+ List Result = new List();
+ foreach (TreeNode Node in aNode.Nodes)
+ Result.AddRange(Selected(Node));
+ return Result.ToArray();
+ }
+ ///
+ /// Returns true if node is selected
+ ///
+ /// Node
+ /// true if node is selected
+ private bool IsChecked(TreeNode aNode)
+ {
+ return aNode.Checked && aNode.ImageIndex == 2;
+ }
+ ///
+ /// A handy look up
+ ///
+ private Dictionary NodesByPath = new Dictionary();
+ ///
+ /// Gets a list of sub directories, returns exception if encountered
+ ///
+ /// Path to list
+ /// null of OK, otherwise error
+ /// List of subs
+ private string[] GetDirectories(string aRoot, out Exception outError)
+ {
+ string[] Result = new string[0];
+ outError = Utility.Tools.TryCatch((Action)delegate() { Result = System.IO.Directory.GetDirectories(aRoot); });
+ return Result;
+ }
+ ///
+ /// Fill a node with child nodes if any
+ ///
+ /// Path to fill
+ /// Parent node
+ /// Check the nodes or not
+ private void Populate(string aRoot, TreeNode aParent, bool aChecked)
+ {
+ Exception Ignored;
+ foreach (string Folder in GetDirectories(aRoot, out Ignored))
+ UpdateNode(aParent.Nodes, Folder, aChecked);
+ }
+ ///
+ /// Gets the name of the node, special case for Recycle Bin
+ ///
+ /// Folder to get name
+ /// Name
+ private string NodeName(string aFolder)
+ {
+ string Result = System.IO.Path.GetFileName(aFolder);
+ if (string.IsNullOrEmpty(Result)) Result = aFolder;
+ return Result.Replace("$Recycle.Bin", " Recycle Bin");
+ }
+ ///
+ /// Add/Change a node
+ ///
+ /// Nodes for this one to join
+ /// Folder to use
+ /// Checked or not
+ /// The new node
+ private TreeNode UpdateNode(TreeNodeCollection aNodes, string aFolder, bool aChecked)
+ {
+ if (aNodes.Count > 0 && string.IsNullOrEmpty(aNodes[0].Text)) aNodes.RemoveAt(0); // Remove the fake
+ TreeNode NewNode = null;
+ if (NodesByPath.ContainsKey(aFolder))
+ NewNode = NodesByPath[aFolder]; // We already got one...
+ else
+ NewNode =
+ aNodes[
+ aNodes.Add(new TreeNode(NodeName( aFolder ))
+ {
+ Tag = aFolder,
+ Checked = aChecked,
+ SelectedImageIndex = aChecked ? 2 : 0,
+ ImageIndex = aChecked ? 2 : 0,
+ })];
+ NodesByPath[aFolder] = NewNode;
+ Exception HasErrs;
+ bool HasSubs = GetDirectories(aFolder, out HasErrs).Length > 0;
+ if (HasErrs != null)
+ {
+ NewNode.Tag = null;
+ NewNode.ForeColor = Color.DarkGray;
+ NewNode.ToolTipText = HasErrs.Message;
+ }
+ // Add a fake node so that the little '+' will show
+ if (HasSubs)
+ NewNode.Nodes.Add(string.Empty);
+ return NewNode;
+ }
+ ///
+ /// Breaks the path into its parts
+ ///
+ /// Path to parse
+ /// Components of the path
+ private string[] PathParts(string aPath)
+ {
+ List Result = new List();
+ for (string Part = System.IO.Path.GetDirectoryName(aPath); !string.IsNullOrEmpty(Part); Part = System.IO.Path.GetDirectoryName(Part) )
+ Result.Add(Part);
+ Result.Reverse();
+ return Result.ToArray();
+ }
+ ///
+ /// This adds a list of nodes to the tree
+ ///
+ private void AddSelections()
+ {
+ foreach (string Entry in itsSelectedFolders)
+ {
+ TreeNode Parent = this.treeView.Nodes[0];
+ foreach (string Part in PathParts(Entry))
+ {
+ Parent = UpdateNode(Parent.Nodes, Part, true);
+ Parent.SelectedImageIndex = Parent.ImageIndex = 1;
+ }
+ UpdateNode(Parent.Nodes, Entry, true);
+ }
+ }
+ ///
+ /// This goes up the tree setting any partial checks
+ ///
+ /// Node to start
+ private void Propagate(TreeNode aNode)
+ {
+ if (aNode.Parent == null) return;
+ for (TreeNode Up = aNode.Parent; Up != null; Up = Up.Parent)
+ {
+ // Sets partial check if some of the nodes are not checked
+ int CheckCount = (from TreeNode qN in Up.Nodes where qN.Checked select qN).Count();
+ Up.Checked = CheckCount != 0;
+ Up.SelectedImageIndex = Up.ImageIndex = CheckCount == 0 ? 0 : (CheckCount == aNode.Parent.Nodes.Count ? 2 : 1);
+ }
+ }
+ ///
+ /// Set a node checked or not
+ ///
+ /// Node to set
+ /// Set up-tree nodes
+ private void CheckNodes(TreeNode aNode, bool aPropagate)
+ {
+ if (aPropagate) Propagate(aNode);
+ SetChecked(aNode, aNode.Checked);
+ }
+ ///
+ /// Sets a node and children checked or not [recursive]
+ ///
+ /// Node to set
+ /// Checked or not
+ private void SetChecked(TreeNode aNode, bool aValue)
+ {
+ aNode.SelectedImageIndex = aNode.ImageIndex = aValue ? 2 : 0;
+ aNode.Checked = aValue;
+ foreach (TreeNode Node in aNode.Nodes)
+ SetChecked(Node, aValue);
+ }
+ private TreeNode itsContextNode;
+ ///
+ /// Pressed NODE - Determine if User has tried to check a node
+ ///
+ private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
+ {
+ itsContextNode = e.Node;
+ if (e.Button != MouseButtons.Left) return;
+ // See if clicked inside checked zone (36 pixels left of node bounds)
+ Rectangle ExpandedBounds = Rectangle.FromLTRB(e.Node.Bounds.Left - 36, e.Node.Bounds.Top, e.Node.Bounds.Right, e.Node.Bounds.Bottom);
+ if (ExpandedBounds.Contains(e.Location) && e.Node.Tag != null)
+ {
+ e.Node.Checked = !e.Node.Checked;
+ CheckNodes(e.Node, true);
+ }
+ }
+ ///
+ /// Context menu allows explorer to open
+ ///
+ private void openToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (itsContextNode != null)
+ System.Diagnostics.Process.Start((string)itsContextNode.Tag);
+ }
+ }
+}
diff --git a/Utility/FolderTreeControl.resx b/Utility/FolderTreeControl.resx
new file mode 100644
index 000000000..d880572b8
--- /dev/null
+++ b/Utility/FolderTreeControl.resx
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 144, 17
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAIGNIUk0AAHolAACAgwAA3kQAAIGwAAB5
+ 3wAA1IAAADo0AAAzkI20cv8AAAAJcEhZcwAACxEAAAsRAX9kX5EAAALbSURBVDhPfZNrSFNxGMYPRJ/C
+ T0EK3SW1C1EggpRogWnqLJ23GVNJp7u6neOc85Zuury0gi4QkiYrLBMpm7qRDMnoU4GWEIYUdDELNJ3z
+ MrfpfPqfs5SG0oEXDu//nB/P87zvnwJA9dWnBFoa0tFnSIW57gJ6ahPxrPocdMWCBPZ8qzKJQ/36VL8h
+ PcjalEW+3fx0V5xFkyiG16UICzBJjwS0F4YEtOUfDDBJwnZ0ivf5g14YL3GEtdUGeD318C7XYmWxGh6H
+ lut3lUWhUx2JR3Q4HipO4IHsKNqLQnFDGh3/r1LK2iwAvI3wrhjgdemxunQFK/MVcM+WwjVFb6n0fmEw
+ ZELegB/I0pRJ1FyF100gzhoCqYTHXgbXNIPlXwo4J8RY/JKP+U+5cHwUwP4hDW35+0Hn8F/7g0jIa8TS
+ KrE0/lIO6zUBrATeb+D7gq9JwNOqWHRpo/GkNBIdnMXjMEkPo10UjNbLe3FHuMdL9ZEfvG4dVoilnuq4
+ La38rznYGA9lxqlRqrf+Imdp8LYQrkXDhk02cDdnUQXnpAyLX1l7OXCMZcL+PgUzw0n4YY2Bnn8IYqY2
+ ijLrk+GcLoftlsA3OXcdp85Npub6TXL6SSDfRFggGc2NZcE+moqZER4mh2JhytuOoryCNrlGR1Hs8pn1
+ fKLe6At8iYx+jkBI2M51yGcSNAfhY3aYB8e7RLwxBoHmRUyJtc27lIyGosx1yRgfkpMd0nNKPI5yoqSE
+ m9jS90IsEIhPSRpmR5Ix8/Y8JizhuJ4eCLFMU8BOjqZpiuo1pOC5LolciTh0V5xBl+Y0HpdEoEN5kizf
+ MbJ8IWgtOIB7ebvRIgzE3eydaEnbBo0ow74OUdFqirqpzY4TiZmBYokMSokUxZtKwvUUEgkUYvZdAkYp
+ B0OrXvntkbEslxIW1wRKVWU6Ka21Selym4wtpoIreUnl36qyydVsVdsU6iqLilGzwW7ctz+gybZhO2cz
+ jAAAAABJRU5ErkJggg==
+
+
+
+ 17, 17
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC2
+ GgAAAk1TRnQBSQFMAgEBAwEAATABAAEwAQABIAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
+ AwABEAMAAQEBAAEgBgABIBYAAWYBYAFUAf4BYwFdAVEB/wFjAV0BUQH/AWMBXQFRAf8BYwFdAVEB/wFj
+ AV0BUQH/AWMBXQFRAf8BYwFdAVEB/wFjAV0BUQH/AWMBXQFRAf8BYwFdAVEB/wwAAxEBFwNHAYACWQFY
+ AbsCWQFYAbsCWQFYAbsCWQFYAbsCWQFYAbsBWwJZAbsBWwJZAbsBWwJZAbsBWwJZAbsBWwJZAbsCWQFW
+ AbUDMwFSEAADXgH+A1oB/wNaAf8DWgH/A1sB/wNdAf8DWgH/A1oB/wNaAf8DWgH/A1oB/wwAAxEBFwNH
+ AYADWAG7A1gBuwNYAbsDWAG7A1gBuwFZAlgBuwFZAlgBuwFZAlgBuwFZAlgBuwFZAlgBuwJWAVUBtQMz
+ AVIUAAMyAVADQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQgF0DAADLQFGA1gBuQFk
+ AWIBZwH/AWMBYgFoAf8BYwFiAWcB/wFjAWIBZwH/AWMBYgFnAf8BYwFiAWcB/wJiAWcB/wFjAWIBZwH/
+ AmIBZgH/AWIBYQFmAf8CYgFnAf8BZQFoAWsB/wNYAcGIAAF1AW8BZAH+Ad0B2AHQIf8BYwFdAVEB/wgA
+ Ay0BRgNYAbkBZgFkAWkB/wFlAWQBagH/AWUBZAFpAf8BZQFkAWkB/wFlAWQBaQH/AWUBZAFpAf8CZAFp
+ Af8BZQFkAWkB/wJkAWgB/wFkAWMBaAH/AmQBaQH/AWcBagFtAf8DWwHBEAADbQH+A9cJ/wP+Af8D+xH/
+ A1oB/wgAAy0BRgNYAbkBZQFjAWgB/wFkAWMBaQH/AWQBYwFoAf8BZAFjAWgB/wFkAWMBaAH/AWQBYwFo
+ Af8CYwFoAf8BZAFjAWgB/wJjAWcB/wFjAWIBZwH/AmMBaAH/AWYBaQFsAf8DWgHBFAABawFlAVoB/gGW
+ AZABhgH/AaQBoAGZAf8BpAGgAZkB/wGmAaMBnAH/AakBpQGfAf8BpAGgAZkB/wGkAaABmQH/AaQBoAGZ
+ Af8BnwGbAZQB/wFbAVYBTwH6DAABSgGEAbIB/wFFAYABsAH/AUABdgGuAf8BOgFzAasB/wE1AW8BqQH/
+ AS8BbAGmAf8BKgFoAaQB/wElAWQBoQH/AR8BYAGeAf8BGgFdAZsB/wEVAVkBmgH/AREBVgGYAf8BDQFT
+ AZYB/wEAAU0BmAH/AVgBYgFlAe+IAAF+AXgBbAH+Ad0B2AHQIf8BYwFdAVEB/wgAAUwBhAGyAf8BRwGA
+ AbAB/wFCAXgBrgH/ATwBdQGrAf8BNwFxAakB/wExAW4BpgH/ASwBagGkAf8BJwFmAaEB/wEhAWIBngH/
+ ARwBXwGbAf8BFwFbAZoB/wETAVgBmAH/AQ8BVQGWAf8BAAFPAZgB/wFYAWIBaQHvEAADdgH+A9cJ/wPl
+ Af8DhQH/A9MN/wNaAf8IAAFLAYQBsgH/AUYBgAGwAf8BQQF3Aa4B/wE7AXQBqwH/ATYBcAGpAf8BMAFt
+ AaYB/wErAWkBpAH/ASYBZQGhAf8BIAFhAZ4B/wEbAV4BmwH/ARYBWgGaAf8BEgFXAZgB/wEOAVQBlgH/
+ AQABTgGYAf8BWAFiAWYB7xQAAX8BeQFuAf4B3QHYAdAJ/wHgAfEB6AH/AZEBzwGtAf8B4wHyAeoJ/wL0
+ AfMB/wFbAVYBTwH6DAABRwGCAbEB/wFlAcAB2QH/AYEB+gH9Af8BdwH1AfsB/wFyAfEB+gH/AWwB7AH4
+ Af8BZgHnAfcB/wFfAeIB9QH/AVgB3AHzAf8BUQHWAfAB/wFNAdEB7wH/AUcBzgHuAf8BQgHKAe0B/wEt
+ AbUB4wH/AREBTgGMAf8DOwFjhAABfgF4AWwB/gHdAdgB0CH/AWMBXQFRAf8IAAFJAYIBsQH/AWcBwAHZ
+ Af8BgQH6Af0B/wF5AfUB+wH/AXQB8QH6Af8BbgHsAfgB/wFoAecB9wH/AWEB4gH1Af8BWgHcAfMB/wFT
+ AdYB8AH/AU8B0QHvAf8BSQHOAe4B/wFEAcoB7QH/AS8BtQHjAf8BEwFQAYwB/wM7AWMMAAN2Af4D1wX/
+ A/0B/wOWAf8DcwH/A3QB/wP7Cf8DWgH/CAABSAGCAbEB/wFmAcAB2QH/AYEB+gH9Af8BeAH1AfsB/wFz
+ AfEB+gH/AW0B7AH4Af8BZwHnAfcB/wFgAeIB9QH/AVkB3AHzAf8BUgHWAfAB/wFOAdEB7wH/AUgBzgHu
+ Af8BQwHKAe0B/wEuAbUB4wH/ARIBTwGMAf8DOwFjEAABfwF5AW4B/gHdAdgB0AX/Af0B/gH9Af8BRgG2
+ AXkB/wEAAZIBPwH/AQ8BmQFLAf8B+wH9AfwF/wL0AfMB/wFbAVYBTwH6DAABRAF5Aa8B/wFMAYEBsQH/
+ AYsD/wGBAfkB/QH/AXYB9QH8Af8BcQHwAfoB/wFrAesB+AH/AWQB5gH2Af8BXgHhAfQB/wFYAdwB8wH/
+ AVEB1gHxAf8BTAHRAe8B/wFGAc0B7gH/AUQBzwHxAf8BEgGLAckB/wFNAVUBYwHqhAABfgF4AWwB/gHd
+ AdgB0CH/AWMBXQFRAf8IAAFGAXsBrwH/AU4BgQGxAf8BiwP/AYEB+QH9Af8BeAH1AfwB/wFzAfAB+gH/
+ AW0B6wH4Af8BZgHmAfYB/wFgAeEB9AH/AVoB3AHzAf8BUwHWAfEB/wFOAdEB7wH/AUgBzQHuAf8BRgHP
+ AfEB/wEUAYsByQH/AUcBUwFlAeoDEAEWCAADdgH+A9cF/wPeAf8DegH/A3YB/wN0Af8DrQH/A/4F/wNa
+ Af8IAAFFAXoBrwH/AU0BgQGxAf8BiwP/AYEB+QH9Af8BdwH1AfwB/wFyAfAB+gH/AWwB6wH4Af8BZQHm
+ AfYB/wFfAeEB9AH/AVkB3AHzAf8BUgHWAfEB/wFNAdEB7wH/AUcBzQHuAf8BRQHPAfEB/wETAYsByQH/
+ AUoBVAFkAeoDEAEWDAABfwF5AW4B/gHdAdgB0AX/Ab8B5gHTAf8BAAGaAUgB/wEAAZcBRAH/AQABlAFA
+ Af8BigHMAagF/wL0AfMB/wFbAVYBTwH6DAABRwGBAbEB/wFyAesB9gH/AVIBkQG7Af8BhgH8Af4B/wGC
+ AfkB/QH/AXcB9QH7Af8BcQHxAfkB/wFrAewB+AH/AWQB5gH3Af8BXgHhAfQB/wFYAdsB8wH/AVEB1gHw
+ Af8BSwHRAe8B/wFGAc4B7QH/AT4BwAHlAf8BAAFZAaAB/4QAAX4BeAFsAf4B3QHYAdAh/wFjAV0BUQH/
+ CAABSQGBAbEB/wF0AesB9gH/AVQBkQG7Af8BhgH8Af4B/wGCAfkB/QH/AXkB9QH7Af8BcwHxAfkB/wFt
+ AewB+AH/AWYB5gH3Af8BYAHhAfQB/wFaAdsB8wH/AVMB1gHwAf8BTQHRAe8B/wFIAc4B7QH/AUABwAHl
+ Af8BAQFbAaAB/wNRAZwIAAN2Af4D2AH/A/wB/wOYAf8DggH/A4AB/wN3Af8DdwH/A/oF/wNaAf8IAAFI
+ AYEBsQH/AXMB6wH2Af8BUwGRAbsB/wGGAfwB/gH/AYIB+QH9Af8BeAH1AfsB/wFyAfEB+QH/AWwB7AH4
+ Af8BZQHmAfcB/wFfAeEB9AH/AVkB2wHzAf8BUgHWAfAB/wFMAdEB7wH/AUcBzgHtAf8BPwHAAeUB/wEA
+ AVoBoAH/A1EBnAwAAX8BeQFuAf4B3gHaAdIB/wH5AfwB+wH/ARsBrgFnAf8BAAGeAU0B/wEAAZsBSQH/
+ AQABmAFFAf8BCgGcAU0B/wH6Af0B+wH/AvQB8wH/AVsBVgFPAfoMAAFJAYMBsgH/AXgB9gH8Af8BVgGS
+ Ab0B/wGEAfQB+AH/AYUB/AH+Af8BgQH5Af0B/wF2AfQB+wH/AXAB7wH5Af8BaQHrAfgB/wFkAeUB9gH/
+ AVwB4AH0Af8BVwHbAfIB/wFQAdYB8QH/AUoB0AHvAf8BRQHNAe0B/wE5AbYB5AH/hAABfgF4AWwB/gHd
+ AdgB0CH/AWMBXQFRAf8IAAFLAYMBsgH/AXoB9gH8Af8BWAGSAb0B/wGEAfQB+AH/AYUB/AH+Af8BgQH5
+ Af0B/wF4AfQB+wH/AXIB7wH5Af8BawHrAfgB/wFmAeUB9gH/AV4B4AH0Af8BWQHbAfIB/wFSAdYB8QH/
+ AUwB0AHvAf8BRwHNAe0B/wE7AbYB5AH/ASABTgGBAf8DKAE8BAADewH+A+oB/wPNAf8DiQH/A4YB/wOE
+ Af8DegH/A3gB/wOwBf8DWwH/CAABSgGDAbIB/wF5AfYB/AH/AVcBkgG9Af8BhAH0AfgB/wGFAfwB/gH/
+ AYEB+QH9Af8BdwH0AfsB/wFxAe8B+QH/AWoB6wH4Af8BZQHlAfYB/wFdAeAB9AH/AVgB2wHyAf8BUQHW
+ AfEB/wFLAdAB7wH/AUYBzQHtAf8BOgG2AeQB/wEfAU0BgQH/AygBPAgAAn8BdQH+Au4B6gH/AXAB0QGp
+ Af8BAAGmAVYB/wEAAaMBUgH/AQEBogFSAf8BAAGcAUoB/wEAAZkBRgH/AV8BwAGSAf8C9QH0Af8BWwFW
+ AU8B+gwAAUwBhAGzAf8BgAH5Af0B/wF3AfUB+wH/AUABdgGvMf+EAAF+AXgBbAH+Ad0B2AHQIf8BYwFd
+ AVEB/wgAAU4BhAGzAf8BgAH5Af0B/wF5AfUB+wH/AUIBeAGvMf8BQwGHAb0B/wFUAVgBXwHRBAADtQH+
+ A9cB/wOUAf8DjQH/A4oB/wPTAf8DpgH/A4EB/wN5Af8D8AH/A3YB/wgAAU0BhAGzAf8BgAH5Af0B/wF4
+ AfUB+wH/AUEBdwGvMf8BQgGHAb0B/wFXAVgBXgHRCAABvAHAAboB/gFpAdIBqQH/AQABrgFeAf8BAAGr
+ AVsB/wEAAagBWAH/AdoB8gHnAf8BXAHFAZcB/wEAAZ0BTAH/AQABmwFKAf8B6AH0Ae4B/wF3AXIBaAH6
+ DAABTgGGAbUB/wGDAfoB/gH/AXkB9wH8Af8BZQG/AdkB/wFSAYoBtgH/AVABiAG2Af8BTAGEAbQB/wFI
+ AYIBsQH/AUMBeAGvAf8BPgF1Aa0B/wE4AXEBqQH/ATIBbgGoAf8BLQFqAaQB/wEnAWYBogH/ASIBYwGg
+ Af8BHAFeAZ4B/4QAAX4BeAFsAf4B3QHYAdAh/wFjAV0BUQH/CAABUAGGAbUB/wGDAfoB/gH/AXsB9wH8
+ Af8BZwG/AdkB/wFUAYoBtgH/AVIBiAG2Af8BTgGEAbQB/wFKAYIBsQH/AUUBegGvAf8BQAF3Aa0B/wE6
+ AXMBqQH/ATQBcAGoAf8BLwFsAaQB/wEpAWgBogH/ASQBZQGgAf8BHgFgAZ4B/wEZAV0BmwH/AR8BVAGS
+ Af0EAAPJAf4DswH/A5QB/wORAf8DqgX/A/cB/wOOAf8DggH/A5UB/wPOAf8DFAEbBAABTwGGAbUB/wGD
+ AfoB/gH/AXoB9wH8Af8BZgG/AdkB/wFTAYoBtgH/AVEBiAG2Af8BTQGEAbQB/wFJAYIBsQH/AUQBeQGv
+ Af8BPwF2Aa0B/wE5AXIBqQH/ATMBbwGoAf8BLgFrAaQB/wEoAWcBogH/ASMBZAGgAf8BHQFfAZ4B/wEY
+ AVwBmwH/ASABUwGSAf0IAAGsAc0BvgH+AZoB4QHFAf8BAAGxAWIB/wEAAa4BXwH/AYEB1QGxBf8B+QH8
+ AfoB/wEmAbIBbgH/AQABngFMAf8BCQGhAVQB/wPYAfsDDAEQCAABUAGIAbUB/wGFAfwB/gH/AYEB+QH9
+ Af8BeAH2AfwB/wF0AfIB+wH/AXAB7wH6Af8BawHrAfgB/wFmAecB9wH/AWEB4wH2Af8BXAHfAfQB/wFY
+ AdsB8gH/AVIB1wHxAf8BTQHUAe8B/wEZAVwBnAH/AVkCWwHDiAABfgF4AWwB/gHdAdgB0AH/AfwB+wH6
+ Af8B/AH7AfoB/wH8AfsB+gH/AfwB+wH6Af8B/AH7AfoB/wH8AfsB+gH/AfwB+wH6Af8B/AH7AfoB/wFj
+ AV0BUQH/CAABUgGIAbUB/wGFAfwB/gH/AYEB+QH9Af8BegH2AfwB/wF2AfIB+wH/AXIB7wH6Af8BbQHr
+ AfgB/wFoAecB9wH/AWMB4wH2Af8BXgHfAfQB/wFaAdsB8gH/AVQB1wHxAf8BTwHUAe8B/wEbAV4BnAH/
+ AVkBWwFdAcMQAAOnAf4D9AH/A9sB/wPOAf8D/AH/A/sB/wP7Af8D9QH/A4oB/wODAf8DxgH/A2ABuwMK
+ AQ4BUQGIAbUB/wGFAfwB/gH/AYEB+QH9Af8BeQH2AfwB/wF1AfIB+wH/AXEB7wH6Af8BbAHrAfgB/wFn
+ AecB9wH/AWIB4wH2Af8BXQHfAfQB/wFZAdsB8gH/AVMB1wHxAf8BTgHUAe8B/wEaAV0BnAH/AVkCWwHD
+ FAABjAGHAX8B/gHnAeMB3gH/Ae4B9wHyAf8B7AH3AfIB/wHxAe8B6gH/AesB6QHiAf8B7QHrAeUB/wH1
+ AfkB9wH/ASgBsgFvAf8BAAGfAU0B/wEjAawBZwH/A40B5gMMARAEAAFSAYkBtgH/AYcB/QL/AYQB+wH9
+ Af8BgQH4Af0B/wF3AfUB/AH/AXMB8gH7Af8BbgHuAfkB/wFqAeoB+BX/ARwBXwGdAf8BVgJYAbmIAAF+
+ AXgBbAH+AdUBzwHHAf8B1wHRAckB/wHXAdEByQH/AdcB0QHJAf8B1wHRAckB/wHXAdEByQH/AdcB0QHJ
+ Af8B1wHRAckB/wHXAdEByQH/AWMBXQFRAf8IAAFUAYkBtgH/AYcB/QL/AYQB+wH9Af8BgQH4Af0B/wF5
+ AfUB/AH/AXUB8gH7Af8BcAHuAfkB/wFsAeoB+BX/AR4BYQGdAf8BVQJYAbkQAAN4Af4D0AH/A9oB/wPd
+ Af8D0gH/A9AB/wPQAf8D4AH/A/AB/wOJAf8DhAH/A98B/wNUAaIBUwGJAbYB/wGHAf0C/wGEAfsB/QH/
+ AYEB+AH9Af8BeAH1AfwB/wF0AfIB+wH/AW8B7gH5Af8BawHqAfgV/wEdAWABnQH/AVYCWAG5FAABdQFv
+ AWQB/gF2AXABZQH/AXgBcgFnAf8BeAFyAWcB/wF2AXABZQH/AXYBcAFlAf8BdgFwAWUB/wGKAYQBdAH/
+ AeQB6AHkAf8BSgHAAY0B/wEAAaEBUAH/AUQBuwGEAf8DcwHYAw4BEwFUAYsBuAX/AYYB/AH+Af8BgwH6
+ Af0B/wF5AfcB/QH/AXYB9AH7Af8BcQHxAfoF/wE2AXABqQH/ATIBbQGnAf8BLQFqAaUB/wEpAWYBogH/
+ ASQBZAGhAf8BIAFgAZ4B/wMuAUeIAAFoAWIBVgH+AWMBXQFRAf8BYwFdAVEB/wFjAV0BUQH/AWMBXQFR
+ Af8BYwFdAVEB/wFjAV0BUQH/AWMBXQFRAf8BYwFdAVEB/wFjAV0BUQH/AWMBXQFRAf8IAAFWAYsBuAX/
+ AYYB/AH+Af8BgwH6Af0B/wF7AfcB/QH/AXgB9AH7Af8BcwHxAfoF/wE4AXIBqQH/ATQBbwGnAf8BLwFs
+ AaUB/wErAWgBogH/ASYBZgGhAf8BIgFiAZ4B/wMuAUcQAANgAf4DWgH/A1oB/wNaAf8DWgH/A1oB/wNa
+ Af8DXAH/A6QB/wPjAf8DjQH/A4kB/wPjAf8BVQGLAbgF/wGGAfwB/gH/AYMB+gH9Af8BegH3Af0B/wF3
+ AfQB+wH/AXIB8QH6Bf8BNwFxAakB/wEzAW4BpwH/AS4BawGlAf8BKgFnAaIB/wElAWUBoQH/ASEBYQGe
+ Af8DLgFHFAADUAGeAywBQwMsAUMDLAFDAywBQwMsAUMDLAFDAywBQwMvAUkDUQGcAYoB1QG0Af8BAAGi
+ AVEB/wFFAbwBhgH/A3MB2AMjATMBUQGIAbYV/wE7AXMBqwH/AzABTAMKAQ0DCgENAwoBDQMKAQ0DCAEL
+ jAADJAE2MAADEgEYAVMBiAG2Ff8BPQF1AasB/wMwAUwDCgENAwoBDQMKAQ0DCgENAwgBCxQAAyQBNhwA
+ AwMBBANAAXED0AH5A5cB/wOLAf8B0wHYAdwB/wFSAYgBthX/ATwBdAGrAf8DMAFMAwoBDQMKAQ0DCgEN
+ AwoBDQMIAQs8AAMGAQgDTQGRAasB2gHEAf4BAAGkAVUB/wEtAbMBcgH/AYQChQHjAyABLgFOAYYBtQH/
+ AUsBhAGzAf8BSAGCAbEB/wFEAXkBrwH/AT8BdgGuAf8DNwFa3AADEQEXAVABhgG1Af8BTQGEAbMB/wFK
+ AYIBsQH/AUYBewGvAf8BQQF4Aa4B/wMvAUlUAANCAXMD0gH3A54B/wOGAf8BzAHQAdUB/wFPAYYBtQH/
+ AUwBhAGzAf8BSQGCAbEB/wFFAXoBrwH/AUABdwGuAf8DLwFJWAADBAEFAzQBVAGnAbYBrwH0AVcBxAGW
+ Af8BcgHNAaUB/wMfAS0UAAMJAQz/AE0AAwEBAgMrAUIDoAHqA9EB/wO5Af8DUAGdcAADDQESAz0BaQNg
+ AcYDVgGrAwgBCxcAAQH/AFEAAwoBDQM7AWMDaAHFA2gBxgMmATn/AD0AAUIBTQE+BwABPgMAASgDAAGA
+ AwABEAMAAQEBAAEBBgABARYAA/8BAAGAAQ4BAAEHAYABDgEAAQcBwAEHAQABAQQAAYABDAEAAQcBgAEM
+ AQABBwHAAQcBAAEBBAABgAEMAQABBwGAAQwBAAEHAcABBwYAAYABDAEAAQMBgAEMAQABAwHAAQcGAAGA
+ AQwBAAEBAYABDAEAAQEBwAEHBgABgAEMAQABAQGAAQwBAAEBAcABBwYAAYABDAIAAYABDAIAAcABBwYA
+ AYABDAIAAYABDAIAAcABBwYAAYABDAIAAYABBAIAAcABAwEAAQEEAAGAAQwBAAEHAYACAAEHAcABAQEA
+ AQEEAAGAAQwBAAEHAYACAAEHAcACAAEBBAABgAEMAQABBwGAAgABBwHAAgABAwQAAb8B/AEAAQ8BvwGA
+ AQABDwH/AeABAAH/BAAB/wH+AQMC/wHgAQMC/wHwAT4B/wQABf8B4AF/Av8B+AE+Af8EAAX/AfABfwX/
+ BAAL
+
+
+
\ No newline at end of file
diff --git a/Utility/GetCheck.Designer.cs b/Utility/GetCheck.Designer.cs
new file mode 100644
index 000000000..1506a595c
--- /dev/null
+++ b/Utility/GetCheck.Designer.cs
@@ -0,0 +1,126 @@
+namespace Utility
+{
+ partial class GetCheck
+ {
+ ///
+ /// 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 Windows Form 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(GetCheck));
+ this.label1 = new System.Windows.Forms.Label();
+ this.secureTextBox1 = new SecureTextBox();
+ this.OKButton = new System.Windows.Forms.Button();
+ this.CanButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.label1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.Location = new System.Drawing.Point(0, 0);
+ this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label1.Name = "label1";
+ this.label1.Padding = new System.Windows.Forms.Padding(6);
+ this.label1.Size = new System.Drawing.Size(136, 31);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Enter password:";
+ //
+ // secureTextBox1
+ //
+ this.secureTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.secureTextBox1.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.secureTextBox1.Location = new System.Drawing.Point(8, 33);
+ this.secureTextBox1.Margin = new System.Windows.Forms.Padding(8);
+ this.secureTextBox1.MaximumSize = new System.Drawing.Size(600, 32);
+ this.secureTextBox1.MinimumSize = new System.Drawing.Size(200, 32);
+ this.secureTextBox1.Name = "secureTextBox1";
+ this.secureTextBox1.ShortcutsEnabled = false;
+ this.secureTextBox1.Size = new System.Drawing.Size(327, 27);
+ this.secureTextBox1.TabIndex = 1;
+ this.secureTextBox1.UseSystemPasswordChar = true;
+ //
+ // OKButton
+ //
+ this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OKButton.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.OKButton.Location = new System.Drawing.Point(143, 84);
+ this.OKButton.Margin = new System.Windows.Forms.Padding(4);
+ this.OKButton.Name = "OKButton";
+ this.OKButton.Size = new System.Drawing.Size(88, 33);
+ this.OKButton.TabIndex = 2;
+ this.OKButton.Text = "OK";
+ this.OKButton.UseVisualStyleBackColor = true;
+ this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
+ //
+ // CanButton
+ //
+ this.CanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CanButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CanButton.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CanButton.Location = new System.Drawing.Point(239, 84);
+ this.CanButton.Margin = new System.Windows.Forms.Padding(4);
+ this.CanButton.Name = "CanButton";
+ this.CanButton.Size = new System.Drawing.Size(88, 33);
+ this.CanButton.TabIndex = 3;
+ this.CanButton.Text = "Cancel";
+ this.CanButton.UseVisualStyleBackColor = true;
+ this.CanButton.Click += new System.EventHandler(this.CanButton_Click);
+ //
+ // GetCheck
+ //
+ this.AcceptButton = this.OKButton;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.ActiveCaption;
+ this.CancelButton = this.CanButton;
+ this.ClientSize = new System.Drawing.Size(340, 121);
+ this.Controls.Add(this.CanButton);
+ this.Controls.Add(this.OKButton);
+ this.Controls.Add(this.secureTextBox1);
+ this.Controls.Add(this.label1);
+ this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "GetCheck";
+ this.ShowInTaskbar = false;
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.TopMost = true;
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private SecureTextBox secureTextBox1;
+ private System.Windows.Forms.Button OKButton;
+ private System.Windows.Forms.Button CanButton;
+ }
+}
\ No newline at end of file
diff --git a/Utility/GetCheck.cs b/Utility/GetCheck.cs
new file mode 100644
index 000000000..3c083a673
--- /dev/null
+++ b/Utility/GetCheck.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Utility
+{
+ public partial class GetCheck : Form
+ {
+ public string Prompt { get { return this.label1.Text; } set { this.label1.Text = value; } }
+ public System.Security.SecureString Result { get; private set; }
+ public GetCheck(string aPrompt)
+ : this()
+ {
+ Prompt = aPrompt;
+ }
+ public GetCheck()
+ {
+ InitializeComponent();
+ }
+ protected override void OnShown(EventArgs e)
+ {
+ if (Prompt == null) this.label1.Text = Prompt;
+ base.OnShown(e);
+ }
+ private void OKButton_Click(object sender, EventArgs e)
+ {
+ Result = this.secureTextBox1.Value;
+ this.DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void CanButton_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ public static System.Security.SecureString Fetch(string aPrompt)
+ {
+ System.Security.SecureString Result = new System.Security.SecureString();
+ using (GetCheck gc = new GetCheck(aPrompt))
+ if (gc.ShowDialog() == DialogResult.OK) Result = gc.Result;
+ return Result;
+ }
+ }
+}
diff --git a/Utility/GetCheck.resx b/Utility/GetCheck.resx
new file mode 100644
index 000000000..a3c9b8abc
--- /dev/null
+++ b/Utility/GetCheck.resx
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAwAMDAQAAEABABoBgAAxgAAACAgEAABAAQA6AIAAC4HAAAYGBAAAQAEAOgBAAAWCgAAEBAQAAEA
+ BAAoAQAA/gsAADAwAAABAAgAqA4AACYNAAAgIAAAAQAIAKgIAADOGwAAGBgAAAEACADIBgAAdiQAABAQ
+ AAABAAgAaAUAAD4rAAAwMAAAAQAgAKglAACmMAAAICAAAAEAIACoEAAATlYAABgYAAABACAAiAkAAPZm
+ AAAQEAAAAQAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4d3d3d3d3
+ d3d3d3d3d3d3d3cAAAAAAIeIiPj4+Pj4+Pj4+Pj4+Pj4+Ph4AAAACHh3JyNiNiNiNiNiNiNiNiNiNniH
+ cAAACIcnInI2I2I2I2I2I2I2I2I2MiN/cAAAh4JyemJjanJ6cnpyenJ6cnpyY2poiAAAiHIqNjOmMjYj
+ ajY2JycjajYnpycnhwAAiCcnImJyemOoeHh4eHh4eHh4dyMniAAAh3KnJ6cqNjY4////////////h6an
+ hwAAiCciejJyY6Jn/4+PiPiI+I+P9ycj9wAAiCJ6JyajYnJ4+P+P+Pj4j4iPh6cmiAAAiHo2NqNjp6Ko
+ /4+Pj4+PiPiP9yJ69wAAiCYno2NiYnJ3//j4iIiIiIj492OniAAAiCOmJjpjo2p4+PiIiIiIiIiPh6Yy
+ 9wAAiHJzeHd4d3d3//j/j/j4+Ij49yemiAAAiCpqiP/4///4//+P+Pj4j4+Ph6Yz+AAAiHI3j4j4+IiI
+ +PiIiPiIiIiP9yNqiAAA96emf/j4+Pj3//j4+Ij4+IiPh6aniAAAiHI6j4+PiPiI+P+P/4//j/iP92On
+ iAAA9yp2iPj4j4iI/4iIj4j4+Pj496cm+AAAiHp6j4+IiIiI//j4j4j//4iPh6ajiAAA+CcjiPiIiIiI
+ +P//+Pj4+Pj/9yen+AAAiCp6j////4+I/4iIj4j4+PiPh6ei9wAAiHpjiIiIiIiI//iIj4iIiIj/96Y2
+ +AAA+Cenj/+IiPiIj4//////+Pj492p6iAAAiKeniPj/j4iI//+Pj4+Pj4+Ph6en+AAAiHp6j/+IiPj4
+ +P///////4iIiHp6iAAA+Cd3j4+I+PiI/4+Pj4+Pj4iIhqh3+AAAiKeoj/j/j4+I////////+I+Id3p6
+ iAAAiHeniP+I+PiI/4+Pj4+Pj4iIp6in9wAAiKeKj/j4iPj4////////+IiGiod6+AAAiDqHj/+P+P+I
+ +Pj4+Pj4/4eoqKiniAAAiGioj4/4/4/4iIiIiIiIeH53d3qK9wAAiKeKj/j/j/j///iPiH6neoqKioh6
+ 9wAAiHqIj/+P+P+Pj4iIiIeKiKiHeKin9wAAh6h3j4/4/4//+Pj4iKiod4qKioiKiAAA93d3j///j/j4
+ /4j4joeHd4eHiKin9wAAiKh4j4+P////j/iId3eoeoqKh4eKiAAAiDioj///j4+P+PiOuKiIeIiIqKh6
+ 9wAA92eIiIiIiIiIiIh4qIiod6ioiId3iAAAiHqKh4eHiHiHjod4iKiIeIiHd3eohwAAD3eoioeKh4qH
+ h3h3eIioioeHh6eHgAAACIh3p6p6emp6qqqqqqenp6qqp3h4cAAAAIiHh4eHh4h4eIiIh4eHeHh4h4eI
+ AAAAAACIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+ AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAId3d3d3d3d3d3d3eAAAAAeIiHiI
+ eIh4iHiIeIhwAACHciJyInIiciJyInInhwAIgicnononpypypyejYniACHcqcnI2d3d3d3d3d3oocAhy
+ ciKnInj///////hyeHAIenJ6cnp4+Pj4iIj/aihwCHJ6cmOmP/+Pj/j4j3NogAh6NiOmMn+IiIiIiI9q
+ OHAIgmeIiIh///+PiI+PcmiACHOn+PiPiPiI+IiIj2OocAiCd/j4+I//j4j/+P96eIAIemf4+IiPj4j4
+ +PiPY6hwCIKo+IiIiPj4+P+I/2pogAh3p//4+I/4+PiP+PhzqHAIinf4iIiPj4j4iIj/aniACHp3/4/4
+ j//////4+HeocAiHqPiIj4j4+Pj4+Ih6eIAIenj//4+P/////4j3eniACIeo+Ij4j4+Pj4+IioeocAh6
+ iI/4/4//////iH6oqIAIh6j/j4+IiIiHeOeod4hwCHqI//////iIjqioiop4cAh4ePj4+Pj4+HiKh3h4
+ qIAIeoj/////+Ih6iHioqIhwCHio+I+I+IiOiKh4h4eocAiKiIiIiOiId3iHeoeHqIAAh3qKinqKioqK
+ ioiop4gAAAiHd3eHd3d3d3d3d4hwAAAAiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAA//////AA
+ AA/gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAPgAAAH8AAAD///
+ //8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+ AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAACI
+ iIiIiIiIiIh4AAh3IiIiIiIiIid4gAhycnNnNnNnNjIngAgiNiY2iIiIiPgigAh6Y6On////j4hjgAgj
+ anYn/4iI+IimgAhqdzd3+Pj4iPgjgAg2j4+I/4+IiIhqgAgjj4+I+Pj/+PgngAh6j4iI+I+I+PimgAin
+ j4+I//j/iPgjgAh6j4iI+I+I+Pim8Ainj4+I////+Ih6gAh3j4+I/4+PiIengAinj4j4////+IqK8Ah3
+ j//4iIiIiGh3gAioj4+P+PiKioqKgAh4j///+IjoeHiogAioj/j4+IioqKiKgAh4iIiIiHiIiIeHgAiK
+ enp6eoqnp6iogACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAP///wDAAAMAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQDAAAMA////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
+ AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
+ AAAId3d3d3d3gAcioqenp6JwB6cnj4+P93AHInKI+IiGcAd4iI+Pj/KACn+Pj4+I9jAHeIiPj/j3oAev
+ +P+Pj4eAB4j4j//4ioAHf4+P+PiGgAeI//iId6igCo/4+Iioh4AIiIiIh4d4oAh6h3qKioeAAAAAAAAA
+ AAD//wAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAvkS8AL5YvAC+a
+ LwAvnS8ANYk1ADWMNQA/hj8AN484ADiPOAAwkTAAMJUwADaRNgA2lTYAMJgwADCeMAA3kzgAOJQ4ADiZ
+ OAA5nTkAMKMwADigNwAwqzAAOqE6ADumOwA8ojwAPaY8ADyrPAAxsDEAPbQ9AECLQABdi10AQK9BAEK0
+ QgBDu0QATb5NAFukXABZvlkAYY1hAGGQYgBrkGkAdJJyAHWUcwB2lnQAd5h0AHicdgB8n3oAYaphAH6i
+ fAB7sXkARMREAEjASABUwlQAW8ZbAF/KXwBjxWMAY8xjAGrMagBr0WsAbNpsAHPUcwB22HYAe9V7AHzZ
+ fACAk30AgaJ/AIDXfwCLi4sAi4uMAI2NjgCFkYEAg5eDAIaShQCIlIQAiZWIAI+PkACRkZIAlJaQAJSU
+ lQCWmZMAl5qUAJiblQCZnJYAl5eYAJiYmQCbnpgAnJ6YAJqanACdnZ0AhKSFAI+jjwCGsIQAi7OJAJC1
+ jwCYoZkAnaCaAJq6mACjp58An5+gAKGhogCjpKAApaaiAKOjpACkpKYAqqamAKOooAClqaEApqikAKio
+ pACnp6gAp66oAKioqQCrrKgAqqqsAKysrgCyrq0AqrSoALOwrwCurrAAsLCyALWxsQC2tbIAs7O0ALa2
+ tgC8tbIAtby1ALq5tQC5uLkAvbq6AL2+ugC+vLwAwreyAMK4swDBubYAxbq2AMG8uQDGvbkAwb+/AMW/
+ vADIv7wAgt2CAIrdigCSwpEAmcSXAJ7AnQCF4IUAi+KLAJPkkwClwaIAqcOnAK/HrQCzzrEAvsy8AMPA
+ vgDIwb4AwM2+AMHBwADFwsEAxcXCAMPDxADGxcYAy8PAAMrEwQDMxcIAyMbFAM3HxADCzcAAzcjGAMnJ
+ yADNysgAy8zJAM3OywDNzc4A2s3HAN3MxgDSzcoA2M7JAN7OyADP0M0A1dDOAN7QygDa0s0A3tHNAM/P
+ 0ADR0dEA1tLQANPT1ADV1dUA29XSAN7Y1QDX19gA2dnZANvb3ADc3N0A4dHKAODTzQDk08wA4tTPAOXV
+ zgDr1s4A7NfOAOzYzwDh1tIA5tfQAOjX0ADm2NIA4drWAOXa1QDo2dMA7drSAO3c0wDp2tQA7tvUAOnc
+ 1gDu3dUA4tzZAOXd2gDh390A5d/cAOne2QDt39gA8N/XAOXg3QDr4d0A8OHaAPDi3ADx5N4A4+LhAOrk
+ 4ADs5eEA6ubkAOzn5ADu6OUA6urpAOvs6wDv7+0A8ubgAPLo4gDx6eYA9OrmAPTs5wDw6+gA8u3qAPXu
+ 6gDz7uwA9O/tAPbw7QD48u8A8vLxAPn08QD5+PcA+fn4AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+ AAAAAMBUIZKSk7L4+Pn4+Pj4+Pj3+Pn46YmWjZKSkpKSkpKSkpKSkpKSkpKRI7hjAAAAAMBULzuSk5um
+ pqampqSmpJukm6Sbm5eTjZKSk5KSkpKSkpKSkpKSkpI7L6RUAAAAAH9/SjKSk5OTk5OTk5OTk5OTkpOS
+ k5OTk5OTk5OTk5OTkpOSk5KTk5IylGNjAAAAAADjUykyPJOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OT
+ k5OTk5OTOzJZbW0AAAAAAAB6uFNKJCIyMzMzMzIyMzIyMzI0MjIjMjMzMjMyMzIzMjMyNDIzL15fbm0A
+ AAAAAAAAesB6U0tMTExNTFFMTUxRTExMTExMTExMTExMTExMTUxNSkxTU2OfcgAAAAAAAAAAAAB6uMCr
+ pKCgpJ+goKCkn6CboKCfoKCgoKCgoKCgoKCgoKC3t30AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/AAAAAA/AADwAAAAAA8AAOAAAAAABwAA4AAAAAAH
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAAD
+ AADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAA
+ AAAABwAA8AAAAAAPAAD8AAAAAD8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+ AAAAAAAAAAAAAAABAAAAAQAAAAAAADCPMAAwkTAAMJYwADCaMAAwnTAAMaIxADGlMQAxqjEAMa0xADKw
+ MgA1sjUARItEAEWMRQBGlkUATJJLAFWaVABWnlUAXZNcAF6VXABemF0AYJteAGCeXgBGu0YAS79LAEy9
+ TABVu1YAYaJfAHmXdwBzm3EAc5p0AHSadAB9kH4Ae5R8AH2XfgB6mHgAfJp6AH6cewB+nXwAYqVgAG+q
+ bQB0r3IAfaJ+AFHCUQBVx1UAVshWAFrHWgBfw18AWstaAFzMXABnx2YAYcthAGHPYQBoz2gAb8tuAGXS
+ ZQBo02gAa9ZrAG/TbwBu124AbNpsAHbXdgBy2nIAeNJ4AH3bfQB94H0AhoaGAI2NjQCBlIIAhJKEAIeU
+ hwCAmoEAgp2DAISYhQCQkJEAk5OUAJWVlgCXl5gAmZmaAJubnACenp8AgaWCAIWghgCDp4QAhqaEAIao
+ hQCIqoYAiayHAIejiACJpooAiamJAIuqjACMq40Ai6yMAIysjQCZopoAmqiaAJe3lQCetp4AnrybAKOn
+ nwCgsp4An7egAKGhogClpaYApa2iAKavpACmpqgAqamqAKqqrACtra4AprKmAKiwpQCjvKQApL6kAKm4
+ pwCsuakAqr6rALixrgCvr7AAr7uwALGxsQC1t7MAs7O0ALW1tQC7trQAsr+yALy4twC5ubkAvrq5ALu7
+ vAC+vb0Awru3AMa6tQDDvLkAxL+9AMi9uQCOzo0AhN6EAJPDkgCSx5EAlMiSAJXRlACd1J0Ant6eAKDf
+ nwCK4YoAkeSRAJrgmgCiwKAApsKlAKPIowCmyqYAp8OoAKnGqQCpyqoArsqtALLNsQC6w7oAt9G1ALrU
+ uQDGwL4AysG9AM3BvAC/v8AAwcHBAMXCwgDDw8QAxcXGAMjCwADNxMEAz8fEAMjIxgDHx8gAycnJAM3K
+ yQDNzMsAzMzMANDFwQDRyMUA1MvHANHNywDUzcoA0s7NANXPzADW0M4A2NHOANXU1ADY09AA2tTRANzW
+ 0wDa1dQA3djVANrZ2QDf29gA3d3dAODSzQDl1M0A7NfOAOzYzwDi1tEA5tfQAOfZ0wDg2dYA5NrVAOrZ
+ 0gDs2dEA6dvVAO7b1ADu3dYA4drYAOLd2gDl3tsA6t7YAO/f2ADl4N0A6uDbAO7h2wDp4t0A7uPdAO/k
+ 3wDw4doA8ePcAPHk3gDj4uEA5OPiAOTk4wDl5eQA6OLgAOrk4ADt5eEA6OfmAOzn5ADu6OQA6urpAO3q
+ 6QDt7OoA7u7sAPDm4QDx6eUA9OnkAPXs5wDw6+gA8u3qAPXu6QDy7uwA8vDuAPbw7QD48u8A8/HwAPXz
+ 8QD09PIA+PPwAPj08gAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHlK
+ QkJCQkJCQkJCQkJCQkJCQkJCQkJDbQAAAAAAAABQbW9iYmJiYmJiYmJiYmJiYmJiYmJiZnilSgAAAAAA
+ bWANAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ2eUAAAAK5tDQECAgICAgICAgICAgICAgICAgICAgICAg2l
+ eQAApEYBAQICAgICAgIOJSUlJSUlJSUlJRwlHA8CAn5NAACkHAIEAgQCBAIEAhDg/f39+Pj29vb29vbs
+ EgIEcUoAAKQcAgQEBAQCBAQEEODw7u7W1tbGxsbGxvYSBAKWUAAApEcEBAQEBAQEBAQQ4Pju7u7W1tbO
+ xsbG6RIEBHFQAAClRwQEBAQEBgQEBhHg+MSysrKIiIiIiMbsFAQGllAAAKVYBgYdb29qb2pqZOD48PDm
+ 3Nzczs7OzuwUBgSZZwAArVgGBlTs5tzc1Nyr4PjCvLjmuLS0qqrW7BUGBplnAAClWwYGVezWzMzJybLg
+ +Obm1Pa08ObctNzsFQYGm2sAAK5bCAZV7NzMyMm6iOD31MK+6br29PC07vYWCAiZbQAArlsICFfs1KmH
+ hIR24P3cwszpxPb097rw7BsICJttAACuWwgIV+zm5tzc1rTg9+bUwva45vDmuPD2GwgIm20AAK5bCwtV
+ 7NyppKm6fef4wsLE5r6+usS6+OwnCwubbQAArlsXGGHs6dTm5r6l5vj49vb3+Pb29tTm4CgYGJttAACu
+ WxgrY/jmvK68wq7s+Pf39/f39/fCh32eKSsYm20AAK1bKy6W7Ozg5uDCuOz99/399/39977CwmYvLiub
+ bQAApVssM5b46cLCwsK47P399/399/33wrxzMjMzLJtnAAClVy43mf3swtTg8Lzg/f39/f39/f3CczY1
+ NTUum2cAAKVVNDqb/fb29vb25sK8vK6upYuNjYs/Ojo6OjeYZwAApVE3PZ347Pbw9vb29vaqpap5PT09
+ PT0/PT0/N5hQAACkKjlAn/329vbw9vbw9q7srYlAQEBAQEBAQEA7mEoAAKQqO4qg/fb2+Pj29vj2uK6O
+ ioqKioqKioqKij2YTQAApUY5kqDg4Obg4ODg4OCuj5KSkpKSkpKSkpKSPJZQAACuahqSlJGRkZGRkZGR
+ kZSTk5OTk5OTk5OTk5IreXkAAACtRho9QUFBQUFBQUFBQUFBQUFBQUFBQUE7K2BnAAAAAAClZxwdHh4e
+ HR4dHh0eHR0dHR0dHR0dHUZndwAAAAAAAACupYB5gHmAeYB5gHmAeYB5gHmAeYB7gK0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////8AAAD+AAAAfAAAADgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABwAAAA+AAAAfwAAAP/////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+ AAAAAAAAAAEAAAABAAAAAAAAL5EvAC+WLwAvmi8AMowyADWLNQAwkTAAMZQxADSSNAAwmjAAMZ4xADSZ
+ NAA1nzUAMKEwADClMAA1ojUANqY2ADCpMAAwrTAANqk2ADetNgA7rzsAObM5ADyxPABWklYAW5ZaAFuY
+ WQBcmFoAX5pfAEi4SABNvE0AZ5tlAG6ibABmtmcAabppAG2/bQBRwFEAVsBWAFbFVgBYxlgAXsZeAF3J
+ XQBizGIAZcxlAGvRawBs0WwAbdVtAHDRbwB11nUAedZ5AH/bfwB+3H4AhKGBAIK0gACRvY8Al6iVAJuh
+ nACcpJ0AoaGiAKenqACpqaoArq6uAKu7qQCvvq4AsL+uAK+vsACwsLAAsbaxALW1tgC+t7QAvrm3ALe3
+ uAC4uLkAvLy9AIPJggCC24IAid+JAJfBlQCH4IcAjeONAJDjkACjyaIArM6rALDArgCl2KQAqdmoALHC
+ sACyxLEAysC7AM3DvwC/v8AAwcHCAMPDxADFxMUAycLAAMrFwgDPx8MAycbGAM3HxQDIycYAx8fIAMnJ
+ yADOy8oAy8zIAM3MygDPz88A1cfBANHKxgDVycQA18zHANjLxgDVzswA2c7JAMnXxwDN1ssAy9rKANrQ
+ ywDa0c0Az8/QANbS0ADV1NIA1tbVANrV0QDc1dEA2tbUANnZ1wDe2NUA3NrZANvc2gDe3NsA3t7dAOXS
+ ygDl08wA5dXOAOfY0gDi2tYA6NnTAO3Z0QDp3NYA7t3WAOHb2ADi3NoA5N3ZAOXf3ADq39oA4OHfAOfg
+ 3QDr4NsA6OHeAPDg2QDw4twA4uLhAOnj4ADq5OEA7OXiAO/p5QDv6ugA8ebhAPHq5gDy7eoA9u7qAPPv
+ 7AD17+wA9vHuAPjy7gD08vEA+PTyAPn29AD6+PYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJOkE9PT09PT09PT09PT09
+ PUI7QgAAAGQ4GQUFBQUFBQUFBQUFBQUFBQUcREkAAEIZAQEBAQEBAQcHBwcHBwcHBwcBHD0AAEcFBwcB
+ AQEBH2dnZ2dnYWddYTcBB0kAAEILCQEDAwMDIKSdlpWLi4mJiz8LB0kAAEkHCwMDCwMDIKadk4uGhYWF
+ iz8DB0kAAEkLDRwaHBoZNKaTenVwbmpqi1MNC1oAAEkND2eYmJiYYaaZfo6GdXBullMNDV0AAF0PEGeT
+ hoaFWKaemZ56np11nVYND10AAF0NFWeTZm5YRaaOb4Z6pKB6nlYSDWcAAF0VEmeZmH6GXaaemZt6np56
+ oFYSFWQAAF0VF2eZYWF1RaaZjpiOjn5+pFYXF10AAF0dJXmejo6OZ6ampKCmoKB6eT4kHV0AAF0eKHmb
+ jn+OZ6ampKampqBdYTUnHl0AAEkkK36cenqOZ6impqampqBkNisrJF0AAEkkL3+cnJygf5F/f39yc3JN
+ LCwsJF0AAEkpMZGkoJymoKB6ZWFKLzAvMS8wKkkAAEIrS5GcppygnKR5f1FLMzMzMzMzK0gAAEkrTJil
+ pqWmpaV5UkxOTk5OTk5OK0gAAEghTFVVVVVVVVVUUFBQUFBQUFBMIzwAAHY4IiwuLi4uLiwsLC4sLi4u
+ LiwiOFsAAAByR0E9PDw8PDxBPTw9PTw9PT1DZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AMAA
+ AwCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAMAAAwD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+ AAAAAQAAAAEAAAAAAAAwkjAAMJYwADeSNgAwmzAAR5VGAEeZRgBInUcASZVIAFWUUwBWllUAWJtZAEii
+ RwBJp0gAVqBVAFSvUwBcp1sAW6FcAF2mXQBcq1sAXqtfAGiWaQBynnIAZ6NnAGmqagBqrmsAZLFlAGe0
+ ZgBgv2AAbLJsAGy2bABuuW4AeaZ6AHupewByu3MAdb11AHqzegB5tHoAeL14AGTNZAB0wXUAe8F6AHnG
+ eQB8xnwActVyAH7RfQCcvpsAp6moAKusqwCrr6wAt7q3AIbBhwCByoEAhsmFAIXOhgCF0IQAgN2AAIXZ
+ hACK0IoAncGcAJHQkQCS35IAnNecAJvemwChw58AjeKNAL3AuwC52rkAx8e/AMnGxgDIycIAyszFAM7O
+ ygDZycMA28zGANbOygDE08MA1NHPAN3QygDY0s8A39TPANbS0ADZ09AA2tTRANrW1QDe2NYA3dvaAN/d
+ 2wDj1c4A4NbRAOPZ1QDl2dQA4NvYAOLc2QDk3dkA4d7cAOjf2wDC4sEA5eDeAOjh3gDt4dwA8ePdAPHk
+ 3wDt5eEA6+bkAO3o5QDy5+IA8ermAPTq5QDx7OkA9e7qAPPw7gD08O0A+PLvAPXy8AD29PEA+PPwAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAADAWFxcXFxcXFxcXFyAvAAAVAQEBAQgKCgoKCgoB
+ IQAACgECAQIubmxqZmZqCBgAAAsCBAIEO2pZTkpKZAYYAAARDkdHREhsXGBOTmQHHQAAERNnW1hZZ1xi
+ bFtnDR0AABMTZ1lITW5cXG5cbw0fAAAaG21NWU1uZGdqXG0PKAAAHSttVFZWb3Nzb01CHCsAAB81bVxi
+ VnNzc3NIKyc1AAAiPHNubmpNR0A3LSwsNQAAIj5zbW9vX0w5OTg4ODoAACU+YWFhYUM9QUFBQUEzAAAy
+ JSYmJiYmJiYrIiYlMAAAAAAAAAAAAAAAAAAAAAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+ AACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fX4GeHh5Onp6
+ emmAgIF8gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GB
+ gn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf4GBgn+BgYJ/gYGCf39/
+ gHx4eHlpdnZ3Onp6ewYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISFBnl5
+ enSOjo7klpaX/pKSk/6Ojo7/i4uM/ouLi/+Li4v+i4uM/ouLjP6Li4v/i4uL/ouLi/6Li4v/i4uL/ouL
+ i/6Li4v/i4uL/ouLi/6Li4z/i4uL/ouLi/6Li4z/i4uM/ouLi/6Li4v/i4uL/ouLjP+Li4z+i4uM/ouL
+ i/+Li4z+i4uL/oyMjP+Ojo/+jY2O/oWFhuR1dXZ0enp7BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACHh4gVjIyNxqSkpf+ZmZr/wMDB/87Ozv/Pz8//0NDQ/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR
+ 0f/R0dH/0dHR/9HR0f/R0dH/0dHR/9HR0v/Y2Nn/1tbW/62trf+Pj4//fn5/xnh4eRYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAJOTkwaUlJXGpqan/qSkpf6nrqj/X4tf/j+GP/42iDb/NYk1/jWJNf81iTX+NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJNf41iTX/NYk1/jWJ
+ Nf41iTX/NYk1/jWJNf81iTX+NYk1/jWJNf81iTX+NYk1/jaINv8/hj/+YY1h/rW8tf/U1NT+jIyM/oCA
+ gMZ9fX4GAAAAAAAAAAAAAAAAAAAAAImJinTFxcX/n5+g/oOXg/41izX/L5Av/i+QL/4wkDD/L5Av/jCQ
+ MP8vkC/+L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+QL/4wkDD/L5Av/i+Q
+ L/4wkDD/L5Av/i+QL/4wkDD/L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jCQMP8vkC/+L5Av/jWM
+ Nf+Po4/+1NTV/pKSk/96ent0AAAAAAAAAAAAAAAAmpqbB7CwsOSnp6j/maCa/zWNNf8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP81jTX/tby1/7Ozs/+Li4zkg4OEBwAAAAAAAAAAl5eYO9PT1P6fn5//XItc/i+S
+ L/4wkjD/L5Iv/i+SL/4wkjD/L5Iv/jCSMP8vki/+L5Iv/i+SL/4wkjD/L5Iv/i+SL/4wkjD/N5Q3/jmU
+ Of45lTn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf45lDn/OZQ5/jmUOf85lDn+OZQ5/jmU
+ Of85lDn+OZQ5/jmUOf80kzT+L5Iv/jCSMP8vki/+YZBi/tra2v+VlZb+gICBOwAAAAAAAAAAnJydatPT
+ 0/6cnJ3/QItA/i+TL/4wkzD/L5Mv/i+TL/4wkzD/L5Mv/jCTMP8vky/+L5Mv/i+TL/4wkzD/L5Mv/i+T
+ L/42ljb/i5eI/p6hm/6eoZv/naCa/p2fmf6cn5n/nJ6Y/puemP6bnZf/mp2X/pmclv6ZnJb/mZuV/pib
+ lf+Ym5X+l5qU/pealP+XmZP+lpmT/pSWkP9rkGn+L5Mv/jCTMP8vky/+QItB/tvb2/+ZmZn+g4OEagAA
+ AAAAAAAAq6urfc3Nzv+ZmZr/N484/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP85mDj/o6ef//n6+f/6+vj/+fn4//n5+P/5+fj/+fn3//n59//5+fj/+fn3//n4
+ 9//5+Pf/+fj3//n49//5+Pf/+fn3//n49//5+Pf/+fn3/+nq6f90knL/MJUw/zCVMP8wlTD/OI84/9XV
+ 1v+YmJn/jIyNfQAAAAAAAAAAr6+wf87Ozv6bm5z/N5E3/i+WL/4wljD/L5Yv/i+WL/4wljD/L5Yv/jCW
+ MP8vli/+L5Yv/i+WL/4wljD/L5Yv/i+WL/45mjj/o6ig/vn5+P706+b/8+ji/vLm4P7y5d//8ePd/vDi
+ 2/7w4Nr/79/Y/u/e1/7u3dX/7tzU/u3c0//t29P+7tvT/u3b0//t29P+8eXf/urq6f90knL+L5Yv/jCW
+ MP8vli/+N5E3/tXV1v+ampv+j4+QfwAAAAAAAAAAsbGyf8/Pz/+dnZ7/N5M4/zCYMP8wmDD/MJgw/zCY
+ MP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP8wmDD/MJgw/zCYMP85mzj/pKmh//n5+P/06+b/8+fi//Lm
+ 4P/y5N7/8eLb//Dg2f/w39f/7t3V/+7b1P/t2tL/7dnR/+zYz//s187/7NfO/+zXzv/s187/8OLc/+rq
+ 6f91k3L/MJgw/zCYMP8wmDD/N5M4/9bW1/+dnZ7/kZGSfwAAAAAAAAAAs7Ozf9DQ0f6fn6D/OJQ4/i+Z
+ L/4wmTD/L5kv/i+ZL/4wmTD/L5kv/jCZMP8vmS/+L5kv/i+ZL/4wmTD/L5kv/i+ZL/45nDj/pamh/vn5
+ +P717en/9Orl/vPp4/7z5+H/8uXf/vHj3f7x4tv/8ODZ/u/e1/7u3NX/7tvT/u3Z0f/s2ND+7NfP/uzX
+ zv/r1s3+8OLc/urq6f91lHP+L5kv/jCZMP8vmS/+OJQ4/tfX1/+fn6D+lJSVfwAAAAAAAAAAtLS1f9HR
+ 0v6hoaL/OJY4/i+bL/4wmzD/L5sv/i+bL/4wmzD/L5sv/jCbMP8vmy/+L5sv/i+bL/4wmzD/L5sv/i+b
+ L/45njj/paqi/vn6+f727+v/9ezn/ufe2v7l29f/5NrV/uLX0/7i1tH/4dTP/uDTzf7f0cz/39DK/t7O
+ yP/dzcf+3czG/t/Nxv/s187+8OPd/urq6v91lHP+L5sv/jCbMP8vmy/+OJY4/tjY2P+hoaP+lpaXfwAA
+ AAAAAAAAtra2f9LS0/6jo6T/OJg4/i+dL/4wnTD/L50v/jGdMf4xnjH/MZ4x/jGeMf8xnjH+MZ4x/jGe
+ Mf4xnjH/MZ4x/jGeMf46oDr/pqqi/vn6+P738O3/8erm/s3Gw/7MxMH/y8PA/sjAvf7Hv7v/xr26/sa8
+ uf7Fu7f/xbq2/sO5tf/CuLP+wrey/sO3sv/r18/+8ePd/urq6v92lXP+L50v/jCdMP8vnS/+OJg4/tnZ
+ 2f+kpKX+mJiZfwAAAAAAAAAAt7e4f9PT1P+lpaf/OZo5/zCfMP8wnzD/OKA3/4CTff+IlIX/iJSE/4eT
+ hP+Gk4P/hpOD/4WSgv+EkYH/hJGB/4SQgP+GkYL/qqem//n6+f/38e3/9u/r//Dp5f/u5+P/7ubh/+3k
+ 3//s497/6+Hc/+vf2v/q3tj/6dzW/+ja1P/o2dP/59fR/+jX0P/t29P/8eXf/+rr6v92lnT/MJ8w/zCf
+ MP8wnzD/OZo5/9nZ2v+mpqf/mpqbfwAAAAAAAAAAuLi5f9TU1f6np6j/Opw6/jCgMP4xoDH/PKI8/qOk
+ oP7r7Ov/6+vq/uvr6v/r6+r+6+vq/uvr6v7r6+r/6uvq/urr6v7n5+b/sa6u/vn6+P738e3/9u/r/vLr
+ 6P7x6ub/8enl/vDo5P716+f/8+nk/u7k3/7u4t3/7ODb/uzf2f/r3df+6tvV/uvb1P/u3dX+8ubg/urr
+ 6v93l3T+MKAw/jGgMf8woDD+Opw6/tra2/+oqKn+nJydfwAAAAAAAAAAubm6f9XV1v6pqar/Op06/jCi
+ MP4xojH/PaM8/qSmov7v7+3/6uLd/urg2//p3tr+6N3Y/ujc1v7n29X/5trU/ubZ0v7j1c//sq2s/vn6
+ +P738e3/8uvn/s/Jx/7Nx8X/zcfE/sjCv/7o4d3/39jU/szFwv7Lw8D/x7+8/se+uv/Gvbn+xby4/sa8
+ uP/u3tf+8uji/urr6v93mHT+MKIw/jGiMf8wojD+Op06/tvb2/+qqqv+np6ffwAAAAAAAAAAurq7f9bW
+ 1/+rq6z/Op86/zGkMf8xpDH/PaU8/6Wmov/v7+3/6uDb/+nd1//o29b/59nU/+fY0v/m19D/5dXO/+TT
+ zP/h0Mn/sq6t//n6+f/38e3/9e/r/+Xe2//j3Nn/49zZ/+Ha1//z7Oj/3dfT/9jSzv/u5uL/7eTg/+3j
+ 3v/s4tz/6t7Z/8W8uP/u4Nr/8+nl/+rr6v93mXX/MaQx/zGkMf8xpDH/Op86/9vb3P+srK3/n5+hfwAA
+ AAAAAAAAu7u8f9fX2P6srK7/OqE7/jCmMP4xpjH/Pac8/qano/7v7+3/6+Ld/urf2v/p3tj+6dzX/uja
+ 1f7n2dP/5tfR/uXWz/7i08v/sq6t/vn6+f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV
+ 0f727ur/9e3p/vXs5//06uX+8ufi/sa+uv/v493+9Ovn/urr6v94mnX+MKYw/jGmMf8wpjD+OqE7/tzc
+ 3P+tra/+oaGifwAAAAAAAAAAvLy9f9jY2P6tra//O6M7/jCoMP4xqDH/Pak8/qaopP7v7+7/7OTg/uvi
+ 3f/i2dT+4NfS/t/V0P7e087/3tHN/t3Qy/7azcf/s6+u/vr6+f738e3/9O3p/tXPzf7Tzcr/0szJ/s/I
+ xv7t5uL/3tfV/tvV0v738Oz/9+/r/vbu6v/27ej+8+nl/si/vP/x5uH+9e3p/uvr6v94m3b+MKgw/jGo
+ Mf8wqDD+O6M7/tzc3f+vr7D+oqKjfwAAAAAAAAAAvb2+f9jY2f+urrD/O6U7/zGqMf8xqjH/Pas8/6eo
+ pP/v7+7/7ebi/+Xd2f/Cvbr/wry5/8C6t/++uLT/vbaz/721sf+8tLD/sa2s//n6+f/38e3/9O3p/9rT
+ 0f/X0c7/1tDO/9PNyv/v6OT/3dfU/9vV0v/38Oz/9/Ds//fv6//27+v/9Ozn/8jBvv/y6OP/9u/r/+vr
+ 6v95nHb/Maox/zGqMf8xqjH/O6U7/93d3f+wsLH/o6OlfwAAAAAAAAAAvb2+f9jY2f6vr7H/O6c7/jCs
+ MP4xrDH/Pa08/qiopP7v7+7/7ebi/uzk4P/f2dX+3tfT/t3W0v7c1ND/29PO/tvRzP7Yzsn/s7Cv/vn6
+ +f738e3/9u/r/vbv6/738Oz/9u/r/vbv6/738Oz/3dfU/tvV0v738Oz/9u/r/vfw7P/38Oz+9O3p/sjC
+ v//z6ub+9/Ht/uvr6v95nXb+MKww/jGsMf8wrDD+O6c7/t3d3f+wsLL+pKSlfwAAAAAAAAAAvr6+f9nZ
+ 2f6wsLH/O6g7/jCuMP4xrjH/Pa49/qippf7v7+7/7ebi/u3m4v/s5eH+6+Tg/uvj3/7q4t7/6+Ld/urg
+ 2/7m29b/tbGw/vn6+f738e3/9e7q/uDa1/7e2NX/3tfV/tzV0v7x6ub/3dfU/tfRz/7r5eH/6uTg/urk
+ 4P/r5OD+6eLf/sjCv//z7Oj+9/Lv/uvr6v96nnf+MK4w/jGuMf8wrjD+O6g7/t3d3f+xsbP+pKSmfwAA
+ AAAAAAAAvr6+f9nZ2f+wsLH/O6o8/zGwMf8xsDH/PbA9/6mppf/v7+7/7ebi/+fg3P/Gwb//xcC+/8S/
+ vf/AvLn/49vX/9TNyv/Dvbr/s6+v//n6+f/38e3/8+zo/9HLyf/Pycf/zsjG/8rEwf/q5OD/4tzZ/8/J
+ x//OyMb/y8XC/8rEwv/LxML/ysTB/83Gw//17ur/+PPw/+vr6v96n3j/MbAx/zGwMf8xsDH/O6o8/93d
+ 3f+xsbP/paWmfwAAAAAAAAAAvr6+f9nZ2f6vr7H/Pq0+/kG3Qf49tj3/RrVG/qusqP7v7+7/7ebi/urj
+ 3//Uzsv+083K/tLNyv7Qy8j/6OHd/s/Kxv7MxsP/tbGx/vn6+f738e3/9u/r/vXu6v717ur/9O7q/vTt
+ 6v738Oz/9u/r/vTu6v707er/9O3p/vTt6f/07en+8uvn/vHr5//z7Oj+9PDt/urq6f9+onz+P7c//kK4
+ Qv9GuUb+P60//t3d3f+xsbL+pKSmfwAAAAAAAAAAvb2+f9jY2f6vr7D/P68//k6+Tv5Ovk7/Wb5Z/ra2
+ sv7x8fD/7+nm/u/p5f/v6OX+7+jl/u7o5P7u6OT/7ujk/tPOy/7Uz8z/u7e3/vr6+f738u7/9/Dt/vfw
+ 7f738O3/9/Dt/vfw7f738e3/9/Dt/vfx7f738e3/9/Ht/vfx7f/07uv+7Obj/ubg3f/l39z+5+Ph/uLi
+ 4f9+n3z+Tr5O/k6+Tv9Ovk7+QK9B/t3d3f+wsLL+o6OlfwAAAAAAAAAAvb2+f9jY2f+urq//QLFA/1LB
+ Uv9SwVL/XcFd/7i4tf/y8vH/8Orn/+3n5P/Y09H/19LQ/9bRz//U0M3/6+Xi/9fT0f/Z1NL/wr+///v7
+ +v/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//48u//+PLv//jy7//x7On/0s3L/8bB
+ v//FwL7/yMXE/8rJyP+Bon//UsFS/1LBUv9SwVL/QbFB/9zc3f+vr7D/o6OkfwAAAAAAAAAAvLy9f9fX
+ 2P6tra7/QLJA/lfEV/5XxFf/YcRh/rq7t/7y8vH/8Ovn/uvm4//Szsz+0c3L/tHMy/7Oy8j/6eTh/tjU
+ 0f7Z1dP/xMHA/vv7+v749PD/+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy7/748+//+PLv/vjy
+ 7//s5uP+s6+v/sjGx//FxMT+v729/qqmpv97sXn+V8RX/lfEV/9XxFf+QrNC/tzc3f+urq/+oaGjfwAA
+ AAAAAAAAu7u8f9bW1/6rq63/QLRB/lvHW/5bx1v/Zcdl/ry9uf7y8vH/8evo/vDr6P/w6uf+8Orn/vDq
+ 5/7w6uf/8Orn/tnV0/7a1tT/xsPC/vv7+v759PH/+PLv/vjy7/758/D/+PLv/vjy7/758/D/+PLv/vjy
+ 7/758/D/+PLv/vjy7//s5+T+vbq6/urq6v/g39/+vry8/oawhP9cx1z+W8db/lvHW/9bx1v+QrRC/tvb
+ 3P+srK7+oKChfwAAAAAAAAAAurq7f9bW1v+qqqv/QbVB/1/KX/9fyl//acpp/76/u//y8/H/8ezp/+/q
+ 5//j39z/497b/+Ld2//h3dr/7+nm/9rW1P/a1tT/x8XE//v7+v/59PH/+fPw//nz8P/58/D/+fPw//nz
+ 8P/58/D/+fPw//nz8P/58/D/+fPw//jz7//t6OX/vru7/+Hh4f/BwL//i7OJ/2HKYf9fyl//X8pf/1/K
+ X/9fyl//Q7ZD/9vb2/+qqqz/np6gfwAAAAAAAAAAubm6f9XV1f6oqKn/QbdB/mTNZP5kzWT/bc1t/sDB
+ vv7z8/L/8ezp/uzn5P/Szs3+0s7N/tHOzP7Oy8j/6eTh/t3Z1/7Rzsz/x8XE/vv7+v769/X/+vf0/vr3
+ 9P769/T/+vf0/vr39P769/T/+vf0/vr39P769/T/+vf0/vr39P/w7ev+vbu7/sXDw/+RtY/+Zsxm/mTN
+ ZP9kzWT+ZM1k/mTNZP9kzWT+Q7hE/tra2/+oqKr+nZ2efwAAAAAAAAAAt7e4f9TU1P+mpqf/QbhC/2nQ
+ af9p0Gn/ctBy/8LDwP/z8/L/8u3q//Hs6f/u6eb/7ejm/+3o5f/t6OX/8ezp//Dr6P/r5uT/ycbG//Hx
+ 8P/y8vH/8fHx//Hx8f/x8fH/8fHx//Hx8P/x8vH/8fHw//Hx8P/x8fD/8fHw//Hx8P/q6un/t7Sz/5q6
+ mP9qz2r/adBp/2nQaf9p0Gn/adBp/2nQaf9p0Gn/RLlF/9ra2v+np6j/m5ucfwAAAAAAAAAAtra3f9LS
+ 0/6kpKX/QrpC/m3Tbf5t023/dtJ2/sTGwv7z9PP/8u3q/vLt6v/x7er+8u3q/vLt6v7y7er/8e3q/vHt
+ 6v7w7On/0s7N/s3Kyf7Oysn/zMnH/snGxf7HxMP/x8PC/sfExP7FwsL/rLWp/qbCo/6mw6T/psOk/qXB
+ o/+jwKH+mcSX/nHScf9t023+bdNt/m3Tbf9t023+bdNt/m3Tbf9t023+RbtF/tnZ2f+kpKb+mZmafwAA
+ AAAAAAAAtbW1f9HR0v6ioqP/Q7tD/nPVc/5z1XP/e9V7/sfIxf709PT/8+7r/vPu6//z7uv+8+7r/vPu
+ 6/7z7uv/8+7r/vPu6/7z7uv/8+7r/vPu6/7z7ev/7ejm/tnV0/7RzMr/0MvK/tTR0P7R0ND/kLWP/nPV
+ c/5z1XP/c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+c9Vz/nPVc/9z1XP+RrxG/tjY
+ 2P+ioqP+l5eYfwAAAAAAAAAAs7O0f9DQ0f+goKH/Q7xD/3fYd/932Hf/gNd//8nKxv/09fT/8+7s//Pu
+ 7P/z7uv/8+7s//Pu7P/z7uz/8+7r//Pu6//z7uz/8+7r//Pu6//z7uv/5eHf/7u5uf/GxMT/xMLC/8G/
+ v/+1srL/ksKR/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fYd/932Hf/d9h3/3fY
+ d/932Hf/R71H/9fX2P+goKH/lJSWfwAAAAAAAAAAsrKyf8/P0P6dnZ7/Q75D/nzafP582nz/hNqE/svM
+ yf709fT/8+/s/vPv7P/z7uz+8+/s/vPv7P7z7+z/8+7s/vPu7P7z7+z/8+7s/vPu7P7z7uz/5eHf/sfG
+ xv7o6Oj/4eHh/sjHxv6ewJ3/fdl9/nzafP582nz/fNp8/nzafP982nz+fNp8/nzafP982nz+fNp8/nza
+ fP982nz+fNp8/nzafP982nz+SL9I/tbW1/+dnZ7+kpKTfwAAAAAAAAAAsLCxf87Oz/6bm5z/RL9E/oDd
+ gP6B3YH/iNyI/s3Oy/719fT/9PDt/vTv7f/z7+z+9O/t/vTv7f707+3/8+/s/vPv7P707+3/8+/s/vPv
+ 7P7z7+3/5+Lg/snHx/7i4uL/y8rK/qTCov6C3IL/gN2A/oDdgP6B3YH/gN2A/oHdgf+A3YD+gN2A/oHd
+ gf+A3YD+gN2A/oHdgf+A3YD+gN2A/oHdgf+A3YD+ScFJ/tXV1f+bm5z+kJCRfwAAAAAAAAAArKytfdHR
+ 0f+ZmZr/RL9E/4TfhP+F34X/jN6M/8/Qzf/19vX/9fLv//Xx7//18e//9fHv//Xx7//18e//9fHv//Xx
+ 7//18e//9fHv//Xx7//08e//6ebl/8jGxv/Ozc3/qcOn/4fdh/+F34X/hd+F/4Xfhf+F34X/hd+F/4Xf
+ hf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/hd+F/4Xfhf+F34X/SMBI/9PT1P+ampz/jY2OfQAA
+ AAAAAAAAnp6fatvb2/6YmJn/RbVG/oXghf6J4Yn/keCQ/tDRzv7z9PP/8/Pz/vP08//z8/P+8/Tz/vPz
+ 8/7z8/P/8/Pz/vPz8/7z8/P/8/Pz/vPz8/7z8/P/6urq/sLAwP6vx63/i9+L/onhif6J4Yn/ieGJ/onh
+ if6J4Yn/ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+J4Yn+ieGJ/onhif+F4IX+R7ZH/tLS
+ 0v+cnJ3+hYWGagAAAAAAAAAAm5ubO9vb2/6cnJz/XKVc/nDbcP6O447/kuKS/r7PvP7Cz8D/ws/A/sLP
+ wP/Cz8D+ws/A/sLOv/7Bzr//wc6//sHNv/7Bzb//wM2+/sDNvv6/zL3/vcq7/rPOsf6R4pH/juOO/o7j
+ jv6O447/juOO/o7jjv6O447/juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7jjv+O447+juOO/o7j
+ jv9s2mz+Yaph/sbGxv+enp/+hISFOwAAAAAAAAAAoKCgB7GxsuS3t7f/iJSJ/0XGRf+K44r/kuSS/5Lk
+ kv+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Pkk/+T5JP/k+ST/5Lk
+ kv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lkkv+S5JL/kuSS/5Lk
+ kv+S5JL/kuSS/4Xhhf9AxUD/qLSo/6Cgof+UlJXkioqKBwAAAAAAAAAAAAAAAI+PkHTg4OD/kpKS/naV
+ dv5Fx0b/dd51/pHkkf6V5pX/luaW/pbmlv+W5pb+luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbm
+ lv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv6W5pb/luaW/pbmlv+W5pb+luaW/pbm
+ lv+W5pb+luaW/pXmlf+P5I/+cN1w/kDGQP+EpIX+pqan/qenqP9/f4B0AAAAAAAAAAAAAAAAAAAAAKCg
+ oAaenp/G1tbX/pCQkf6GkYf/WqNb/kS2Rf5Fw0X/RcRF/kXERf9FxEX+RcRF/kXERf5FxEX/RcRF/kXE
+ Rf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXERf5FxEX/RcRF/kXE
+ Rf9FxEX+RcRF/kXERf9FxEX+RcRF/kXDRf9EtkT+XKRd/pijmf+enp/+p6eo/o+Pj8aKiosGAAAAAAAA
+ AAAAAAAAAAAAAAAAAACampoVnZ2dxd/f3/+zs7T/lJSV/4+PkP+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/46O
+ j/+Ojo//jo6P/46Oj/+Ojo//jo6P/46Oj/+Ojo//jo6P/4+PkP+UlJX/mJiZ/6Ojo//Dw8T/k5OUxYmJ
+ ihUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn5+fBoyMjHSurq7k19fY/tjY2P7MzMz/x8fH/sbG
+ x//Gxsf+xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbG
+ x/7Gxsf/xsbH/sbGx/7Gxsf/xsbH/sbGx//Gxsf+xsbH/sbGx//Gxsf+xsbH/sjIyP/Pz9D+0NDQ/qys
+ rOOHh4d0lZWVBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKAGl5eXOpaW
+ l2ihoaJ8pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Sk
+ pH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6SkpH+kpKR/pKSkf6Gh
+ oXyVlZZolpaWOp6engYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAPwA
+ AAAAPwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPwA
+ AAAAPwAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB9fX02ioqKqoaGh+mHh4f9hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aG
+ h/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaH/4aGh/+Ghof/hoaG/YODg+mCgoOqd3d4NgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAjIyNap2dnvytra7/prKm/561nv+ftp//n7ef/5+3n/+ft5//n7ef/5+3
+ n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft5//n7ef/5+3n/+ft6D/r7uw/8HB
+ wf+VlZX8e3t8agAAAAAAAAAAAAAAAI+Pjzavr6/8maKa/0SLRP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCPMP8wjzD/MI8w/zCP
+ MP8wjzD/RYxG/7rDuv+Xl5j8fHx9NgAAAAAAAAAAr6+vq6enqP9EjET/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCRMP8wkTD/MJEw/zCR
+ MP8wkTD/MJEw/zCRMP8wkTD/Ro5G/8XFxf+JiYqrAAAAAAAAAAC5ubnph5SH/zCTMP8wkzD/MJMw/zCT
+ MP8wkzD/MJMw/zCTMP8wkzD/MJMw/0aWRf99m3v/f559/3+dfP9+nHz/fpx7/32be/98mnr/fJp6/3ya
+ ef97mXn/e5l5/3qYeP95l3f/TJJL/zCTMP8wkzD/sr+y/42NjukAAAAAAAAAALu7vP57lHz/MJUw/zCV
+ MP8wlTD/MJUw/zCVMP8wlTD/MJUw/zCVMP8wlTD/VZlU/+Pi4f/49fP/9/Tx//fz8P/38u//9/Lv//bx
+ 7v/28O3/9fDt//bw7f/28O3/9vDt/+7u7P9dk1z/MJUw/zCVMP+jvKT/k5OU/gAAAAAAAAAAvb2+/32X
+ fv8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP8wlzD/MJcw/zCXMP9Wm1T/4+Ph//Tp5P/y5d//8ePc//Dg
+ 2f/v3tb/7tvT/+3Z0f/s2M//7NfO/+zXzv/s187/7evp/16UXP8wlzD/MJcw/6S+pP+Xl5j/AAAAAAAA
+ AAC/v8D/gJqB/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/zCaMP8wmjD/MJow/1adVf/k4+L/9e3o//Tp
+ 5P/y5+H/8eTe//Di2//v39j/7t3V/+3a0v/s2ND/7NfO/+zXzv/t6+n/XpZc/zCaMP8wmjD/pb+l/5qa
+ m/8AAAAAAAAAAMHBwv+CnYP/MJww/zCcMP8wnTD/MZ0x/zGdMf8xnTH/MZ0x/zGdMf8xnTH/V59W/+Tj
+ 4//38Oz/29TQ/8/HxP/NxMH/y8K+/8rAvP/Jvrr/yLy4/8a7tv/HurX/7NjQ/+7r6v9emF3/MJww/zCc
+ MP+mwab/np6f/wAAAAAAAAAAw8PE/4Wghv8wnzD/MJ8w/3Obcf+osKX/p6+l/6avpP+mrqP/pa6j/6Wt
+ ov+jp5//5OTj//fw7f/07On/8enl//Dn4//v5eD/7uPd/+3g2//r3tj/6tvV/+rZ0v/u29T/7uzq/1+Z
+ Xf8wnzD/MJ8w/6fDqP+hoaL/AAAAAAAAAADFxcb/h6OI/zGiMf8xojH/hqWE/+7s6v/s5eL/6+Tg/+rj
+ 3//q4t3/6eDc/9HKxv/k5OP/9/Dt/+Hb2P/X0c//1M7L/+7m4v/Xz8z/1MvH/9HIxP/RxsL/0MXA/+7e
+ 1//u7Ov/YJte/zGiMf8xojH/qMSp/6Skpf8AAAAAAAAAAMfHx/+Jpor/MaQx/zGkMf+Gp4T/7ero/+ne
+ 2f/o29b/59nT/+bX0P/l1M3/zsG8/+Xk4//38O3/7ujk/+nj3//o4t7/8uvn/9XPy//x6OT/8Obh/+/k
+ 3//SyMT/7+Lb/+7t6/9gnV7/MaQx/zGkMf+pxqn/pqao/wAAAAAAAAAAyMjJ/4qoi/8xpzH/Macx/4eo
+ hf/u6+n/6+Ld/+Ta1f/j19P/4dXQ/+DSzf/Mwbz/5eXk//fw7f/n4N3/39jV/93W0//v6OX/19DO//fv
+ 6//27un/9ezn/9XMyP/x5uD/7+7s/2CfX/8xpzH/Macx/6rHqv+oqKr/AAAAAAAAAADJycr/i6qM/zGq
+ Mf8xqjH/iKqG/+7s6v/o4d3/x8K//8bAvf/DvLn/wru3/7ixrv/l5eT/9/Dt/+ni3//i29j/4NnW//Dp
+ 5f/X0M7/9/Ds//fv6//27+v/1s7L//Pq5f/v7u3/YaFf/zGqMf8xqjH/qsmr/6qqq/8AAAAAAAAAAMrK
+ yv+Mq43/Ma0x/zGtMf+Iq4b/7uzq/+3m4v/s5eH/6+Pf/+ri3f/q4Nv/0snG/+Xl5P/38O3/7OXi/+bg
+ 3f/l3tv/8erm/9XPzP/v6OT/7ujk/+/o5P/Uzcr/9O3o/+/v7f9ho1//Ma0x/zGtMf+ryqv/q6ut/wAA
+ AAAAAAAAysrK/4ysjf8ysTL/MbAx/4msh//u7Or/6eLe/8XAvv/Ev73/yMPA/9vU0P+7trT/5uXk//fw
+ 7f/j3dr/29XS/9jSz//w6eX/3NbT/9nT0P/Y0c7/2NHO/9jSz//27+v/8O/t/2KlYP8zsTP/NbI1/6vL
+ q/+rq63/AAAAAAAAAADJycr/jKyN/0a7Rv9MvUz/l7eV//Du7P/u6OT/6+Xh/+vk4f/r5eH/29XS/8jC
+ wP/n5uX/9/Ht//fw7P/38Oz/9/Ds//fw7f/38Oz/9/Dt//fw7f/z7en/6uTh/+nj4P/n5uX/b6pt/029
+ Tf9Hu0f/q8ur/6qqrP8AAAAAAAAAAMjIyf+LrIz/S79L/1PCU/+evJv/8e/u/+3n5P/Uz83/087N/9bS
+ z//g2tj/z8vJ/+rq6f/48/D/+PLv//jy7//48u//+PLv//jy7//48u//+PLv/+Pe2/++urn/vLi3/7+8
+ vP90r3L/U8JT/0y/TP+qy6v/qamq/wAAAAAAAAAAx8fI/4mriv9Qw1D/Wsda/6LAoP/x8O7/8Orn/+ji
+ 4P/n4t//6eTh/+Hc2f/Rzcv/6+vq//nz8P/48/D/+PPw//jz8P/58/D/+PPw//jz8P/48u//2NPR/93d
+ 3f/a2tr/oLKe/1/DX/9ax1r/UcNR/6nLqv+np6j/AAAAAAAAAADFxcb/iKqI/1XHVf9hy2H/psOk//Lw
+ 7//v6eb/3dnW/9zY1v/f29j/4t3b/8/Lyv/s7Ov/+fTx//nz8P/58/D/+fPw//nz8P/58/D/+fPw//nz
+ 8P/a1tT/1dTU/6m4p/9nx2b/Ycth/2HLYf9WyFb/qcup/6Skpv8AAAAAAAAAAMTExf+FqYb/Wsta/2jP
+ aP+qx6j/8/Hw//Dr6P/l4N7/5ODd/+bi3//t6OX/2NTS/+jn5v/19PP/9PTz//T08//09PP/9PTz//T0
+ 8//09PL/9PTy/9vZ2f+suan/b8tu/2jPaP9oz2j/aM9o/1zMXP+oy6j/oqKj/wAAAAAAAAAAwsLC/4On
+ hP9gz2D/b9Nv/67Krf/z8vD/8u3q//Lt6v/y7ev/8u3q//Lt6v/s5+X/2tbU/9rV1P/Tz87/zcnI/87L
+ yv/DwcH/k8OS/5XJk/+UyJL/kseR/3jReP9v02//b9Nv/2/Tb/9v02//Ys9i/6fKp/+enp//AAAAAAAA
+ AADAwMD/gaWC/2XSZf9213b/ss2x//Tz8f/z7uv/8+7r//Pu6//z7uv/8+7r//Pu6//z7uv/8u3q/8zJ
+ yP/Gw8P/xMLC/7W3s/9403j/dtd2/3bXdv9213b/dtd2/3bXdv9213b/dtd2/3bXdv9o02j/psqm/5ub
+ nP8AAAAAAAAAAL6+vv9+o3//a9Zr/33bff+30bX/9PPy//Pv7P/z7+z/8+/s//Pv7P/z7+z/8+/s//Pv
+ 7P/y7uv/zszL/+Xl5f/Iycb/js6N/33bff99233/fdt9/33bff99233/fdt9/33bff99233/fdt9/27X
+ bv+lyqX/l5eY/wAAAAAAAAAAvb29/nyhff9v2W//hN6E/7rUuf/19PP/9PHu//Tx7v/08e7/9PHu//Tx
+ 7v/08e7/9PHu//Pw7v/Qzs3/zc3L/5XRlP+E3oT/hN6E/4TehP+E3oT/hN6E/4TehP+E3oT/hN6E/4Te
+ hP+E3oT/ctpy/6PIo/+UlJX+AAAAAAAAAAC+vr/phJiF/2nZaf+K4Yr/u9S6/+bl5f/m5eX/5uXl/+bl
+ 5f/l5eX/5eXk/+Xl5P/l5OT/5eTk/8jIx/+d1J3/iuGK/4rhiv+K4Yr/iuGK/4rhiv+K4Yr/iuGK/4rh
+ iv+K4Yr/iuGK/4rhiv9o2Wj/qr6r/5GRkekAAAAAAAAAALOzs6unp6f/VrtX/43jjf+a4Zr/oN+f/6Df
+ n/+g35//n9+f/5/fn/+f35//n9+e/5/fnv+e3p7/m+Ca/5Hkkf+R5JH/keSR/5Hkkf+R5JH/keSR/5Hk
+ kf+R5JH/keSR/5Hkkf+R5JH/i+OL/1W9Vf+ysrL/kpKSqwAAAAAAAAAAlpaXNsbGx/yEkoT/V7tX/2/d
+ b/994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33gff994H3/feB9/33g
+ ff994H3/feB9/33gff994H3/feB9/27dbv9UvFX/mqia/5+foPyFhYU2AAAAAAAAAAAAAAAAnJydacXF
+ xvyjo6P/fZB+/3SadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP9zmnT/c5p0/3Oa
+ dP9zmnT/c5p0/3OadP9zmnT/c5p0/3OadP90mnT/gZSC/6Ojo/+tra78jY2OaQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAlZWVNq+vr6q5ubnotbW1/bOztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7Oz
+ tP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP+zs7T/s7O0/7OztP2zs7PorKysqpCQkTYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP/////gAAAHwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABwAAAA+AAAAf/////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNjYxBsbGw5cHBxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3FxcT9xcXE/cXFxP3Fx
+ cT9xcXE/cXFxP3BwcT9ra2w5Y2NjEAAAAAAAAAAAAAAAAAAAAABubm8Fi4uMj5+foPivr7D/rq6u/q6u
+ rv+urq7/rq6u/q6urv+urq7/rq6u/66urv6urq7/rq6u/q6urv+urq7/rq6u/q6urv+xsbH/paWm+H9/
+ gI9ra2wFAAAAAAAAAACdnZ6Qm6Cc/luVW/41izX+Mowy/jKMMv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKM
+ Mv4yjDL+Mowy/jKMMv4yjDL+Mowy/jKMMv41izX+X5lf/rG2sf6CgoOQAAAAAHh4eBCysrP4VpJW/jCR
+ MP8wkTD/L5Ev/jCRMP8wkTD/L5Ev/jGSMf80kzT/NJM0/zSTNP40kzT/NJI0/jSTNP80kjT/NJI0/jSS
+ NP8zkjP/L5Ev/l+bX/+rq6z4dnZ3EImJiTm1tbb/NpA2/jCUMP8wlDD/L5Qv/jCUMP8wlDD/L5Qv/meb
+ Zf/Mzcr/y8zJ/8vMyP7Ky8f/ycrH/snKxv/Iysb/yMnF/sjJxf+XqJX/L5Qv/jaRNv+4uLn/g4OEOZWV
+ lj+1tbb+M5Qz/i+XL/4vly/+L5cv/i+XL/4vly/+L5cv/m6hbP738u/+8+fh/vHj3f7w4Nn+793W/u3b
+ 0/7t2dH+7dnQ/u/e1/6vvq7+L5cv/jOUM/65ubn+jY2OP5iYmT+4uLn/NJg0/jCaMP8wmjD/L5ov/jCa
+ MP8wmjD/L5ov/m+jbf/49PH/8efi/+vg2/7q3Nf/6NnT/ubWz//l08z/5dLK/u7d1f+wv67/L5ov/jSY
+ NP+8vL3/kZGTP5ubnD+8vLz/NJs0/jKeMv9bmVn/XJlb/lyYWv9bmFn/W5dZ/oShgf/49fP/6eLe/9zV
+ 0f7a0c3/2c7K/tfMx//VycT/1cfB/u/e1/+wwK7/MJ4w/jSbNP+/v8D/lpaXP56enz++vr/+NZ81/jai
+ Nv7Iycb+6ubj/urk4v7p4+D+6OLe/svGxP749fP+6uTg/t/Y1f7l3dr+49vW/tvRzf7Zzsn+2MvG/vDi
+ 3P6xwa/+MKEw/jWfNf7CwsP+mpqbP6CgoT/BwcL/NaM1/jemNv/Ky8j/6t/a/ujc1v/n2NL/5dXO/srA
+ u//49fP/8uvn/+3m4v7w6eb/29XS/vLq5f/x5+L/2tDL/vHm4f+xwrD/MKUw/jWjNv/ExMX/nZ2eP6Ki
+ oz/Dw8T/NqY2/jepNv/LzMn/6uLe/tHKxv/Px8P/zcO//r63tP/49fP/5t/c/9XOzP7f2db/3NbT/vfv
+ 6//27ur/3dXR/vPr5v+yw7D/MKkw/jamNv/Gxsf/n5+hP6Ojoz/ExMX/Nqo2/jetNv/LzMn/7Obi/uXe
+ 2v/k3Nj/49nV/snCwP/49fP/8erm/+rk4P7v6OT/29XS/vHq5v/x6ub/29XR/vXu6/+yxLD/MK0w/jaq
+ Nv/Hx8j/oaGiP6OjpD/ExMX+O687/jyzPP7Mzcr+6uTg/s3Hxf7KxcL+29XR/r65t/749fP+7OXi/uLb
+ 2P7o4d7+5+Dd/uDa1/7f2dX+3tjV/vXv7P6zxbL+ObM5/jywPP7Hx8j+oaGiP6Kioz/Dw8T/SLhI/lbA
+ Vv/U1NL/7+nm/uPd2v/i3Nn/4dvY/svGxf/59vT/9/Hu//fx7v748e7/9/Hu/vfx7v/17+z/2tXT/tbS
+ 0P+ru6n/UMBQ/km4Sf/Gxsf/oKChP6CgoT/BwcL+TbxN/l7GXv7W19X+7+rm/uHc2v7g29j+497b/s/M
+ yv769/X++PLv/vjy7/748+/++PLv/vjy7/7y7On+yMbH/snHx/6CtID+WcZZ/k29Tv7ExMX+nZ2fP56e
+ nz+/v8D/UcFR/mbMZv/Z2df/7+rn/trW1P/Z1dL/5N/d/s7Lyv/6+Pb/+fXy//n18v759fL/+fXy/vn1
+ 8v/08O3/yMfG/pG9j/9izGL/Ysxi/lLBUv/CwsP/mpqcP5ycnT+8vL3/VsVW/nDRb//b3Nr/8u3q/u/r
+ 6P/v6uj/8ezp/t7a2P/f3t3/3tzb/9za2v7c2tr/zdbL/svayv/J18f/l8GV/mzRbP9r0Wv/a9Fr/ljG
+ WP+/v8D/l5eYP5mZmj+5ubr+XMlc/nnWef7e393+8+7r/vPu6/7z7uv+8+7r/vPu6/7z7uv+2tbU/srH
+ x/7HxcT+g8mC/nXWdf511nX+ddZ1/nXWdf511nX+ddZ1/l7JXv68vL3+kpKTP5aWlj+1tbb/Yc1h/oLb
+ gv/g4d//8+/s/vPv7P/z7+z/8+/s/vPv7P/z7+z/19TT/97d3f6jyaL/f9t//n7cfv9+3H7/ftx+/n7c
+ fv9+3H7/ftx+/mPOY/+5ubr/jo6PP4uLizm3t7j/Zc1l/ovfi//i4uH/9PLx/vTy8f/08vH/9PLx/vTy
+ 8f/08vH/19bV/6zOq/6I34j/h+CH/ofgh/+H4If/h+CH/ofgh/+H4If/h+CH/mbNZv+3t7j/hYWGOXx8
+ fBC4uLj4ZrZn/o/jj/6p2qj+qtqp/qraqf6q2an+qtmp/qrZqf6p2Kj+pdik/pDjkP6Q45D+kOOQ/pDj
+ kP6Q45D+kOOQ/pDjkP6Q45D+jOOM/m2/bf6mpqf4e3t8EAAAAACrq6yQm6Oc/me2Z/9s0Wz/bdVt/m3V
+ bf9t1W3/bdVt/m3Vbf9t1W3/bdVt/23Vbf5t1W3/bdVt/m3Vbf9t1W3/bdVt/m3Vbf9r0Wv/abpp/pyk
+ nf+QkJGQAAAAAAAAAACAgIAFqqqqj7OztPiwsLH/qqqr/qqqq/+qqqv/qqqr/qqqq/+qqqv/qqqr/6qq
+ q/6qqqv/qqqr/qqqq/+qqqv/qqqr/qqqq/+vr6//rq6u+J2dnY99fX4FAAAAAAAAAAAAAAAAAAAAAIKC
+ gxCRkZI5m5ucP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ycnD+cnJw/nJycP5ub
+ nD+SkpI5hISEEAAAAAAAAAAAAAAAAOAABwCAAAEAgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEA4AAHACgA
+ AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tMDXR0dGR5eXp/eXl6f3l5
+ en95eXp/eXl6f3l5en95eXp/eXl6f3l5en95eXl/cXFyZExMTA0AAAAAU1NUDZyendhynnL/Z6Nn/2ej
+ Z/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/2ejZ/9no2f/Z6Nn/3mmev+YmpnYU1NTDZWVlWVolmn/MJIw/zCS
+ MP8wkjD/MJIw/0mVSP9Xl1b/V5dW/1aWVf9WlVT/VZVU/1WUU/83kjb/e6l7/4KCg2Wmpqd/VpZW/zCW
+ MP8wljD/MJYw/zCWMP+cvpv/9e7q//Tq5f/y5+L/8eTf//Hj3f/v6OT/R5VG/2mqav+QkJF/rKysf1ib
+ Wf8wmzD/MJsw/zCbMP8wmzD/ncGc/+/m4v/g1tH/3dDL/9vMxv/ZycP/7eHc/0eZRv9qrmv/l5eZf6+v
+ sH9boVz/VqBV/8rMxf/IycL/x8e//8/Oy//x6ub/49zY/+jf2//f1M//3dDK/+7k4P9InUf/bLJs/56e
+ n3+zs7N/XaZd/1ynW//s5eL/5dnU/+PVzv/Z09D/8erm/+Pd2f/j3dn/8+vn/+PZ1f/v6OX/SKJH/222
+ bf+jo6R/tLS1f16rX/9cq1v/7Ojl/9nSz//Wzsr/1dHP//Hq5v/j3dn/493Z//Ps6P/k3dn/8e3q/0mn
+ SP9tum7/pqanf7W1tX9ksWX/Z7Rm/+3p5v/Y0s//2tTR/9TRz//y7Oj/6OLe/+7o5P/o4d7/493a/+3q
+ 5/9Ur1P/dMF1/6amqH+zs7R/bLZs/3vBev/w7Or/3tjW/+Db2P/d29r/+PPw//jy7//48u//+PLv/9bS
+ 0P+9wLv/YL9g/3zGfP+jo6V/sLCxf2+5b/+GyYX/8e7r/+Hc2v/l4N7/393b//f08v/29PH/9vTx//bz
+ 8f/Nz8r/ecZ5/2TNZP+ByoH/np6gf6ysrX9yu3P/kdCR//Pw7v/y7ev/8u3r/+vm5P/a1tX/ycbG/6HD
+ n/+F0IT/ftF9/3LVcv9y1XL/hc6G/5iYmX+oqKh/db11/5zXnP/08vD/9PDt//Tw7f/08O3/4d7c/8TT
+ w/+F2YT/gN2A/4DdgP+A3YD/gN2A/4rQiv+RkZJ/mZmZZXq1e/+b3pv/w+LC/8Piwv/C4sL/wuLB/7na
+ uf+S35L/juOO/47jjv+O447/juOO/4zijP+GwYf/h4eIZVtbXA2rrqvYerN6/3i9eP94vXj/eL14/3i9
+ eP94vXj/eL14/3i9eP94vXj/eL14/3i9eP95tHr/naGe2FxcXA0AAAAAXl5eDZycnWSpqap/qqqqf6qq
+ qn+qqqp/qqqqf6qqqn+qqqp/qqqqf6qqqn+pqal/m5ubZGBgYA0AAAAAgAEAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
+
+
+
\ No newline at end of file
diff --git a/Utility/Images/FolderChecked.png b/Utility/Images/FolderChecked.png
new file mode 100644
index 000000000..f419452e6
Binary files /dev/null and b/Utility/Images/FolderChecked.png differ
diff --git a/Utility/Images/FolderPartial.png b/Utility/Images/FolderPartial.png
new file mode 100644
index 000000000..aa9d24d87
Binary files /dev/null and b/Utility/Images/FolderPartial.png differ
diff --git a/Utility/Images/FolderUnchecked.png b/Utility/Images/FolderUnchecked.png
new file mode 100644
index 000000000..3de3b3408
Binary files /dev/null and b/Utility/Images/FolderUnchecked.png differ
diff --git a/Utility/MonthPicker.Designer.cs b/Utility/MonthPicker.Designer.cs
new file mode 100644
index 000000000..25079e8ca
--- /dev/null
+++ b/Utility/MonthPicker.Designer.cs
@@ -0,0 +1,115 @@
+namespace Utility
+{
+ partial class MonthPicker
+ {
+ ///
+ /// 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.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // groupBox3
+ //
+ this.groupBox3.Location = new System.Drawing.Point(0, 0);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(200, 100);
+ this.groupBox3.TabIndex = 0;
+ this.groupBox3.TabStop = false;
+ //
+ // tableLayoutPanel2
+ //
+ this.tableLayoutPanel2.ColumnCount = 4;
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel2.Name = "tableLayoutPanel2";
+ this.tableLayoutPanel2.RowCount = 3;
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(200, 100);
+ this.tableLayoutPanel2.TabIndex = 0;
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.tableLayoutPanel1);
+ this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.groupBox1.Location = new System.Drawing.Point(0, 0);
+ this.groupBox1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Padding = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.groupBox1.Size = new System.Drawing.Size(304, 123);
+ this.groupBox1.TabIndex = 1;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Select months";
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.ColumnCount = 4;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 20);
+ this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 3;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(298, 99);
+ this.tableLayoutPanel1.TabIndex = 0;
+ //
+ // MonthPicker
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 16F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.groupBox1);
+ this.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.Name = "MonthPicker";
+ this.Size = new System.Drawing.Size(304, 123);
+ this.groupBox1.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ }
+}
diff --git a/Utility/MonthPicker.cs b/Utility/MonthPicker.cs
new file mode 100644
index 000000000..40f58cb1b
--- /dev/null
+++ b/Utility/MonthPicker.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Utility
+{
+ public partial class MonthPicker : UserControl
+ {
+ public int[] MonthsPicked
+ {
+ get
+ {
+ List Picked = new List();
+ foreach(Control C in this.tableLayoutPanel1.Controls)
+ if(((CheckBox)C).Checked) Picked.Add(int.Parse(C.Text));
+ return Picked.ToArray();
+ }
+ set
+ {
+ foreach (Control C in this.tableLayoutPanel1.Controls)
+ ((CheckBox)C).Checked = value.Contains(int.Parse(C.Text));
+ }
+ }
+ public void ClearAll()
+ {
+ foreach (Control C in this.tableLayoutPanel1.Controls)
+ ((CheckBox)C).Checked = false;
+ }
+ public void SelectAll()
+ {
+ foreach (Control C in this.tableLayoutPanel1.Controls)
+ ((CheckBox)C).Checked = true;
+ }
+ public MonthPicker()
+ {
+ InitializeComponent();
+ FillDates();
+ }
+ private void FillDates()
+ {
+ for (int d = 0; d < 13; d++)
+ this.tableLayoutPanel1.Controls.Add(
+ new CheckBox()
+ {
+ Appearance = System.Windows.Forms.Appearance.Button,
+ AutoSize = true,
+ Dock = System.Windows.Forms.DockStyle.Fill,
+ Location = new System.Drawing.Point(4, 4),
+ Name = "checkBox"+d.ToString(),
+ Size = new System.Drawing.Size(20, 28),
+ TabIndex = 10+d,
+ Text = System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames[d],
+ TextAlign = System.Drawing.ContentAlignment.MiddleCenter,
+ UseVisualStyleBackColor = true,
+ Checked = false,
+ });
+ }
+ }
+}
diff --git a/Utility/MonthPicker.resx b/Utility/MonthPicker.resx
new file mode 100644
index 000000000..ff31a6db5
--- /dev/null
+++ b/Utility/MonthPicker.resx
@@ -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
+
+
\ No newline at end of file
diff --git a/Utility/NamedPipeServerStream.cs b/Utility/NamedPipeServerStream.cs
new file mode 100644
index 000000000..cea492ad2
--- /dev/null
+++ b/Utility/NamedPipeServerStream.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Utility
+{
+ public class NamedPipeServerStream : IDisposable
+ {
+ public System.IO.Pipes.NamedPipeServerStream Server { get; set; }
+ public string Name { get; set; }
+ public string UserName { get; set; }
+ public System.IO.Pipes.PipeDirection Direction { get; set; }
+ public NamedPipeServerStream(string aBasePipeName, string aUserName, System.IO.Pipes.PipeDirection aDir)
+ {
+ UserName = string.IsNullOrEmpty(aUserName) ? Utility.User.UserName : aUserName;
+ Name = MakePipeName(aBasePipeName, UserName, aDir);
+ Direction = aDir;
+ Server = GetPipeServer(Name, aDir);
+ }
+ public static void PrintServers()
+ {
+ foreach (string S in System.IO.Directory.GetFiles(@"\\.\pipe\"))
+ System.Diagnostics.Debug.WriteLine(S);
+ }
+ public const string PipeDirectory = @"\\.\pipe\";
+ public static bool ServerIsUp(string aServerName)
+ {
+ return System.IO.Directory.GetFiles(PipeDirectory).Contains(PipeDirectory + aServerName);
+ }
+ public static string MakePipeName(string aBaseName, string aUserName, System.IO.Pipes.PipeDirection aDir)
+ {
+ return (aBaseName + '.' + aUserName + '.' + aDir.ToString()).Replace('\\', '.');
+ }
+ private static System.IO.Pipes.NamedPipeServerStream GetPipeServer(string aPipeName, System.IO.Pipes.PipeDirection aDir)
+ {
+ System.IO.Pipes.PipeSecurity ps = new System.IO.Pipes.PipeSecurity();
+ System.IO.Pipes.PipeAccessRule par = new System.IO.Pipes.PipeAccessRule("Everyone",
+ System.IO.Pipes.PipeAccessRights.ReadWrite,
+ System.Security.AccessControl.AccessControlType.Allow);
+ ps.AddAccessRule(par);
+ return new System.IO.Pipes.NamedPipeServerStream(aPipeName, aDir, 1,
+ System.IO.Pipes.PipeTransmissionMode.Message,
+ System.IO.Pipes.PipeOptions.None, 4096, 4096, ps);
+ }
+
+ #region IDisposable Members
+
+ public void Dispose()
+ {
+ if (Server != null) Server.Dispose();
+ }
+
+ #endregion
+ }
+}
diff --git a/Utility/PipeClient.cs b/Utility/PipeClient.cs
new file mode 100644
index 000000000..3abd8ce65
--- /dev/null
+++ b/Utility/PipeClient.cs
@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Diagnostics;
+
+namespace Utility
+{
+ public class PipeClient
+ {
+ private class Pipes
+ {
+ public System.IO.Pipes.NamedPipeClientStream In { get; set; }
+ public System.IO.Pipes.NamedPipeClientStream Out { get; set; }
+ public bool IsConnected
+ {
+ get { return In != null && In.IsConnected && Out != null && Out.IsConnected; }
+ }
+ public Pipes(System.IO.Pipes.NamedPipeClientStream aIn, System.IO.Pipes.NamedPipeClientStream aOut)
+ {
+ In = aIn;
+ Out = aOut;
+ }
+ public void Close()
+ {
+ if (In != null) In.Close();
+ if (Out != null) Out.Close();
+ }
+ }
+ private Pipes itsPipes;
+ private System.IO.StreamWriter itsWriter = null;
+ private volatile bool Running;
+ public delegate IAsyncResult CommandReceivedDelegate(string aCommand);
+ public delegate void ConnectedChangedDelegate(bool aConnected);
+ public event ConnectedChangedDelegate ConnectedChanged;
+ public static DateTime LastRun { get; private set; }
+ public void Run(object aCommandReceived)
+ {
+ LastRun = DateTime.Now;
+ CommandReceivedDelegate CommandReceived = (CommandReceivedDelegate) aCommandReceived;
+ for (Running = true; Running; )
+ {
+ itsPipes = new Pipes(
+ new System.IO.Pipes.NamedPipeClientStream(".", "Duplicati.Pipe.Out", System.IO.Pipes.PipeDirection.In),
+ new System.IO.Pipes.NamedPipeClientStream(".", "Duplicati.Pipe.In", System.IO.Pipes.PipeDirection.Out));
+ while (Running && !itsPipes.Out.IsConnected)
+ {
+ try { itsPipes.Out.Connect(10000); } //1000); }
+ catch { }
+ }
+ itsPipes.In.Connect();
+ itsWriter = new System.IO.StreamWriter(itsPipes.Out);
+ itsWriter.AutoFlush = true; // !!
+ Debug.WriteLine("CONNECTED");
+ if (ConnectedChanged != null) ConnectedChanged(IsConnected);
+ System.Media.SystemSounds.Beep.Play();
+ using (System.Timers.Timer KeepAlive = new System.Timers.Timer(1000))
+ using (System.IO.StreamReader Reader = new System.IO.StreamReader(itsPipes.In))
+ {
+ KeepAlive.Elapsed += new System.Timers.ElapsedEventHandler(
+ delegate(object sender, System.Timers.ElapsedEventArgs e)
+ {
+ SendCommand(string.Empty); // Send empty keepalive
+ });
+ while (Running && itsPipes.In.IsConnected)
+ {
+ try
+ {
+ string Line = Reader.ReadLine();
+ if (!string.IsNullOrEmpty(Line)) // Keepalive is empty
+ CommandReceived(Line);
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ itsPipes.Close();
+ }
+ Debug.WriteLine("Exiting pipe thread");
+ if (ConnectedChanged != null) ConnectedChanged(IsConnected);
+ }
+ }
+ public void Stop()
+ {
+ Running = false;
+ }
+ public bool IsConnected { get { return itsPipes.IsConnected; } }
+ private static System.Threading.Thread itsThread;
+ private static PipeClient itsClient;
+ public static PipeClient RunThread(CommandReceivedDelegate aCommandReceived, ConnectedChangedDelegate aConnectionChanged)
+ {
+ if (LastRun != null && (DateTime.Now - LastRun).TotalSeconds < 10)
+ return null;
+
+ if (itsThread != null && itsThread.IsAlive) StopThread();
+ itsClient = new PipeClient();
+ itsClient.ConnectedChanged += aConnectionChanged;
+ itsThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(itsClient.Run));
+ itsThread.IsBackground = true; // Die with main thread.
+ itsThread.Start(aCommandReceived);
+ return itsClient;
+ }
+ public static void StopThread()
+ {
+ if (itsThread == null || !itsThread.IsAlive) return;
+ itsClient.Stop();
+ itsThread.Join(2000);
+ if (itsThread.IsAlive) itsThread.Abort();
+ }
+ public bool SendCommand(string aCommand)
+ {
+ bool Result = false;
+ if (itsWriter != null)
+ {
+ try
+ {
+ itsWriter.WriteLine(aCommand);
+ Result = true;
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ return Result;
+ }
+ public bool SendCommand(string aCommand, params string[] aArgs)
+ {
+ return SendCommand(aCommand + "<=>" + string.Join("<,>", aArgs));
+ }
+ }
+}
diff --git a/Utility/PipeServer.cs b/Utility/PipeServer.cs
new file mode 100644
index 000000000..551e85a1a
--- /dev/null
+++ b/Utility/PipeServer.cs
@@ -0,0 +1,148 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Diagnostics;
+
+namespace Utility
+{
+ public class PipeServer
+ {
+ private class Pipes
+ {
+ public System.IO.Pipes.NamedPipeServerStream In { get; set; }
+ public System.IO.Pipes.NamedPipeServerStream Out { get; set; }
+ public bool IsConnected
+ {
+ get { return In != null && In.IsConnected && Out != null && Out.IsConnected; }
+ }
+ public Pipes()
+ {
+ In = GetPipeServer(System.IO.Pipes.PipeDirection.In);
+ Out = GetPipeServer(System.IO.Pipes.PipeDirection.Out);
+ }
+ public void Close()
+ {
+ if (In != null) In.Close();
+ if (Out != null) Out.Close();
+ }
+ private System.IO.Pipes.NamedPipeServerStream GetPipeServer(System.IO.Pipes.PipeDirection aDir)
+ {
+ System.IO.Pipes.PipeSecurity ps = new System.IO.Pipes.PipeSecurity();
+ System.IO.Pipes.PipeAccessRule par = new System.IO.Pipes.PipeAccessRule("Everyone",
+ System.IO.Pipes.PipeAccessRights.ReadWrite,
+ System.Security.AccessControl.AccessControlType.Allow);
+ ps.AddAccessRule(par);
+
+ return new System.IO.Pipes.NamedPipeServerStream("Duplicati.Pipe." + aDir.ToString(),
+ aDir, 1,
+ System.IO.Pipes.PipeTransmissionMode.Message,
+ System.IO.Pipes.PipeOptions.Asynchronous, 4096, 4096, ps);
+ }
+ }
+ private Pipes itsPipes;
+ private System.IO.StreamWriter itsWriter = null;
+ public delegate void ConnectedDelegate(object sender, EventArgs e);
+ public event ConnectedDelegate ConnectedEvent;
+ public delegate void NewMessageDelegate(string aMessage);
+ public event NewMessageDelegate NewMessage;
+ public delegate void LostConnectionDelegate(object sender, Exception e);
+ public event LostConnectionDelegate LostConnection;
+ public void Run()
+ {
+ Debug.WriteLine("New Pipeserver");
+ BeginConnect();
+ System.Media.SystemSounds.Exclamation.Play();
+ }
+ private System.Threading.Thread itsReadThread;
+ private void BeginConnect()
+ {
+ itsPipes = new Pipes();
+ itsPipes.Out.BeginWaitForConnection(new AsyncCallback(Connected), null);
+ }
+ private void Connected(IAsyncResult aResult)
+ {
+ try
+ {
+ itsPipes.In.EndWaitForConnection(aResult);
+ itsPipes.Out.WaitForConnection();
+ itsWriter = new System.IO.StreamWriter(itsPipes.Out);
+ itsWriter.AutoFlush = true;
+ if (ConnectedEvent != null) ConnectedEvent(this, new EventArgs());
+ if (itsReadThread != null) // Should never happen
+ {
+ itsReadThread.Abort();
+ itsReadThread.Join();
+ }
+ itsReadThread = new System.Threading.Thread(new System.Threading.ThreadStart(Reader));
+ itsReadThread.Start();
+ }
+ catch (Exception Ex) // ObjectDisposedException
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ private volatile bool RunThread = true;
+ private void Reader()
+ {
+ using (System.Timers.Timer KeepAlive = new System.Timers.Timer(1000))
+ using (System.IO.StreamReader sr = new System.IO.StreamReader(itsPipes.In))
+ {
+ KeepAlive.Elapsed += new System.Timers.ElapsedEventHandler(
+ delegate(object sender, System.Timers.ElapsedEventArgs e)
+ {
+ if (IsConnected) SendCommand(string.Empty); // Send empty keepalive
+ });
+ KeepAlive.Start();
+ try
+ {
+ for (RunThread = true; IsConnected && RunThread;)
+ {
+ string s = sr.ReadLine();
+ if (!string.IsNullOrEmpty(s) && NewMessage != null) NewMessage(s);
+ }
+ }
+ catch (System.Threading.ThreadAbortException)
+ {
+ // That's OK
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ Debug.WriteLine("Read thread exiting");
+ if (LostConnection != null) LostConnection(this, new Exception("Lost client connection"));
+ }
+ public bool IsConnected { get { return itsPipes.IsConnected; } }
+ public void Close()
+ {
+ // The close will abort the thread and interrupt the blocked reads
+ //
+ RunThread = false; // Chances are small this will stop the thread, but the closes will
+ if (itsWriter != null) Utility.Tools.TryCatch((Action)delegate() { itsWriter.Close(); });
+ if (itsPipes != null) Utility.Tools.TryCatch((Action)delegate() { itsPipes.Close(); });
+ }
+ public bool SendCommand(string aCommand)
+ {
+ bool Result = false;
+ if (IsConnected)
+ {
+ try
+ {
+ itsWriter.WriteLine(aCommand);
+ Result = true;
+ }
+ catch (Exception Ex)
+ {
+ Debug.WriteLine(Ex);
+ }
+ }
+ return Result;
+ }
+ public bool SendCommand(string aCommand, params string[] aArgs)
+ {
+ return SendCommand(aCommand + "<=>" + string.Join("<,>", aArgs));
+ }
+ }
+}
diff --git a/Utility/Properties/AssemblyInfo.cs b/Utility/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..3556bd9ad
--- /dev/null
+++ b/Utility/Properties/AssemblyInfo.cs
@@ -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("Utility")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Utility")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[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("3a36ef30-5f51-4b0d-a6a2-e3644ef2cd57")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Utility/Properties/Resources.Designer.cs b/Utility/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..3bacf5b3f
--- /dev/null
+++ b/Utility/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4961
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Utility.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Utility.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Utility/Properties/Resources.resx b/Utility/Properties/Resources.resx
new file mode 100644
index 000000000..5ea0895e3
--- /dev/null
+++ b/Utility/Properties/Resources.resx
@@ -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
+
+
\ No newline at end of file
diff --git a/Utility/SecureTextBox.Designer.cs b/Utility/SecureTextBox.Designer.cs
new file mode 100644
index 000000000..b3e2d1279
--- /dev/null
+++ b/Utility/SecureTextBox.Designer.cs
@@ -0,0 +1,41 @@
+namespace Utility
+{
+ partial class SecureTextBox
+ {
+ ///
+ /// 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.SuspendLayout();
+ //
+ // SecureTextBox
+ //
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
diff --git a/Utility/SecureTextBox.cs b/Utility/SecureTextBox.cs
new file mode 100644
index 000000000..fc2cee0f7
--- /dev/null
+++ b/Utility/SecureTextBox.cs
@@ -0,0 +1,98 @@
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Windows.Forms;
+
+namespace Utility
+{
+ public partial class SecureTextBox : System.Windows.Forms.TextBox
+ {
+ private System.Security.SecureString itsValue = new SecureString();
+ public System.Security.SecureString Value
+ {
+ get
+ {
+ System.Security.SecureString Result = itsValue.Copy();
+ Result.MakeReadOnly();
+ return Result;
+ }
+ private set
+ {
+ itsValue = value.Copy();
+ base.Text = new string('*', itsValue.Length);
+ }
+ }
+ public byte[] ProtectedValue
+ {
+ get
+ {
+ return Utility.Tools.SecureProtect(itsValue);
+ }
+ private set
+ {
+ itsValue = Utility.Tools.SecureUnprotect(value);
+ base.Text = new string('*', itsValue.Length);
+ }
+ }
+ public new bool UseSystemPasswordChar { get { return true; } set { } }
+ public new string Text { get { return string.Empty; } set { } }
+ public new bool AcceptsTab { get { return false; } }
+ public new bool ShortcutsEnabled { get { return false; } set { } }
+ public new ContextMenuStrip ContextMenuStrip { get { return null; } }
+ public new bool ReadOnly
+ {
+ get { return base.ReadOnly; }
+ set
+ {
+ base.ReadOnly = value;
+ if (value) base.Text = new string('*', 142);
+ else base.Text = string.Empty;
+ this.Focus();
+ }
+ }
+ private volatile bool IgnoreThis = false;
+ public SecureTextBox()
+ {
+ InitializeComponent();
+ base.UseSystemPasswordChar = true;
+ base.AcceptsTab = false;
+ base.ShortcutsEnabled = false;
+ base.ContextMenuStrip = new ContextMenuStrip();
+ }
+ public void dispose()
+ {
+ itsValue.Clear();
+ itsValue.Dispose();
+ }
+#if DEBUG
+ public static void Spew(System.Security.SecureString aS)
+ {
+ IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aS);
+ string contents = System.Runtime.InteropServices.Marshal.PtrToStringAuto(ptr);
+ Console.WriteLine(contents);
+ }
+#endif
+ protected override void OnTextChanged(EventArgs e)
+ {
+ // base.OnTextChanged(e);
+ if (!IgnoreThis)
+ {
+ // OK, user is trying to use the arrow keys or something...
+ if (itsValue.Length == base.Text.Length)
+ {
+ System.Media.SystemSounds.Exclamation.Play();
+ return;
+ }
+ while (itsValue.Length > base.Text.Length)
+ itsValue.RemoveAt(itsValue.Length - 1);
+ for (int ix = itsValue.Length; ix < base.Text.Length; ix++)
+ itsValue.AppendChar(base.Text[ix]);
+ IgnoreThis = true;
+ base.Text = new string('*', base.Text.Length);
+ this.SelectionStart = base.Text.Length;
+ }
+ IgnoreThis = false;
+ }
+ }
+}
diff --git a/Utility/SecureTextBox.resx b/Utility/SecureTextBox.resx
new file mode 100644
index 000000000..3e82cf3c8
--- /dev/null
+++ b/Utility/SecureTextBox.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ False
+
+
\ No newline at end of file
diff --git a/Utility/Su.cs b/Utility/Su.cs
new file mode 100644
index 000000000..9c9706744
--- /dev/null
+++ b/Utility/Su.cs
@@ -0,0 +1,134 @@
+// This sample demonstrates the use of the WindowsIdentity class to impersonate a user.
+// IMPORTANT NOTES:
+// This sample can be run only on Windows XP. The default Windows 2000 security policy
+// prevents this sample from executing properly, and changing the policy to allow
+// proper execution presents a security risk.
+// This sample requests the user to enter a password on the console screen.
+// Because the console window does not support methods allowing the password to be masked,
+// it will be visible to anyone viewing the screen.
+// The sample is intended to be executed in a .NET Framework 1.1 environment. To execute
+// this code in a 1.0 environment you will need to use a duplicate token in the call to the
+// WindowsIdentity constructor. See KB article Q319615 for more information.
+// http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.impersonate%28v=vs.71%29.aspx
+
+using System;
+using System.Runtime.InteropServices;
+using System.Security.Principal;
+using System.Security.Permissions;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
+[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
+namespace Utility
+{
+ public class Su
+ {
+ [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
+ public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
+ int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
+
+ //[DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
+ //private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr lpSource,
+ // int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr* Arguments);
+
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
+ public extern static bool CloseHandle(IntPtr handle);
+
+ [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
+ int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
+ private static WindowsImpersonationContext itsImpersonatedUser = null;
+ public static Exception Impersonate(string aUserName)
+ {
+ return Impersonate(aUserName, Utility.User.UserDomain);
+ }
+ public static Exception Impersonate(string aUserName, string aDomainName, string aPass)
+ {
+ System.Security.SecureString s = new System.Security.SecureString();
+ foreach (char c in aPass) s.AppendChar(c);
+ return Impersonate(aUserName, aDomainName, s);
+ }
+ public static Exception Impersonate(string aUserName, string aDomainName)
+ {
+ GetCheck gc = new GetCheck();
+ gc.Prompt = "Enter password for " + aUserName + ":";
+ if (gc.ShowDialog() == DialogResult.Cancel) return new Exception("User canceled");
+ return Impersonate(aUserName, aDomainName, gc.Result);
+ }
+ // If you incorporate this code into a DLL, be sure to demand FullTrust.
+ [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
+ public static Exception Impersonate(string aUserName, string aDomainName, System.Security.SecureString aPass)
+ {
+ Exception Result = null;
+ IntPtr tokenHandle = new IntPtr(0);
+ IntPtr dupeTokenHandle = new IntPtr(0);
+ try
+ {
+ string userName = aUserName;
+ string domainName = string.IsNullOrEmpty( aDomainName ) ? Utility.User.UserDomain : aDomainName;
+
+ const int LOGON32_PROVIDER_DEFAULT = 0;
+ //This parameter causes LogonUser to create a primary token.
+ const int LOGON32_LOGON_INTERACTIVE = 2;
+
+ tokenHandle = IntPtr.Zero;
+ bool returnValue = false;
+ IntPtr StrPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aPass);
+
+ // Call LogonUser to obtain a handle to an access token.
+ returnValue = LogonUser(userName, domainName, System.Runtime.InteropServices.Marshal.PtrToStringAuto(StrPtr),
+ LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
+ ref tokenHandle);
+ System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(StrPtr);
+ Debug.WriteLine("LogonUser called.");
+
+ if (false == returnValue)
+ {
+ int ret = Marshal.GetLastWin32Error();
+ Debug.WriteLine("LogonUser failed with error code : " + ret.ToString());
+ return new System.ComponentModel.Win32Exception(ret);
+ }
+
+ Debug.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
+ Debug.WriteLine("Value of Windows NT token: " + tokenHandle);
+
+ // Check the identity.
+ Debug.WriteLine("Before impersonation: "
+ + WindowsIdentity.GetCurrent().Name);
+ // Use the token handle returned by LogonUser.
+ WindowsIdentity newId = new WindowsIdentity(tokenHandle);
+ itsImpersonatedUser = newId.Impersonate();
+
+ // Check the identity.
+ Debug.WriteLine("After impersonation: "
+ + WindowsIdentity.GetCurrent().Name);
+
+ // Free the tokens.
+ if (tokenHandle != IntPtr.Zero)
+ CloseHandle(tokenHandle);
+
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine("Exception occurred. " + ex.Message);
+ Result = ex;
+ }
+ return Result;
+ }
+ [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
+ public static void UnImpersonate()
+ {
+ if (itsImpersonatedUser != null)
+ {
+ // Stop impersonating the user.
+ itsImpersonatedUser.Undo();
+ itsImpersonatedUser = null;
+ // Check the identity.
+ Debug.WriteLine("After Undo: " + WindowsIdentity.GetCurrent().Name);
+ }
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/Utility/Tools.cs b/Utility/Tools.cs
new file mode 100644
index 000000000..d0a753d4a
--- /dev/null
+++ b/Utility/Tools.cs
@@ -0,0 +1,277 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Diagnostics;
+using System.Security.Cryptography;
+
+namespace Utility
+{
+ public static class Tools
+ {
+ ///
+ /// The last encountered security exception
+ ///
+ public static Exception SecurityException { get; set; }
+ // A little entropy - this makes it hard for anything outside this program to decode protected strings
+ private static byte[] USID = System.Text.ASCIIEncoding.ASCII.GetBytes(
+ " 064527 062156 073557 020163 050130 050040 067562 062546 071563 067551 060556 020154 071120 066145 060557 020144");
+ ///
+ /// Protect some data
+ ///
+ /// Data to protect
+ /// Protected string
+ public static byte[] Protect(byte[] data)
+ {
+ SecurityException = null;
+ try
+ {
+ // Encrypt the data using DataProtectionScope.CurrentUser. The result can be decrypted
+ // only by the same current user.
+ return System.Security.Cryptography.ProtectedData.Protect(data, USID, DataProtectionScope.CurrentUser);
+ }
+ catch (CryptographicException e)
+ {
+ Debug.WriteLine("Data was not encrypted. An error occurred.");
+ Debug.WriteLine(e);
+ SecurityException = e;
+ return new byte[0];
+ }
+ }
+ ///
+ /// Unprotect some data
+ ///
+ /// Data to decrypt
+ /// decrypted data
+ public static byte[] Unprotect(byte[] data)
+ {
+ if (data == null || data.Length == 0) return new byte[0];
+ SecurityException = null;
+ try
+ {
+ //Decrypt the data using DataProtectionScope.CurrentUser.
+ return ProtectedData.Unprotect(data, USID, DataProtectionScope.CurrentUser);
+ }
+ catch (CryptographicException e)
+ {
+ Debug.WriteLine("Data was not decrypted. An error occurred.");
+ Debug.WriteLine(e);
+ SecurityException = e;
+ return new byte[0];
+ }
+ }
+ ///
+ /// Unprotects data into a SecureString
+ ///
+ /// Data to decrypt
+ /// SecureString
+ public static System.Security.SecureString SecureUnprotect(byte[] aData)
+ {
+ if (aData == null || aData.Length == 0) return new System.Security.SecureString();
+ System.Security.SecureString Result = new System.Security.SecureString();
+ foreach (byte b in Unprotect(aData))
+ Result.AppendChar((char)b);
+ return Result;
+ }
+ ///
+ /// Protects data in a SecureString
+ ///
+ /// SecureString
+ /// Protected data
+ public static byte[] SecureProtect(System.Security.SecureString aValue)
+ {
+ if (aValue == null || aValue.Length == 0) return new byte[0];
+ return Utility.Tools.Protect(System.Text.ASCIIEncoding.ASCII.GetBytes(
+ System.Runtime.InteropServices.Marshal.PtrToStringAuto(
+ System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aValue))));
+ }
+ ///
+ /// Compares 2 secure strings and returns result
+ ///
+ /// One secure string
+ /// Another secure string
+ /// True if same
+ public static bool GotIt(System.Security.SecureString aS1, System.Security.SecureString aS2)
+ {
+ return
+ System.Runtime.InteropServices.Marshal.PtrToStringAuto(
+ System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aS1)).Equals(
+ System.Runtime.InteropServices.Marshal.PtrToStringAuto(
+ System.Runtime.InteropServices.Marshal.SecureStringToBSTR(aS2)));
+ }
+ ///
+ /// A Combine that accepts params
+ ///
+ /// Stuff to combine
+ /// Combined path
+ public static string Combine(params string[] aParts)
+ {
+ if (aParts.Length == 0) return string.Empty;
+ string Double = new string(new char[] { System.IO.Path.DirectorySeparatorChar, System.IO.Path.DirectorySeparatorChar });
+ string Separator = System.IO.Path.DirectorySeparatorChar.ToString();
+ string Result = aParts[0];
+ for (int i = 1; i < aParts.Length; i++)
+ {
+ string Part = aParts[i];
+ while (Part.Contains(Double)) Part = Part.Replace(Double, Separator);
+ if (!Result.EndsWith(Separator) && !Part.StartsWith(Separator)) Result += Separator;
+ Result += Part;
+ }
+ return Result;
+ }
+ ////////////////////////// Tools for the lazy
+ ///
+ /// Run something and return true if no exceptions
+ ///
+ /// What to run
+ /// True if no exceptions
+ public static bool NoException(Action aAction)
+ {
+ return TryCatch(aAction) == null;
+ }
+ ///
+ /// Run something and return true if it had an exception
+ ///
+ /// What to run
+ /// True if it had an exception
+ public static bool HadException(Action aAction)
+ {
+ return TryCatch(aAction) != null;
+ }
+ ///
+ /// Run something and return any exception encountered
+ ///
+ /// What to run
+ /// Exception or null
+ public static Exception TryCatch(Action aAction)
+ {
+ Exception Result = null;
+ try
+ {
+ aAction();
+ }
+ catch (Exception Ex)
+ {
+#if DEBUG
+ Debug.WriteLine("BEGIN TC Exception");
+ Debug.Indent(); Debug.WriteLine(Ex); Debug.Unindent();
+ Debug.WriteLine("END TC Exception");
+#endif
+ Result = Ex;
+ }
+ return Result;
+ }
+ ///
+ /// Runs action in a BackgroundWorker, waits until complete and calls DoEvents every 100 milliseconds
+ ///
+ ///
+ /// This is handy for running a long-timed-thing and keep the forms alive while it runs.
+ /// Be careful, users can do weird things while you are away.
+ ///
+ /// What to run
+ public static void Background(Action aAction)
+ {
+ using (System.ComponentModel.BackgroundWorker bgw = new System.ComponentModel.BackgroundWorker())
+ {
+ bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(
+ delegate(object sender, System.ComponentModel.DoWorkEventArgs e)
+ {
+ aAction();
+ });
+ bgw.RunWorkerAsync();
+ while (bgw.IsBusy)
+ {
+ System.Windows.Forms.Application.DoEvents();
+ System.Threading.Thread.Sleep(100);
+ }
+ }
+ }
+ ///
+ /// Sets a rule on a file
+ ///
+ /// File to set
+ /// Account to impact
+ /// Rights to set
+ /// Well, its the control type, isn't it?
+ public static void SetRule(string filePath, string account, System.Security.AccessControl.FileSystemRights rights, System.Security.AccessControl.AccessControlType controlType)
+ {
+ System.Security.AccessControl.FileSecurity fSecurity = System.IO.File.GetAccessControl(filePath);
+ fSecurity.ResetAccessRule(new System.Security.AccessControl.FileSystemAccessRule(account, rights, controlType));
+ System.IO.File.SetAccessControl(filePath, fSecurity);
+ }
+ [System.Runtime.InteropServices.DllImport("mpr.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true)]
+ private static extern int WNetGetConnection([System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] string localName, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)] StringBuilder remoteName, ref int length);
+ ///
+ /// Translates a Windows drive letter into a UNC
+ ///
+ /// Drive Letter
+ /// UNC
+ public static string DriveToUNC(char aDrive)
+ {
+ int Len = 255;
+ StringBuilder Stupid = new StringBuilder(Len);
+ WNetGetConnection(aDrive.ToString(), Stupid, ref Len);
+ return Stupid.ToString();
+ }
+ ///
+ /// The path to the log files
+ ///
+ /// Package name
+ /// Path to log files
+ public static string LogFileDirectory(string aPackage)
+ {
+ Utility.User.GetApplicationDirectory(aPackage);
+ return Utility.User.GetApplicationDirectory(System.IO.Path.Combine(aPackage, "Logs"));
+ }
+ ///
+ /// A file filter that may be used to find log files
+ ///
+ public const string LogFileFilter = "Log-*.txt";
+ ///
+ /// The default log name
+ ///
+ /// Package name
+ /// Log file name with path
+ public static string LogFileName(string aPackage)
+ {
+ return System.IO.Path.Combine(LogFileDirectory(aPackage), "Log-" + DateTime.Now.ToString("yyyyMMddHHmm") + "-" +
+ System.Diagnostics.Process.GetCurrentProcess().Id.ToString() + ".txt");
+ }
+ ///
+ /// Some fancy error processing
+ ///
+ /// Package name
+ /// Module name
+ /// Exception
+ public static void ProcessError(string aPackage, string aName, Exception aEx)
+ {
+ ProcessError(aPackage, aName, aEx, true, string.Empty);
+ }
+ ///
+ /// Some fancy error processing
+ ///
+ /// Package name
+ /// Module name
+ /// Exception
+ /// Show the sql messagebox
+ /// Send to log file
+ public static void ProcessError(string aPackage, string aName, Exception aEx, bool aShowDialog, string aLogFile)
+ {
+ if (string.IsNullOrEmpty(aLogFile))
+ aLogFile = LogFileName(aPackage);
+ // Use the power of the Con
+ bool OK = Utility.Tools.NoException((Action)delegate()
+ {
+ Console.SetError(System.IO.File.AppendText(aLogFile));
+ Console.Error.WriteLine(aEx);
+ Console.Error.WriteLine(DateTime.Now.ToString() + '\n' + AssemblyInfo.Info);
+ Console.Error.WriteLine(aEx);
+ });
+ if (aShowDialog)
+ // Cool huh?
+ new Microsoft.SqlServer.MessageBox.ExceptionMessageBox(
+ new ApplicationException("Details " + (OK ? "written " : "NOT written ") + "to " + aLogFile, aEx)
+ { Source = aName }) { Beep = true }.Show(null);
+ }
+ }
+}
diff --git a/Utility/User.cs b/Utility/User.cs
new file mode 100644
index 000000000..c313e0852
--- /dev/null
+++ b/Utility/User.cs
@@ -0,0 +1,250 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Diagnostics;
+
+namespace Utility
+{
+ ///
+ /// Some user tools
+ ///
+ public static class User
+ {
+ public enum OutputSource { stdout, stderr };
+ ///
+ /// The user's application directory, created if it does not exists
+ ///
+ /// Package name
+ /// Application directory
+ public static string GetApplicationDirectory(string aSub)
+ {
+ string Result = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), aSub);
+ if (!System.IO.Directory.Exists(Result)) System.IO.Directory.CreateDirectory(Result);
+ return Result;
+ }
+ public delegate bool ExecOutputDelegate(OutputSource aSource, string aLine);
+ public static string UserName { get { return System.Security.Principal.WindowsIdentity.GetCurrent().Name; } }
+ public static string UserPath { get { return UserName.Replace('\\', '@'); } }
+ public static string UserDomain { get { return System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\')[0]; } }
+ public static string ParseUserName(string aUserName, out string outDomain)
+ {
+ outDomain = string.Empty;
+ string[] Parts = aUserName.Split('\\');
+ if (Parts.Length == 1) return Parts[0];
+ outDomain = Parts[0];
+ return Parts[1];
+ }
+ public class ExecuteResult
+ {
+ public bool Error { get; set; }
+ public string[] Stdout { get; private set; }
+ public string[] Stderr { get; private set; }
+ public string StdoutString { get { return string.Join("\n", Stdout ?? new string[] { "" }); } }
+ public string StderrString { get { return string.Join("\n", Stderr ?? new string[] { "" }); } }
+ public int ExitCode { get; set; }
+ public Exception Ex { get; set; }
+ public ExecuteResult(Exception aEx)
+ {
+ Error = true;
+ Ex = aEx;
+ ExitCode = -1;
+ }
+ public ExecuteResult(System.Diagnostics.Process aProcess)
+ {
+ Ex = null;
+ Error = false;
+ // Silly ole DOS
+ Stdout = aProcess.StandardOutput.ReadToEnd().Replace("\r", string.Empty).Split('\n');
+ Stderr = aProcess.StandardError.ReadToEnd().Replace("\r", string.Empty).Split('\n');
+ ExitCode = aProcess.ExitCode;
+ }
+ public ExecuteResult(System.Diagnostics.Process aProcess, StdHandler aOut, StdHandler aErr)
+ {
+ Ex = null;
+ Error = false;
+ Stdout = aOut.Standard;
+ Stderr = aErr.Standard;
+ ExitCode = aProcess.ExitCode;
+ }
+ }
+ public static ExecuteResult Execute(string aUserName, System.Security.SecureString aCheck, string aExe, string aArgs)
+ {
+ return Execute(aUserName, aCheck, aExe, aArgs, string.Empty);
+ }
+ public static ExecuteResult Execute(string aUserName, System.Security.SecureString aCheck, string aExe, string aArgs,
+ string aStdin)
+ {
+ return Execute(aUserName, aCheck, aExe, aArgs, string.Empty, null);
+ }
+ // This will keep a stdout or stserr pipe from a process drained. As data arrives it is placed into a
+ // memory stream (basically copied); trick is the output delegate is bool; if user likes the string that
+ // just came in, returning true will prevent it from being copied.
+ public class StdHandler
+ {
+ // Am I watching out or err? Used in output delgate call.
+ public OutputSource Source { get; set; }
+ // The output delegate, ignored if null
+ public ExecOutputDelegate Output { get; set; }
+ // Ah, the Nuffer, originally a typo; but, I liked it. This is the copy of the stream.
+ private List itsNuffer = new List();
+ // This may be used to get the copy.
+ public string[] Standard { get { return itsNuffer.ToArray(); } }
+ // The Process
+ private System.Diagnostics.Process itsProcess = null;
+ public StdHandler(OutputSource aSource, System.Diagnostics.Process aProcess, ExecOutputDelegate aOutput)
+ {
+ itsProcess = aProcess;
+ Source = aSource;
+ Output = aOutput;
+ if (Source == OutputSource.stderr) aProcess.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(OutputDataReceived);
+ else aProcess.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(OutputDataReceived);
+ }
+ public void Start()
+ {
+ if (Source == OutputSource.stderr) itsProcess.BeginErrorReadLine();
+ else itsProcess.BeginOutputReadLine();
+ }
+ private void OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
+ {
+ if (!string.IsNullOrEmpty(e.Data) && (Output == null || !Output(Source, e.Data)))
+ itsNuffer.Add(e.Data);
+ }
+ }
+ public static ExecuteResult Execute(string aUserName, System.Security.SecureString aCheck, string aExe, string aArgs,
+ string aStdin, ExecOutputDelegate aOutputAndError)
+ {
+ return Execute(aUserName, aCheck, aExe, aArgs, System.Diagnostics.ProcessPriorityClass.Normal, aStdin, aOutputAndError, aOutputAndError);
+ }
+
+ public static ExecuteResult Execute(string aUserName, System.Security.SecureString aCheck, string aExe, string aArgs,
+ System.Diagnostics.ProcessPriorityClass aPriority,
+ string aStdin, ExecOutputDelegate aOutput, ExecOutputDelegate aError)
+ {
+ string Domain = string.Empty;
+ string User = ParseUserName(aUserName, out Domain);
+ bool HasStdin = !string.IsNullOrEmpty(aStdin);
+ ExecuteResult Result = null;
+ try
+ {
+ using (System.Diagnostics.Process P = new System.Diagnostics.Process())
+ {
+ P.StartInfo =
+ new System.Diagnostics.ProcessStartInfo(aExe, aArgs)
+ {
+ UseShellExecute = false,
+ RedirectStandardInput = HasStdin,
+ RedirectStandardError = true,
+ RedirectStandardOutput = true,
+ CreateNoWindow = true,
+ UserName = User,
+ Domain = Domain,
+ Password = aCheck,
+ LoadUserProfile = true,
+ };
+ // These will read while the process is running.
+ StdHandler Out = new StdHandler(OutputSource.stdout, P, aOutput);
+ StdHandler Err = new StdHandler(OutputSource.stderr, P, aError);
+ // Go
+ P.Start();
+ // Start the handlers
+ Out.Start(); Err.Start();
+ // Send any imput to the process
+ if (HasStdin)
+ {
+ P.StandardInput.WriteLine(aStdin);
+ P.StandardInput.Flush();
+ }
+ // Gotta set priority AFTER start
+ P.PriorityClass = aPriority;
+ // And wait till it is done (timeout?)
+ P.WaitForExit();
+ // And done, build a result thingy
+ Result = new ExecuteResult(P, Out, Err);
+ }
+ }
+ catch (Exception Ex)
+ {
+ Debug.Write("Execute (" + aExe + "): ");
+ Debug.WriteLine(Ex);
+ Result = new ExecuteResult(Ex);
+ }
+ return Result;
+ }
+
+ // Quick and dirty, just write stdout and stderr to console.out and console.error; current user
+ public static string Run(string aExe, string aArgs)
+ {
+ string Result = aExe + ' ' + aArgs + '\n';
+ try
+ {
+ using (System.Diagnostics.Process P = new System.Diagnostics.Process())
+ {
+ P.StartInfo =
+ new System.Diagnostics.ProcessStartInfo(aExe, aArgs)
+ {
+ UseShellExecute = false,
+ RedirectStandardError = true,
+ RedirectStandardOutput = true,
+ CreateNoWindow = true,
+ };
+ P.Start();
+ // And wait till it is done (timeout?)
+ P.WaitForExit();
+ Result += P.StandardOutput.ReadToEnd();
+ Result += P.StandardError.ReadToEnd();
+ }
+ }
+ catch (Exception Ex)
+ {
+ Debug.Write("Run (" + aExe + "): ");
+ Debug.WriteLine(Ex);
+ Result += Ex.Message;
+ }
+ return Result;
+ }
+ public static bool RunAs(string aExe, string aArgs)
+ {
+ string Redir = string.Empty;
+ if (!Utility.Tools.NoException((Action)delegate() { Redir = System.IO.Path.GetTempFileName(); }))
+ return false;
+ bool Result = false;
+ try
+ {
+ using (System.Diagnostics.Process P = new System.Diagnostics.Process())
+ {
+ P.StartInfo =
+ new System.Diagnostics.ProcessStartInfo("cmd", "/c " + aExe + ' ' + aArgs + " >" + Redir + " 2>&1")
+ {
+ UseShellExecute = true,
+ RedirectStandardError = false, // Can't do with shell (dunno why)
+ RedirectStandardOutput = false,
+ CreateNoWindow = true,
+ Verb = "runas",
+ };
+ P.Start();
+ // And wait till it is done (timeout?)
+ P.WaitForExit();
+ Console.Out.WriteLine(System.IO.File.ReadAllText(Redir));
+ }
+ Result = true;
+ }
+ catch (Exception Ex)
+ {
+ Console.Error.Write("RunAs (" + aExe + "): ");
+ Console.Error.WriteLine(Ex);
+ }
+ finally
+ {
+ System.IO.File.Delete(Redir);
+ }
+ return Result;
+ }
+ public static bool IsValid(string aUserName, System.Security.SecureString aCheck)
+ {
+ ExecuteResult er = Execute(aUserName, aCheck, "cmd.exe", "/c echo OK");
+ Debug.WriteLine("stdout:\n{" + er.StdoutString ?? "" + "}\nstderr:\n" + er.StderrString ?? "" + "\nExecption:\n" + er.Ex ?? string.Empty);
+ return !er.Error && er.StdoutString == "OK"; // goofy ole DOS
+ }
+ }
+}
diff --git a/Utility/Utility.csproj b/Utility/Utility.csproj
new file mode 100644
index 000000000..61875eda5
--- /dev/null
+++ b/Utility/Utility.csproj
@@ -0,0 +1,129 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {0E3DF716-5657-4B51-9BF2-3791880930E1}
+ Library
+ Properties
+ Utility
+ Utility
+ v3.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+ 3.5
+
+
+
+ 3.5
+
+
+ 3.5
+
+
+
+
+
+
+
+
+
+ Component
+
+
+ UserControl
+
+
+ FolderTreeControl.cs
+
+
+ Form
+
+
+ GetCheck.cs
+
+
+ UserControl
+
+
+ MonthPicker.cs
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ Component
+
+
+ SecureTextBox.cs
+
+
+
+
+
+ UserControl
+
+
+ DayPicker.cs
+
+
+
+
+
+ DayPicker.cs
+
+
+ FolderTreeControl.cs
+
+
+ GetCheck.cs
+
+
+ MonthPicker.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SecureTextBox.cs
+
+
+
+
+
\ No newline at end of file
diff --git a/thirdparty/TaskScheduler/Microsoft.Win32.TaskScheduler.XML b/thirdparty/TaskScheduler/Microsoft.Win32.TaskScheduler.XML
new file mode 100644
index 000000000..7a18ac4c3
--- /dev/null
+++ b/thirdparty/TaskScheduler/Microsoft.Win32.TaskScheduler.XML
@@ -0,0 +1,3024 @@
+
+
+
+ Microsoft.Win32.TaskScheduler
+
+
+
+
+ Provides access to the Task Scheduler service for managing registered tasks.
+
+
+
+
+ Creates a new instance of a TaskService connecting to the local machine as the current user.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The name of the computer that you want to connect to. If the this parameter is empty, then this will connect to the local computer.
+ The user name that is used during the connection to the computer. If the user is not specified, then the current token is used.
+ The domain of the user specified in the parameter.
+ The password that is used to connect to the computer. If the user name and password are not specified, then the current token is used.
+ If set to true force Task Scheduler 1.0 compatibility.
+
+
+
+ Creates a new task, registers the taks, and returns the instance.
+
+ The task name. If this value is NULL, the task will be registered in the root task folder and the task name will be a GUID value that is created by the Task Scheduler service. A task name cannot begin or end with a space character. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ The to determine when to run the task.
+ The to determine what happens when the task is triggered.
+ The user credentials used to register the task.
+ The password for the userId used to register the task.
+ A value that defines what logon technique is used to run the registered task.
+
+ A instance of the registered task.
+
+
+
+
+ Finds a task given a name and standard wildcards.
+
+ The task name. This can include the wildcards * or ?.
+ if set to true search all sub folders.
+ A if one matches , otherwise NULL.
+
+
+
+ Gets the path to a folder of registered tasks.
+
+ The path to the folder to retrieve. Do not use a backslash following the last folder name in the path. The root task folder is specified with a backslash (\). An example of a task folder path, under the root task folder, is \MyTaskFolder. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ instance for the requested folder.
+ Requested folder was not found.
+ Folder other than the root (\) was requested on a system not supporting Task Scheduler 2.0.
+
+
+
+ Gets a collection of running tasks.
+
+ True to include hidden tasks.
+ instance with the list of running tasks.
+
+
+
+ Gets the task with the specified path.
+
+ The task path.
+ The task.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ Returns an empty task definition object to be filled in with settings and properties and then registered using the method.
+
+ instance for setting properties.
+
+
+
+ Starts the Task Scheduler UI for the OS hosting the assembly if the session is running in interactive mode.
+
+
+
+
+ Releases the unmanaged resources used by the and optionally releases the managed resources.
+
+ true to release both managed and unmanaged resources; false to release only unmanaged resources.
+
+
+
+ Connects this instance of the class to a running Task Scheduler.
+
+
+
+
+ Finds the task in folder.
+
+ The folder.
+ The wildcard expression to compare task names with.
+ if set to true recurse folders.
+ A if one matches , otherwise NULL.
+
+
+
+ Gets a Boolean value that indicates if you are connected to the Task Scheduler service.
+
+
+
+
+ Gets the name of the domain to which the computer is connected.
+
+
+
+
+ Gets the name of the user that is connected to the Task Scheduler service.
+
+
+
+
+ Gets the highest version of Task Scheduler that a computer supports.
+
+
+
+
+ Gets the root ("\") folder. For Task Scheduler 1.0, this is the only folder.
+
+
+
+
+ Gets or sets the name of the computer that is running the Task Scheduler service that the user is connected to.
+
+
+
+
+ Gets or sets the user account domain to be used when connecting to the .
+
+ The user account domain.
+
+
+
+ Gets or sets the user name to be used when connecting to the .
+
+ The user name.
+
+
+
+ Gets or sets the user password to be used when connecting to the .
+
+ The user password.
+
+
+
+ Gets a value indicating whether the component can raise an event.
+
+
+ true if the component can raise events; otherwise, false. The default is true.
+
+
+
+
+ Contains a collection of name-value pairs.
+
+
+
+
+ Copies current to another.
+
+ The destination collection.
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Adds a name-value pair to the collection.
+
+ The name associated with a value in a name-value pair.
+ The value associated with a name in a name-value pair.
+
+
+
+ Removes a selected name-value pair from the collection.
+
+ Index of the pair to remove.
+
+
+
+ Clears the entire collection of name-value pairs.
+
+
+
+
+ Gets the collection enumerator for the name-value collection.
+
+ An for the collection.
+
+
+
+ Gets the number of items in the collection.
+
+
+
+
+ Gets the value of the item at the specified index.
+
+ The index of the item being requested.
+ The value of the name-value pair at the specified index.
+
+
+
+ Gets the value of the item with the specified key.
+
+ Key to get the value for.
+ Value for the key, or null if not found.
+
+
+ Defines what versions of Task Scheduler or the AT command that the task is compatible with.
+
+
+ The task is compatible with the AT command.
+
+
+ The task is compatible with Task Scheduler 1.0.
+
+
+ The task is compatible with Task Scheduler 2.0.
+
+
+ Defines how the Task Scheduler service creates, updates, or disables the task.
+
+
+ The Task Scheduler service registers the task as a new task.
+
+
+ The Task Scheduler service either registers the task as a new task or as an updated version if the task already exists. Equivalent to Create | Update.
+
+
+ The Task Scheduler service registers the disabled task. A disabled task cannot run until it is enabled. For more information, see Enabled Property of TaskSettings and Enabled Property of RegisteredTask.
+
+
+ The Task Scheduler service is prevented from adding the allow access-control entry (ACE) for the context principal. When the TaskFolder.RegisterTaskDefinition or TaskFolder.RegisterTask functions are called with this flag to update a task, the Task Scheduler service does not add the ACE for the new context principal and does not remove the ACE from the old context principal.
+
+
+ The Task Scheduler service creates the task, but ignores the registration triggers in the task. By ignoring the registration triggers, the task will not execute when it is registered unless a time-based trigger causes it to execute on registration.
+
+
+ The Task Scheduler service registers the task as an updated version of an existing task. When a task with a registration trigger is updated, the task will execute after the update occurs.
+
+
+ The Task Scheduler service checks the syntax of the XML that describes the task but does not register the task. This constant cannot be combined with the Create, Update, or CreateOrUpdate values.
+
+
+ Defines how the Task Scheduler handles existing instances of the task when it starts a new instance of the task.
+
+
+ Starts new instance while an existing instance is running.
+
+
+ Starts a new instance of the task after all other instances of the task are complete.
+
+
+ Does not start a new instance if an existing instance of the task is running.
+
+
+ Stops an existing instance of the task before it starts a new instance.
+
+
+ Defines what logon technique is required to run a task.
+
+
+ The logon method is not specified. Used for non-NT credentials.
+
+
+ Use a password for logging on the user. The password must be supplied at registration time.
+
+
+ Use an existing interactive token to run a task. The user must log on using a service for user (S4U) logon. When an S4U logon is used, no password is stored by the system and there is no access to either the network or to encrypted files.
+
+
+ User must already be logged on. The task will be run only in an existing interactive session.
+
+
+ Group activation. The groupId field specifies the group.
+
+
+ Indicates that a Local System, Local Service, or Network Service account is being used as a security context to run the task.
+
+
+ First use the interactive token. If the user is not logged on (no interactive token is available), then the password is used. The password must be specified when a task is registered. This flag is not recommended for new tasks because it is less reliable than Password.
+
+
+ Defines the types of process security identifier (SID) that can be used by tasks. These changes are used to specify the type of process SID in the IPrincipal2 interface.
+
+
+ No changes will be made to the process token groups list.
+
+
+ A task SID that is derived from the task name will be added to the process token groups list, and the token default discretionary access control list (DACL) will be modified to allow only the task SID and local system full control and the account SID read control.
+
+
+ A Task Scheduler will apply default settings to the task process.
+
+
+ Defines how a task is run.
+
+
+ The task is run as the user who is calling the Run method.
+
+
+ The task is run regardless of constraints such as "do not run on batteries" or "run only if idle".
+
+
+ The task is run with all flags ignored.
+
+
+ The task is run using a terminal server session identifier.
+
+
+ The task is run using a security identifier.
+
+
+ Defines LUA elevation flags that specify with what privilege level the task will be run.
+
+
+ Tasks will be run with the least privileges.
+
+
+ Tasks will be run with the highest privileges.
+
+
+ Defines what kind of Terminal Server session state change you can use to trigger a task to start. These changes are used to specify the type of state change in the SessionStateChangeTrigger.
+
+
+ Terminal Server console connection state change. For example, when you connect to a user session on the local computer by switching users on the computer.
+
+
+ Terminal Server console disconnection state change. For example, when you disconnect to a user session on the local computer by switching users on the computer.
+
+
+ Terminal Server remote connection state change. For example, when a user connects to a user session by using the Remote Desktop Connection program from a remote computer.
+
+
+ Terminal Server remote disconnection state change. For example, when a user disconnects from a user session while using the Remote Desktop Connection program from a remote computer.
+
+
+ Terminal Server session locked state change. For example, this state change causes the task to run when the computer is locked.
+
+
+ Terminal Server session unlocked state change. For example, this state change causes the task to run when the computer is unlocked.
+
+
+ Defines the different states that a registered task can be in.
+
+
+ The state of the task is unknown.
+
+
+ The task is registered but is disabled and no instances of the task are queued or running. The task cannot be run until it is enabled.
+
+
+ Instances of the task are queued.
+
+
+ The task is ready to be executed, but no instances are queued or running.
+
+
+ One or more instances of the task is running.
+
+
+
+ Specifies how the Task Scheduler performs tasks when the computer is in an idle condition. For information about idle conditions, see Task Idle Conditions.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets or sets a value that indicates the amount of time that the computer must be in an idle state before the task is run.
+
+
+
+
+ Gets or sets a Boolean value that indicates whether the task is restarted when the computer cycles into an idle condition more than once.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the Task Scheduler will terminate the task if the idle condition ends before the task is completed.
+
+
+
+
+ Gets or sets a value that indicates the amount of time that the Task Scheduler will wait for an idle condition to occur.
+
+
+
+
+ Provides the settings that the Task Scheduler service uses to obtain a network profile.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets or sets a GUID value that identifies a network profile.
+
+
+
+
+ Gets or sets the name of a network profile. The name is used for display purposes.
+
+
+
+
+ Provides the methods to get information from and control a running task.
+
+
+
+
+ Provides the methods that are used to run the task immediately, get any running instances of the task, get or set the credentials that are used to register the task, and the properties that describe the task.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets the times that the registered task is scheduled to run during a specified time.
+
+ The starting time for the query.
+ The ending time for the query.
+ The requested number of runs. A value of 0 will return all times requested.
+ The scheduled times that the task will run.
+
+
+
+ Gets the security descriptor for the task. Not available to Task Scheduler 1.0.
+
+ Section(s) of the security descriptor to return.
+ The security descriptor for the task.
+
+
+
+ Updates the task with any changes made to the by calling from the currently registered folder using the currently registered name.
+
+ Thrown if task was previously registered with a password.
+
+
+
+ Runs the registered task immediately.
+
+ The parameters used as values in the task actions.
+ A instance that defines the new instance of the task.
+
+
+
+ Runs the registered task immediately using specified flags and a session identifier.
+
+ Defines how the task is run.
+ The terminal server session in which you want to start the task.
+ The user for which the task runs.
+ The parameters used as values in the task actions.
+ A instance that defines the new instance of the task.
+
+
+
+ Sets the security descriptor for the task. Not available to Task Scheduler 1.0.
+
+ The security descriptor for the task.
+ Section(s) of the security descriptor to set.
+
+
+
+ Dynamically tries to load the assembly for the editor and displays it as editable for this task.
+
+ true if editor returns with Ok response; false otherwise.
+ The Microsoft.Win32.TaskSchedulerEditor.dll assembly must reside in the same directory as the Microsoft.Win32.TaskScheduler.dll or in the GAC.
+
+
+
+ Shows the property page for the task (v1.0 only).
+
+
+
+
+ Stops the registered task immediately.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets the definition of the task.
+
+
+
+
+ Gets or sets a Boolean value that indicates if the registered task is enabled.
+
+
+
+
+ Gets the time the registered task was last run.
+
+
+
+
+ Gets the results that were returned the last time the registered task was run.
+
+
+
+
+ Gets the name of the registered task.
+
+
+
+
+ Gets the time when the registered task is next scheduled to run.
+
+
+
+
+ Gets the number of times the registered task has missed a scheduled run.
+
+
+
+
+ Gets the path to where the registered task is stored.
+
+
+
+
+ Gets or sets the security descriptor for the task.
+
+ The security descriptor.
+
+
+
+ Gets the operational state of the registered task.
+
+
+
+
+ Gets or sets the that manages this task.
+
+ The task service.
+
+
+
+ Gets the XML-formatted registration information for the registered task. Not available with Task Scheduler 1.0.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Refreshes all of the local instance variables of the task.
+
+
+
+
+ Gets the name of the current action that the running task is performing.
+
+
+
+
+ Gets the process ID for the engine (process) which is running the task.
+
+
+
+
+ Gets the GUID identifier for this instance of the task.
+
+
+
+
+ Defines all the components of a task, such as the task settings, triggers, actions, and registration information.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets a collection of actions that are performed by the task.
+
+
+
+
+ Gets or sets the data that is associated with the task. This data is ignored by the Task Scheduler service, but is used by third-parties who wish to extend the task format.
+
+
+
+
+ Gets the principal for the task that provides the security credentials for the task.
+
+
+
+
+ Gets a class instance of registration information that is used to describe a task, such as the description of the task, the author of the task, and the date the task is registered.
+
+
+
+
+ Gets the settings that define how the Task Scheduler service performs the task.
+
+
+
+
+ Gets a collection of triggers that are used to start a task.
+
+
+
+
+ Gets or sets the XML-formatted definition of the task. Not available on Task Scheduler 1.0.
+
+
+
+
+ Provides the security credentials for a principal. These security credentials define the security context for the tasks that are associated with the principal.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the name of the principal that is displayed in the Task Scheduler UI.
+
+
+
+
+ Gets or sets the identifier of the user group that is required to run the tasks that are associated with the principal. Setting this property to something other than a null or empty string, will set the property to NULL and will set the property to TaskLogonType.Group;
+
+
+
+
+ Gets or sets the identifier of the principal.
+
+
+
+
+ Gets or sets the security logon method that is required to run the tasks that are associated with the principal.
+
+
+
+
+ Gets or sets the identifier that is used to specify the privilege level that is required to run the tasks that are associated with the principal.
+
+
+
+
+ Gets or sets the user identifier that is required to run the tasks that are associated with the principal. Setting this property to something other than a null or empty string, will set the property to NULL;
+
+
+
+
+ Provides the administrative information that can be used to describe the task. This information includes details such as a description of the task, the author of the task, the date the task is registered, and the security descriptor of the task.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets or sets the author of the task.
+
+
+
+
+ Gets or sets the date and time when the task is registered.
+
+
+
+
+ Gets or sets the description of the task.
+
+
+
+
+ Gets or sets any additional documentation for the task.
+
+
+
+
+ Gets or sets the security descriptor of the task.
+
+ The security descriptor.
+
+
+
+ Gets or sets the security descriptor of the task.
+
+
+
+
+ Gets or sets where the task originated from. For example, a task may originate from a component, service, application, or user.
+
+
+
+
+ Gets or sets the URI of the task.
+
+
+
+
+ Gets or sets the version number of the task.
+
+
+
+
+ Gets or sets an XML-formatted version of the registration information for the task. Not available for Task Scheduler 1.0.
+
+
+
+
+ Provides the settings that the Task Scheduler service uses to perform the task.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task can be started by using either the Run command or the Context menu.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task may be terminated by using TerminateProcess.
+
+
+
+
+ Gets or sets an integer value that indicates which version of Task Scheduler a task is compatible with.
+
+
+
+
+ Gets or sets the amount of time that the Task Scheduler will wait before deleting the task after it expires.
+
+
+ For Task Scheduler 1.0, this property will return a TimeSpan of 1 second if the task is set to delete when done. For either version, TimeSpan.Zero will indicate that the task should not be deleted.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task will not be started if the computer is running on battery power.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task is enabled. The task can be performed only when this setting is TRUE.
+
+
+
+
+ Gets or sets the amount of time that is allowed to complete the task.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task will not be visible in the UI by default.
+
+
+
+
+ Gets or sets the information that specifies how the Task Scheduler performs tasks when the computer is in an idle state.
+
+
+
+
+ Gets or sets the policy that defines how the Task Scheduler handles multiple instances of the task.
+
+
+
+
+ Gets or sets the network settings object that contains a network profile identifier and name. If the RunOnlyIfNetworkAvailable property of ITaskSettings is true and a network propfile is specified in the NetworkSettings property, then the task will run only if the specified network profile is available.
+
+
+
+
+ Gets or sets the priority level of the task.
+
+
+
+
+ Gets or sets the number of times that the Task Scheduler will attempt to restart the task.
+
+
+
+
+ Gets or sets a value that specifies how long the Task Scheduler will attempt to restart the task.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the Task Scheduler will run the task only if the computer is in an idle condition.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the Task Scheduler will run the task only if the user is logged on (v1.0 only)
+
+
+
+
+ Gets or sets a Boolean value that indicates that the Task Scheduler will run the task only when a network is available.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the Task Scheduler can start the task at any time after its scheduled time has passed.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task will be stopped if the computer switches to battery power.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the Task Scheduler will wake the computer when it is time to run the task.
+
+
+
+
+ Gets or sets an XML-formatted definition of the task settings.
+
+
+
+
+ Provides the methods that are used to add to, remove from, and get the triggers of a task.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets the collection enumerator for this collection.
+
+ The for this collection.
+
+
+
+ Add an unbound to the task.
+
+ derivative to add to the task.
+ Bound trigger.
+
+
+
+ Add a new trigger to the collections of triggers for the task.
+
+ The type of trigger to create.
+ A instance of the specified type.
+
+
+
+ Clears all triggers from the task.
+
+
+
+
+ Inserts an trigger at the specified index.
+
+ The zero-based index at which trigger should be inserted.
+ The trigger to insert into the list.
+
+
+
+ Removes the trigger at a specified index.
+
+ Index of trigger to remove.
+ Index out of range.
+
+
+
+ Returns a that represents the triggers in this collection.
+
+
+ A that represents the triggers in this collection.
+
+
+
+
+ Gets the number of triggers in the collection.
+
+
+
+
+ Gets a specified trigger from the collection.
+
+ The index of the trigger to be retrieved.
+ Specialized instance.
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Provides the methods that are used to register (create) tasks in the folder, remove tasks from the folder, and create or remove subfolders from the folder.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Creates a folder for related tasks. Not available to Task Scheduler 1.0.
+
+ The name used to identify the folder. If "FolderName\SubFolder1\SubFolder2" is specified, the entire folder tree will be created if the folders do not exist. This parameter can be a relative path to the current instance. The root task folder is specified with a backslash (\). An example of a task folder path, under the root task folder, is \MyTaskFolder. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ A instance that represents the new subfolder.
+
+
+
+ Creates a folder for related tasks. Not available to Task Scheduler 1.0.
+
+ The name used to identify the folder. If "FolderName\SubFolder1\SubFolder2" is specified, the entire folder tree will be created if the folders do not exist. This parameter can be a relative path to the current instance. The root task folder is specified with a backslash (\). An example of a task folder path, under the root task folder, is \MyTaskFolder. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ The security descriptor associated with the folder.
+ A instance that represents the new subfolder.
+
+
+
+ Creates a folder for related tasks. Not available to Task Scheduler 1.0.
+
+ The name used to identify the folder. If "FolderName\SubFolder1\SubFolder2" is specified, the entire folder tree will be created if the folders do not exist. This parameter can be a relative path to the current instance. The root task folder is specified with a backslash (\). An example of a task folder path, under the root task folder, is \MyTaskFolder. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ The security descriptor associated with the folder.
+ A instance that represents the new subfolder.
+
+
+
+ Deletes a subfolder from the parent folder. Not available to Task Scheduler 1.0.
+
+ The name of the subfolder to be removed. The root task folder is specified with a backslash (\). This parameter can be a relative path to the folder you want to delete. An example of a task folder path, under the root task folder, is \MyTaskFolder. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+
+
+
+ Gets a collection of all the tasks in the folder whose name matches the optional .
+
+ The optional name filter expression.
+ Collection of all matching tasks.
+
+
+
+ Deletes a task from the folder.
+
+ The name of the task that is specified when the task was registered. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+
+
+
+ Registers (creates) a new task in the folder using XML to define the task. Not available for Task Scheduler 1.0.
+
+ The task name. If this value is NULL, the task will be registered in the root task folder and the task name will be a GUID value that is created by the Task Scheduler service. A task name cannot begin or end with a space character. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ An XML-formatted definition of the task.
+ A union of flags.
+ The user credentials used to register the task.
+ The password for the userId used to register the task.
+ A value that defines what logon technique is used to run the registered task.
+ The security descriptor associated with the registered task. You can specify the access control list (ACL) in the security descriptor for a task in order to allow or deny certain users and groups access to a task.
+ A instance that represents the new task.
+
+
+
+ Registers (creates) a task in a specified location using a instance to define a task.
+
+ The task name. If this value is NULL, the task will be registered in the root task folder and the task name will be a GUID value that is created by the Task Scheduler service. A task name cannot begin or end with a space character. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ The of the registered task.
+ A instance that represents the new task.
+
+
+
+ Registers (creates) a task in a specified location using a instance to define a task.
+
+ The task name. If this value is NULL, the task will be registered in the root task folder and the task name will be a GUID value that is created by the Task Scheduler service. A task name cannot begin or end with a space character. The '.' character cannot be used to specify the current task folder and the '..' characters cannot be used to specify the parent task folder in the path.
+ The of the registered task.
+ A union of flags.
+ The user credentials used to register the task.
+ The password for the userId used to register the task.
+ A value that defines what logon technique is used to run the registered task.
+ The security descriptor associated with the registered task. You can specify the access control list (ACL) in the security descriptor for a task in order to allow or deny certain users and groups access to a task.
+ A instance that represents the new task.
+
+
+
+ Gets the security descriptor for the folder. Not available to Task Scheduler 1.0.
+
+ Section(s) of the security descriptor to return.
+ The security descriptor for the folder.
+
+
+
+ Gets the security descriptor for the folder. Not available to Task Scheduler 1.0.
+
+ Section(s) of the security descriptor to return.
+ The security descriptor for the folder.
+
+
+
+ Sets the security descriptor for the folder. Not available to Task Scheduler 1.0.
+
+ The security descriptor for the folder.
+ Section(s) of the security descriptor to set.
+
+
+
+ Sets the security descriptor for the folder. Not available to Task Scheduler 1.0.
+
+ The security descriptor for the folder.
+ Section(s) of the security descriptor to set.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets the name that is used to identify the folder that contains a task.
+
+
+
+
+ Gets the path to where the folder is stored.
+
+
+
+
+ Gets or sets the security descriptor of the task.
+
+ The security descriptor.
+
+
+
+ Gets all the subfolders in the folder.
+
+
+
+
+ Gets or sets the that manages this task.
+
+ The task service.
+
+
+
+ Gets a collection of all the tasks in the folder.
+
+
+
+
+ Provides information and control for a collection of folders that contain tasks.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Copies the elements of the ICollection to an Array, starting at a particular Array index.
+
+ The one-dimensional Array that is the destination of the elements copied from . The Array must have zero-based indexing.
+ The zero-based index in array at which copying begins.
+
+
+
+ Gets a list of items in a collection.
+
+ Enumerated list of items in the collection.
+
+
+
+ Gets the specified folder from the collection.
+
+ The index of the folder to be retrieved.
+ A TaskFolder instance that represents the requested folder.
+
+
+
+ Gets the specified folder from the collection.
+
+ The path of the folder to be retrieved.
+ A TaskFolder instance that represents the requested folder.
+
+
+
+ Gets the number of items in the collection.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ A strongly-typed resource class, for looking up localized strings, etc.
+
+
+
+
+ Returns the cached ResourceManager instance used by this class.
+
+
+
+
+ Overrides the current thread's CurrentUICulture property for all
+ resource lookups using this strongly typed resource class.
+
+
+
+
+ Looks up a localized string similar to Call a COM object.
+
+
+
+
+ Looks up a localized string similar to Start a program.
+
+
+
+
+ Looks up a localized string similar to Send an e-mail.
+
+
+
+
+ Looks up a localized string similar to Display a message.
+
+
+
+
+ Looks up a localized string similar to {0}.
+
+
+
+
+ Looks up a localized string similar to every day.
+
+
+
+
+ Looks up a localized string similar to Friday.
+
+
+
+
+ Looks up a localized string similar to Monday.
+
+
+
+
+ Looks up a localized string similar to Saturday.
+
+
+
+
+ Looks up a localized string similar to Sunday.
+
+
+
+
+ Looks up a localized string similar to Thursday.
+
+
+
+
+ Looks up a localized string similar to Tuesday.
+
+
+
+
+ Looks up a localized string similar to Wednesday.
+
+
+
+
+ Looks up a localized string similar to {1} {0}.
+
+
+
+
+ Looks up a localized string similar to ..
+
+
+
+
+ Looks up a localized string similar to {0} {1}.
+
+
+
+
+ Looks up a localized string similar to , .
+
+
+
+
+ Looks up a localized string similar to every month.
+
+
+
+
+ Looks up a localized string similar to April.
+
+
+
+
+ Looks up a localized string similar to August.
+
+
+
+
+ Looks up a localized string similar to December.
+
+
+
+
+ Looks up a localized string similar to February.
+
+
+
+
+ Looks up a localized string similar to January.
+
+
+
+
+ Looks up a localized string similar to July.
+
+
+
+
+ Looks up a localized string similar to June.
+
+
+
+
+ Looks up a localized string similar to March.
+
+
+
+
+ Looks up a localized string similar to May.
+
+
+
+
+ Looks up a localized string similar to November.
+
+
+
+
+ Looks up a localized string similar to October.
+
+
+
+
+ Looks up a localized string similar to September.
+
+
+
+
+ Looks up a localized string similar to Multiple actions defined.
+
+
+
+
+ Looks up a localized string similar to Multiple triggers defined.
+
+
+
+
+ Looks up a localized string similar to {0}.
+
+
+
+
+ Looks up a localized string similar to Author.
+
+
+
+
+ Looks up a localized string similar to Disabled.
+
+
+
+
+ Looks up a localized string similar to Queued.
+
+
+
+
+ Looks up a localized string similar to Ready.
+
+
+
+
+ Looks up a localized string similar to Running.
+
+
+
+
+ Looks up a localized string similar to Unknown.
+
+
+
+
+ Looks up a localized string similar to any user.
+
+
+
+
+ Looks up a localized string similar to After triggered, repeat every.
+
+
+
+
+ Looks up a localized string similar to indefinitely.
+
+
+
+
+ Looks up a localized string similar to for a duration of.
+
+
+
+
+ Looks up a localized string similar to Trigger expires at.
+
+
+
+
+ Looks up a localized string similar to At system startup.
+
+
+
+
+ Looks up a localized string similar to At {0:t} every day.
+
+
+
+
+ Looks up a localized string similar to At {0:t} every {1} days.
+
+
+
+
+ Looks up a localized string similar to Custom event filter.
+
+
+
+
+ Looks up a localized string similar to On event - Log: {0}.
+
+
+
+
+ Looks up a localized string similar to , Source: {0}.
+
+
+
+
+ Looks up a localized string similar to , EventID: {0}.
+
+
+
+
+ Looks up a localized string similar to When computer is idle.
+
+
+
+
+ Looks up a localized string similar to At log on of {0}.
+
+
+
+
+ Looks up a localized string similar to At {0:t} on day {1} of {2}, starting {0:d}.
+
+
+
+
+ Looks up a localized string similar to At {0:t} on the {1} {2:f} each {3}, starting {0:d}.
+
+
+
+
+ Looks up a localized string similar to When the task is created or modified.
+
+
+
+
+ Looks up a localized string similar to On local connection to {0}..
+
+
+
+
+ Looks up a localized string similar to On local disconnect from {0}..
+
+
+
+
+ Looks up a localized string similar to On remote connection to {0}..
+
+
+
+
+ Looks up a localized string similar to On remote disconnect from {0}..
+
+
+
+
+ Looks up a localized string similar to On workstation lock of {0}..
+
+
+
+
+ Looks up a localized string similar to On workstation unlock of {0}..
+
+
+
+
+ Looks up a localized string similar to user session of {0}.
+
+
+
+
+ Looks up a localized string similar to At {0:t} on {0:d}.
+
+
+
+
+ Looks up a localized string similar to At startup.
+
+
+
+
+ Looks up a localized string similar to Daily.
+
+
+
+
+ Looks up a localized string similar to On an event.
+
+
+
+
+ Looks up a localized string similar to On idle.
+
+
+
+
+ Looks up a localized string similar to At log on.
+
+
+
+
+ Looks up a localized string similar to Monthly.
+
+
+
+
+ Looks up a localized string similar to Monthly.
+
+
+
+
+ Looks up a localized string similar to At task creation/modification.
+
+
+
+
+ Looks up a localized string similar to On state change.
+
+
+
+
+ Looks up a localized string similar to One time.
+
+
+
+
+ Looks up a localized string similar to Weekly.
+
+
+
+
+ Looks up a localized string similar to At {0:t} every {1} of every week, starting {0:d}.
+
+
+
+
+ Looks up a localized string similar to At {0:t} every {1} of every {2} weeks, starting {0:d}.
+
+
+
+
+ Looks up a localized string similar to every.
+
+
+
+
+ Looks up a localized string similar to fifth.
+
+
+
+
+ Looks up a localized string similar to first.
+
+
+
+
+ Looks up a localized string similar to fourth.
+
+
+
+
+ Looks up a localized string similar to last.
+
+
+
+
+ Looks up a localized string similar to second.
+
+
+
+
+ Looks up a localized string similar to third.
+
+
+
+
+ Defines the methods that are called by the Task Scheduler service to manage a COM handler.
+
+
+ This interface must be implemented for a task to perform a COM handler action. When the Task Scheduler performs a COM handler action, it creates and activates the handler and calls the methods of this interface as needed. For information on specifying a COM handler action, see the class.
+
+
+
+
+ Called to start the COM handler. This method must be implemented by the handler.
+
+ An IUnkown interface that is used to communicate back with the Task Scheduler.
+ The arguments that are required by the handler. These arguments are defined in the property of the COM handler action.
+
+
+
+ Called to stop the COM handler. This method must be implemented by the handler.
+
+ The return code that the Task Schedule will raise as an event when the COM handler action is completed.
+
+
+
+ Called to pause the COM handler. This method is optional and should only be implemented to give the Task Scheduler the ability to pause and restart the handler.
+
+
+
+
+ Called to resume the COM handler. This method is optional and should only be implemented to give the Task Scheduler the ability to resume the handler.
+
+
+
+
+ Provides the methods that are used by COM handlers to notify the Task Scheduler about the status of the handler.
+
+
+
+
+ Tells the Task Scheduler about the percentage of completion of the COM handler.
+
+ A value that indicates the percentage of completion for the COM handler.
+ The message that is displayed in the Task Scheduler UI.
+
+
+
+ Tells the Task Scheduler that the COM handler is completed.
+
+ The error code that the Task Scheduler will raise as an event.
+
+
+
+ Collection that contains the actions that are performed by the task.
+
+ A Task Scheduler 1.0 task can only contain a single .
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Adds an action to the task.
+
+ A derived class.
+ The bound that was added to the collection.
+
+
+
+ Adds a new instance to the task.
+
+ Type of task to be created
+ Specialized instance.
+
+
+
+ Clears all actions from the task.
+
+
+
+
+ Inserts an action at the specified index.
+
+ The zero-based index at which action should be inserted.
+ The action to insert into the list.
+
+
+
+ Removes the action at a specified index.
+
+ Index of action to remove.
+ Index out of range.
+
+
+
+ Returns a that represents the actions in this collection.
+
+
+ A that represents the actions in this collection.
+
+
+
+
+ Retrieves an enumeration of each of the actions.
+
+ Returns an object that implements the interface and that can iterate through the objects within the .
+
+
+
+ Gets or sets a an action at the specified index.
+
+ The zero-based index of the action to get or set.
+
+
+
+ Gets or sets the identifier of the principal for the task.
+
+
+
+
+ Gets the number of actions in the collection.
+
+
+
+
+ Gets or sets an XML-formatted version of the collection.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Defines the type of actions a task can perform.
+
+ The action type is defined when the action is created and cannot be changed later. See .
+
+
+ This action fires a handler.
+
+
+ This action performs a command-line operation. For example, the action can run a script, launch an executable, or, if the name of a document is provided, find its associated application and launch the application with the document.
+
+
+ This action sends and e-mail.
+
+
+ This action shows a message box.
+
+
+
+ Abstract base class that provides the common properties that are inherited by all action objects. An action object is created by the method.
+
+
+
+ List of unbound values when working with Actions not associated with a registered task.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ Copies the properties from another the current instance.
+
+ The source .
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Returns the action Id.
+
+ String representation of action.
+
+
+
+ Creates a specialized class from a defined interface.
+
+ Version 2.0 Action interface.
+ Specialized action class
+
+
+
+ Creates the specified action.
+
+ Type of the action to instantiate.
+ of specified type.
+
+
+
+ Gets the type of the action.
+
+ The type of the action.
+
+
+
+ Gets or sets the identifier of the action.
+
+
+
+
+ Represents an action that fires a handler. Only available on Task Scheduler 2.0.
+
+
+
+
+ Creates an unbound instance of .
+
+
+
+
+ Creates an unbound instance of .
+
+ Identifier of the handler class.
+ Addition data associated with the handler.
+
+
+
+ Copies the properties from another the current instance.
+
+ The source .
+
+
+
+ Gets a string representation of the .
+
+ String represention this action.
+
+
+
+ Gets or sets the identifier of the handler class.
+
+
+
+
+ Gets or sets additional data that is associated with the handler.
+
+
+
+
+ Represents an action that executes a command-line operation.
+
+
+
+
+ Creates a new instance of an that can be added to .
+
+
+
+
+ Creates a new instance of an that can be added to .
+
+ Path to an executable file.
+ Arguments associated with the command-line operation. This value can be null.
+ Directory that contains either the executable file or the files that are used by the executable file. This value can be null.
+
+
+
+ Copies the properties from another the current instance.
+
+ The source .
+
+
+
+ Gets a string representation of the .
+
+ String represention this action.
+
+
+
+ Gets or sets the identifier of the action.
+
+
+
+
+ Gets or sets the path to an executable file.
+
+
+
+
+ Gets or sets the arguments associated with the command-line operation.
+
+
+
+
+ Gets or sets the directory that contains either the executable file or the files that are used by the executable file.
+
+
+
+
+ Represents an action that sends an e-mail.
+
+
+
+
+ Creates an unbound instance of .
+
+
+
+
+ Creates an unbound instance of .
+
+ Subject of the e-mail.
+ E-mail address that you want to send the e-mail from.
+ E-mail address or addresses that you want to send the e-mail to.
+ Body of the e-mail that contains the e-mail message.
+ Name of the server that you use to send e-mail from.
+
+
+
+ Copies the properties from another the current instance.
+
+ The source .
+
+
+
+ Gets a string representation of the .
+
+ String represention this action.
+
+
+
+ Gets or sets the name of the server that you use to send e-mail from.
+
+
+
+
+ Gets or sets the subject of the e-mail.
+
+
+
+
+ Gets or sets the e-mail address or addresses that you want to send the e-mail to.
+
+
+
+
+ Gets or sets the e-mail address or addresses that you want to Cc in the e-mail.
+
+
+
+
+ Gets or sets the e-mail address or addresses that you want to Bcc in the e-mail.
+
+
+
+
+ Gets or sets the e-mail address that you want to reply to.
+
+
+
+
+ Gets or sets the e-mail address that you want to send the e-mail from.
+
+
+
+
+ Gets or sets the header information in the e-mail message to send.
+
+
+
+
+ Gets or sets the body of the e-mail that contains the e-mail message.
+
+
+
+
+ Gets or sets an array of attachments that is sent with the e-mail.
+
+
+
+
+ Represents an action that shows a message box when a task is activated.
+
+
+
+
+ Creates a new unbound instance of .
+
+
+
+
+ Creates a new unbound instance of .
+
+ Message text that is displayed in the body of the message box.
+ Title of the message box.
+
+
+
+ Copies the properties from another the current instance.
+
+ The source .
+
+
+
+ Gets a string representation of the .
+
+ String represention this action.
+
+
+
+ Gets or sets the title of the message box.
+
+
+
+
+ Gets or sets the message text that is displayed in the body of the message box.
+
+
+
+
+ Abstract class for throwing a method specific exception.
+
+
+
+
+ Gets a message that describes the current exception.
+
+
+
+
+ Thrown when the calling method is not supported by Task Scheduler 1.0.
+
+
+
+
+ Thrown when the calling method is not supported by Task Scheduler 1.0.
+
+
+
+
+ Represents a wildcard running on the
+ engine.
+
+
+
+
+ Initializes a wildcard with the given search pattern and options.
+
+ The wildcard pattern to match.
+ A combination of one or more .
+
+
+
+ Converts a wildcard to a regex.
+
+ The wildcard pattern to convert.
+ A regex equivalent of the given wildcard.
+
+
+
+ Contains all the tasks that are registered.
+
+ Potentially breaking change in 1.6.2 and later where under V1 the list previously included the '.job' extension on the task name. This has been removed so that it is consistent with V2.
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets the collection enumerator for the register task collection.
+
+ An for this collection.
+
+
+
+ Gets the number of registered tasks in the collection.
+
+
+
+
+ Gets or sets the regular expression filter for task names.
+
+ The regular expression filter.
+
+
+
+ Gets the specified registered task from the collection.
+
+ The index of the registered task to be retrieved.
+ A instance that contains the requested context.
+
+
+
+ Gets the named registered task from the collection.
+
+ The name of the registered task to be retrieved.
+ A instance that contains the requested context.
+
+
+
+ Internal constructor
+
+ TaskService instance
+ The filter.
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Moves to the next task. See MoveNext for more information.
+
+ true if next task found, false if no more tasks.
+
+
+
+ Reset task enumeration. See Reset for more information.
+
+
+
+
+ Retrieves the current task. See for more information.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Collection of running tasks.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets an IEnumerator instance for this collection.
+
+ An enumerator.
+
+
+
+ Gets the number of registered tasks in the collection.
+
+
+
+
+ Gets the specified running task from the collection.
+
+ The index of the running task to be retrieved.
+ A instance.
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Options for a task, used for the Flags property of a Task. Uses the
+ "Flags" attribute, so these values are combined with |.
+ Some flags are documented as Windows 95 only, but they have a
+ user interface in Windows XP so that may not be true.
+
+
+
+
+ The interactive flag is set if the task is intended to be displayed to the user.
+ If the flag is not set, no user interface associated with the task is presented
+ to the user when the task is executed.
+
+
+
+
+ The task will be deleted when there are no more scheduled run times.
+
+
+
+
+ The task is disabled. This is useful to temporarily prevent a task from running
+ at the scheduled time(s).
+
+
+
+
+ The task begins only if the computer is not in use at the scheduled start time. Windows 95 only.
+
+
+
+
+ The task terminates if the computer makes an idle to non-idle transition while the task is running.
+ The computer is not considered idle until the IdleWait triggers' time elapses with no user input.
+ Windows 95 only. For information regarding idle triggers, see .
+
+
+
+
+ The task does not start if its target computer is running on battery power. Windows 95 only.
+
+
+
+
+ The task ends, and the associated application quits if the task's target computer switches
+ to battery power. Windows 95 only.
+
+
+
+
+ The task runs only if the system is docked. Windows 95 only.
+
+
+
+
+ The task is hidden. When the task begins execution, it runs in a hidden window.
+
+
+
+
+ The task runs only if there is currently a valid Internet connection.
+ This feature is currently not implemented.
+
+
+
+
+ The task starts again if the computer makes a non-idle to idle transition before all the
+ task's task_triggers elapse. (Use this flag in conjunction with KillOnIdleEnd.) Windows 95 only.
+
+
+
+
+ The task runs only if the SYSTEM account is available.
+
+
+
+
+ The task runs only if the user specified in SetAccountInformation is logged on interactively.
+ This flag has no effect on work items set to run in the local account.
+
+
+
+
+ Status values returned for a task. Some values have been determined to occur although
+ they do no appear in the Task Scheduler system documentation.
+
+
+
+ The task is ready to run at its next scheduled time.
+
+
+ The task is currently running.
+
+
+ One or more of the properties that are needed to run this task on a schedule have not been set.
+
+
+ The task has not yet run.
+
+
+ The task will not run at the scheduled times because it has been disabled.
+
+
+ There are no more runs scheduled for this task.
+
+
+ The last run of the task was terminated by the user.
+
+
+ Either the task has no triggers or the existing triggers are disabled or not set.
+
+
+ Event triggers don't have set run times.
+
+
+ Valid types of triggers
+
+
+ Trigger is set to run the task a single time.
+
+
+ Trigger is set to run the task on a daily interval.
+
+
+ Trigger is set to run the work item on specific days of a specific week of a specific month.
+
+
+ Trigger is set to run the task on a specific day(s) of the month.
+
+
+ Trigger is set to run the task on specific days, weeks, and months.
+
+
+ Trigger is set to run the task if the system remains idle for the amount of time specified by the idle wait time of the task.
+
+
+ Trigger is set to run the task at system startup.
+
+
+ Trigger is set to run the task when a user logs on.
+
+
+ Values for days of the week (Monday, Tuesday, etc.)
+
+
+ Sunday
+
+
+ Monday
+
+
+ Tuesday
+
+
+ Wednesday
+
+
+ Thursday
+
+
+ Friday
+
+
+ Saturday
+
+
+ All days
+
+
+ Values for months of the year (January, February, etc.)
+
+
+ January
+
+
+ February
+
+
+ March
+
+
+ April
+
+
+ May
+
+
+ June
+
+
+ July
+
+
+ August
+
+
+ September
+
+
+ October
+
+
+ November
+
+
+ December
+
+
+ All months
+
+
+ Defines the type of triggers that can be used by tasks.
+
+
+ Triggers the task when a specific event occurs. Version 1.2 only.
+
+
+ Triggers the task at a specific time of day.
+
+
+ Triggers the task on a daily schedule.
+
+
+ Triggers the task on a weekly schedule.
+
+
+ Triggers the task on a monthly schedule.
+
+
+ Triggers the task on a monthly day-of-week schedule.
+
+
+ Triggers the task when the computer goes into an idle state.
+
+
+ Triggers the task when the task is registered. Version 1.2 only.
+
+
+ Triggers the task when the computer boots.
+
+
+ Triggers the task when a specific user logs on.
+
+
+ Triggers the task when a specific user session state changes. Version 1.2 only.
+
+
+ Values for week of month (first, second, ..., last)
+
+
+ First week of the month
+
+
+ Second week of the month
+
+
+ Third week of the month
+
+
+ Fourth week of the month
+
+
+ Last week of the month
+
+
+ Every week of the month
+
+
+
+ Interface for triggers that support a delay.
+
+
+
+
+ Gets or sets a value that indicates the amount of time before the task is started.
+
+ The delay duration.
+
+
+
+ Interface for triggers that support a user identifier.
+
+
+
+
+ Gets or sets the user for the .
+
+
+
+
+ Abstract base class which provides the common properties that are inherited by all trigger classes. A trigger can be created using the or the method.
+
+
+
+ In testing and may change. Do not use until officially introduced into library.
+
+
+
+ Creates a new that is an unbound copy of this instance.
+
+
+ A new that is an unbound copy of this instance.
+
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Returns a string representing this trigger.
+
+ String value of trigger.
+
+
+
+ Creates the specified trigger.
+
+ Type of the trigger to instantiate.
+ of specified type.
+
+
+
+ Checks the bind value for any conversion.
+
+ The key (property) name.
+ The value.
+
+
+ Assigns the unbound TriggerData structure to the V1 trigger instance.
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a Boolean value that indicates whether the trigger is enabled.
+
+
+
+
+ Gets or sets the date and time when the trigger is deactivated. The trigger cannot start the task after it is deactivated.
+
+
+
+
+ Gets or sets the maximum amount of time that the task launched by this trigger is allowed to run. Not available with Task Scheduler 1.0.
+
+
+
+
+ Gets or sets the identifier for the trigger. Cannot set with Task Scheduler 1.0.
+
+
+
+
+ Gets a instance that indicates how often the task is run and how long the repetition pattern is repeated after the task is started.
+
+
+
+
+ Gets or sets the date and time when the trigger is activated.
+
+
+
+
+ Gets the type of the trigger.
+
+ The of the trigger.
+
+
+ In testing and may change. Do not use until officially introduced into library.
+
+
+
+ Represents a trigger that starts a task when the system is booted.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a value that indicates the amount of time between when the system is booted and when the task is started.
+
+
+
+
+ Represents a trigger that starts a task based on a daily schedule. For example, the task starts at a specific time every day, every other day, every third day, and so on.
+
+
+
+
+ Creates an unbound instance of a .
+
+ Interval between the days in the schedule.
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Sets or retrieves the interval between the days in the schedule.
+
+
+
+
+ Gets or sets a delay time that is randomly added to the start time of the trigger.
+
+
+
+
+ Gets or sets a value that indicates the amount of time before the task is started.
+
+ The delay duration.
+
+
+
+ Represents a trigger that starts a task when a system event occurs. Not available on Task Scheduler 1.0.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Initializes an unbound instance of the class and sets a basic event.
+
+ The event's log.
+ The event's source. Can be null.
+ The event's id. Can be null.
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Gets basic event information.
+
+ The event's log.
+ The event's source. Can be null.
+ The event's id. Can be null.
+ true if subscription represents a basic event, false if not.
+
+
+
+ Sets the subscription for a basic event. This will replace the contents of the property and clear all entries in the property.
+
+ The event's log.
+ The event's source. Can be null.
+ The event's id. Can be null.
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a value that indicates the amount of time between when the system is booted and when the task is started.
+
+
+
+
+ Gets or sets the XPath query string that identifies the event that fires the trigger.
+
+
+
+
+ Gets a collection of named XPath queries. Each query in the collection is applied to the last matching event XML returned from the subscription query specified in the Subscription property. The name of the query can be used as a variable in the message of a action.
+
+
+
+
+ Represents a trigger that starts a task when the computer goes into an idle state. For information about idle conditions, see Task Idle Conditions.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Represents a trigger that starts a task when a user logs on. When the Task Scheduler service starts, all logged-on users are enumerated and any tasks registered with logon triggers that match the logged on user are run. Not available on Task Scheduler 1.0.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a value that indicates the amount of time between when the system is booted and when the task is started.
+
+
+
+
+ Gets or sets The identifier of the user. For example, "MyDomain\MyName" or for a local account, "Administrator".
+ This property can be in one of the following formats:
+ • User name or SID: The task is started when the user logs on to the computer.
+ • NULL: The task is started when any user logs on to the computer.
+
+ If you want a task to be triggered when any member of a group logs on to the computer rather than when a specific user logs on, then do not assign a value to the LogonTrigger.UserId property. Instead, create a logon trigger with an empty LogonTrigger.UserId property and assign a value to the principal for the task using the Principal.GroupId property.
+
+
+
+ Represents a trigger that starts a task on a monthly day-of-week schedule. For example, the task starts on every first Thursday, May through October.
+
+
+
+
+ Creates an unbound instance of a .
+
+ The days of the week.
+ The months of the year.
+ The weeks of the month.
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets the days of the week during which the task runs.
+
+
+
+
+ Gets or sets the months of the year during which the task runs.
+
+
+
+
+ Gets or sets a delay time that is randomly added to the start time of the trigger.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task runs on the last week of the month.
+
+
+
+
+ Gets or sets the weeks of the month during which the task runs.
+
+
+
+
+ Gets or sets a value that indicates the amount of time before the task is started.
+
+ The delay duration.
+
+
+
+ Represents a trigger that starts a job based on a monthly schedule. For example, the task starts on specific days of specific months.
+
+
+
+
+ Creates an unbound instance of a .
+
+ The day of the month.
+ The months of the year.
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Converts an array of bit indices into a mask with bits turned ON at every index
+ contained in the array. Indices must be from 1 to 32 and bits are numbered the same.
+
+ An array with an element for each bit of the mask which is ON.
+ An interger to be interpreted as a mask.
+
+
+
+ Convert an integer representing a mask to an array where each element contains the index
+ of a bit that is ON in the mask. Bits are considered to number from 1 to 32.
+
+ An interger to be interpreted as a mask.
+ An array with an element for each bit of the mask which is ON.
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets the days of the month during which the task runs.
+
+
+
+
+ Gets or sets the months of the year during which the task runs.
+
+
+
+
+ Gets or sets a delay time that is randomly added to the start time of the trigger.
+
+
+
+
+ Gets or sets a Boolean value that indicates that the task runs on the last day of the month.
+
+
+
+
+ Gets or sets a value that indicates the amount of time before the task is started.
+
+ The delay duration.
+
+
+
+ Represents a trigger that starts a task when the task is registered or updated. Not available on Task Scheduler 1.0.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a value that indicates the amount of time between when the system is booted and when the task is started.
+
+
+
+
+ Defines how often the task is run and how long the repetition pattern is repeated after the task is started.
+
+
+
+
+ Releases all resources used by this class.
+
+
+
+
+ Gets or sets how long the pattern is repeated.
+
+
+
+
+ Gets or sets the amount of time between each restart of the task.
+
+
+
+
+ Gets or sets a Boolean value that indicates if a running instance of the task is stopped at the end of repetition pattern duration.
+
+
+
+
+ Triggers tasks for console connect or disconnect, remote connect or disconnect, or workstation lock or unlock notifications.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Initializes a new instance of the class.
+
+ The state change.
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a value that indicates the amount of time between when the system is booted and when the task is started.
+
+
+
+
+ Gets or sets the kind of Terminal Server session change that would trigger a task launch.
+
+
+
+
+ Gets or sets the user for the Terminal Server session. When a session state change is detected for this user, a task is started.
+
+
+
+
+ Represents a trigger that starts a task at a specific date and time.
+
+
+
+
+ Creates an unbound instance of a .
+
+
+
+
+ Creates an unbound instance of a and assigns the execution time.
+
+ Date and time for the trigger to fire.
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets a delay time that is randomly added to the start time of the trigger.
+
+
+
+
+ Gets or sets a value that indicates the amount of time before the task is started.
+
+ The delay duration.
+
+
+
+ Represents a trigger that starts a task based on a weekly schedule. For example, the task starts at 8:00 A.M. on a specific day of the week every week or every other week.
+
+
+
+
+ Creates an unbound instance of a .
+
+ The days of the week.
+ The interval between the weeks in the schedule.
+
+
+
+ Copies the properties from another the current instance. This will not copy any properties associated with any derived triggers except those supporting the interface.
+
+ The source .
+
+
+
+ Gets the non-localized trigger string for V2 triggers.
+
+ String describing the trigger.
+
+
+
+ Gets or sets the days of the week on which the task runs.
+
+
+
+
+ Gets or sets a delay time that is randomly added to the start time of the trigger.
+
+
+
+
+ Gets or sets the interval between the weeks in the schedule.
+
+
+
+
+ Gets or sets a value that indicates the amount of time before the task is started.
+
+ The delay duration.
+
+
+
+ Impersonation of a user. Allows to execute code under another
+ user context.
+ Please note that the account that instantiates the Impersonator class
+ needs to have the 'Act as part of operating system' privilege set.
+
+
+
+
+ Constructor. Starts the impersonation with the given credentials.
+ Please note that the account that instantiates the Impersonator class
+ needs to have the 'Act as part of operating system' privilege set.
+
+ The name of the user to act as.
+ The domain name of the user to act as.
+ The password of the user to act as.
+
+
+
diff --git a/thirdparty/TaskScheduler/Microsoft.Win32.TaskScheduler.dll b/thirdparty/TaskScheduler/Microsoft.Win32.TaskScheduler.dll
new file mode 100644
index 000000000..9cb390948
Binary files /dev/null and b/thirdparty/TaskScheduler/Microsoft.Win32.TaskScheduler.dll differ
diff --git a/thirdparty/TaskScheduler/Task Scheduler Managed Wrapper.URL b/thirdparty/TaskScheduler/Task Scheduler Managed Wrapper.URL
new file mode 100644
index 000000000..321c969d8
--- /dev/null
+++ b/thirdparty/TaskScheduler/Task Scheduler Managed Wrapper.URL
@@ -0,0 +1,2 @@
+[InternetShortcut]
+URL=http://taskscheduler.codeplex.com/