diff --git a/AllBase/BaseClass.cs b/AllBase/BaseClass.cs
index 0397013..3dff292 100644
--- a/AllBase/BaseClass.cs
+++ b/AllBase/BaseClass.cs
@@ -7,6 +7,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
+using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
@@ -26,7 +27,7 @@ namespace AllBase
///
/// 版本ID
///
- public static int VersionCount = 357;
+ public static int VersionCount = 358;
///
/// 版本号
@@ -614,6 +615,29 @@ namespace AllBase
return BitConverter.ToString(output).Replace("-", "");
}
+ ///
+ /// 获取文件MD5值
+ ///
+ ///
+ ///
+ public static string GetFileMd5(string FilePath)
+ {
+ try
+ {
+ FileStream get_file = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
+ System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
+ byte[] hash_byte = get_md5.ComputeHash(get_file);
+ string resule = System.BitConverter.ToString(hash_byte);
+ resule = resule.Replace("-", "");
+ get_file.Close();
+ return resule;
+ }
+ catch (Exception e)
+ {
+ return e.ToString();
+ }
+ }
+
///
/// MD5加密
///
diff --git a/TEMUKJD/Program.cs b/TEMUKJD/Program.cs
index a6e1c6e..5b697aa 100644
--- a/TEMUKJD/Program.cs
+++ b/TEMUKJD/Program.cs
@@ -25,6 +25,7 @@ namespace TemuKJD
//安装客户端必备字体
InstallFont(Application.StartupPath + @"\Fonts\STZHONGS.TTF");
+ StartUp.CheckUpdate();
System.Threading.Tasks.Task.Run(() =>
{
new Initialization().Get();
diff --git a/TEMUKJD/StartUp.cs b/TEMUKJD/StartUp.cs
index 92642e9..e7e5f15 100644
--- a/TEMUKJD/StartUp.cs
+++ b/TEMUKJD/StartUp.cs
@@ -504,5 +504,60 @@ namespace TemuKJD
if (ViolateRuleParam.LstViolateRuleNameSelect != null)
NaiBa.Util.Helper.ConfigHelper.SaveConfig>("violate_rule_name_select", ViolateRuleParam.LstViolateRuleNameSelect);
}
+
+ public static void CheckUpdate()
+ {
+ try
+ {
+ // while (true)
+ {
+ string updatefilepath = System.Environment.CurrentDirectory + "\\Update.exe";
+ var url = BaseClass.BuildObjString("update/get_update");
+ var data = UserLogin.GetSignaturex();
+ var html = GetHtml.PostUtf8(url, data);
+ if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
+ return;
+
+ var updateExeChk = BaseRegex.GetStringJson(ref html, "exe_check").ParseToString();
+ var updateExeAddress = BaseRegex.GetStringJson(ref html, "exe_address");
+ var updateFileAddress = BaseRegex.GetStringJson(ref html, "file_address");
+ var newVersion = BaseRegex.GetIntJson(ref html, "next_version").ParseToInt();
+
+ if (File.Exists(updatefilepath))
+ {
+ string fc = BaseClass.GetFileMd5(updatefilepath);
+ if (fc != updateExeChk)
+ {
+ NaiBa.Util.Helper.HttpHelper.DownloadFile(updateExeAddress, updatefilepath);
+ }
+ }
+ else // 如果自动更新exe文件不存在,则强制更新exe文件
+ NaiBa.Util.Helper.HttpHelper.DownloadFile(updateExeAddress, updatefilepath);
+
+ if (newVersion > BaseClass.VersionCount)
+ {
+ try
+ {
+ if (File.Exists(updatefilepath))
+ {
+ File.WriteAllText(System.Environment.CurrentDirectory + "\\UpdateConfig.ini",
+ "TemuKJD.exe\r\n" +
+ BaseClass.VersionCount + "\r\n" +
+ newVersion + "\r\n" +
+ updateFileAddress);
+
+ Process.Start(updatefilepath);
+ }
+ }
+ catch (Exception ex)
+ {
+ BaseMsgForm.ShowError(ex.Message);
+ }
+ }
+ //Thread.Sleep(1000 * 60 * 60);
+ }
+ }
+ catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); }
+ }
}
}
diff --git a/TEMUKJD/UserForm/LoginForm.cs b/TEMUKJD/UserForm/LoginForm.cs
index ceed620..a8109aa 100644
--- a/TEMUKJD/UserForm/LoginForm.cs
+++ b/TEMUKJD/UserForm/LoginForm.cs
@@ -40,8 +40,17 @@ namespace TemuKJD.UserForm
{
GetUserList();
#if DEBUG
- grpEnvironmentChoice.Visible = true;
- pnlShowRemember.Visible = true;
+ if (File.Exists(System.Environment.CurrentDirectory + "\\TemuKJD.exe.choice.debug.tools"))
+ {
+ grpEnvironmentChoice.Visible = true;
+ pnlShowRemember.Visible = true;
+ }
+ else
+ {
+ grpEnvironmentChoice.Visible = false;
+ pnlShowRemember.Visible = false;
+ rbtPrd.Checked = true;
+ }
#else
grpEnvironmentChoice.Visible = false;
pnlShowRemember.Visible = false;
diff --git a/Update/Update.sln b/Update/Update.sln
new file mode 100644
index 0000000..436c9fd
--- /dev/null
+++ b/Update/Update.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31424.327
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Update", "Update\Update.csproj", "{A170CD54-8361-401B-842B-6B24387F07A5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A170CD54-8361-401B-842B-6B24387F07A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A170CD54-8361-401B-842B-6B24387F07A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A170CD54-8361-401B-842B-6B24387F07A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A170CD54-8361-401B-842B-6B24387F07A5}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {163B8880-80D1-40DE-9082-BB270299C75B}
+ EndGlobalSection
+EndGlobal
diff --git a/Update/Update/MainForm.cs b/Update/Update/MainForm.cs
new file mode 100644
index 0000000..8e4efb1
--- /dev/null
+++ b/Update/Update/MainForm.cs
@@ -0,0 +1,231 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Update
+{
+ public partial class MainForm : Form
+ {
+ public string Title { get { return Text; } set { Text = value; } }
+ private Point mouseOffset; // 记录鼠标指针的坐标
+ private bool isMouseDown; // 记录鼠标左键是否按下
+
+ public MainForm()
+ {
+ InitializeComponent();
+
+ this.TopMost = true;
+ }
+
+ private void MessageForm_Paint(object sender, PaintEventArgs e)
+ {
+ SetFormRoundRectRgn(this, 7);
+ SetFormRoundRectRgn(panel2, 7);
+ SetFormRoundRectRgn(this.btnOk, 7);
+ }
+
+ private void btnOk_Click(object sender, EventArgs e)
+ {
+ if (lblMessage.Text == "升级完成,点击确定重启程序")
+ {
+ string mainPath = System.Environment.CurrentDirectory + "\\" + Program.softName + ".exe";
+ System.Diagnostics.Process.Start(mainPath);
+ Application.Exit();
+ return;
+ }
+
+ btnOk.Enabled = false;
+
+ CloseMainProgram();
+
+ if (!System.IO.Directory.Exists("upBak"))
+ System.IO.Directory.CreateDirectory("upBak");
+ var upBakPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "upBak";
+ if (!System.IO.Directory.Exists("upTemp"))
+ System.IO.Directory.CreateDirectory("upTemp");
+ var upTempPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "upTemp";
+
+
+ this.lblMessage.Text = "升级中请稍候...";
+ progressBar1.Visible = true;
+ progressBar1.Maximum = 1;//fileNameArr.Count();
+ progressBar1.Value = 0;
+ new TaskFactory().StartNew(() =>
+ {
+ bool result = Program.DownloadFile(Program.updateUrl, upTempPath + "\\" + Program.updateUrl.Substring(Program.updateUrl.LastIndexOf("/") + 1));
+
+ if (result)
+ {
+ Thread.Sleep(50);
+ Invoke(new Action(() =>
+ {
+ lblMessage.Text = "升级完成,点击确定重启程序";
+ btnOk.Enabled = true;
+ }));
+ }
+ else
+ {
+ Invoke(new Action(() =>
+ {
+ this.lblMessage.Text = "升级失败,未获取到升级文件";
+ btnOk.Enabled = true;
+ }));
+ }
+
+ //var fileNames = Program.updateUrl;
+ //var fileNameArr = fileNames.Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
+
+ //if (fileNameArr.Count() > 0)
+ //{
+ // foreach (var path in fileNameArr)
+ // {
+ // Thread.Sleep(new Random().Next(500, 1000));
+
+ // var localPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + path.Substring(path.LastIndexOf("/") + 1);
+ // var tempPath = upBakPath + "\\" + path.Substring(path.LastIndexOf("/") + 1);
+ // File.Copy(localPath, tempPath, true);
+
+ // if (!result)
+ // {
+ // Invoke(new Action(() =>
+ // {
+ // this.lblMessage.Text = "升级失败,请稍后点击确定重试";
+ // btnOk.Enabled = true;
+ // }));
+ // return;
+ // }
+ // else
+ // {
+ // Invoke(new Action(() =>
+ // {
+ // if (progressBar1.Value < progressBar1.Maximum)
+ // progressBar1.Value++;
+ // }));
+ // }
+
+ // }
+ //}
+ //else
+ //{
+ // this.lblMessage.Text = "升级失败,未获取到升级文件";
+ // btnOk.Enabled = true;
+ //}
+ });
+ }
+
+ ///
+ /// 拷贝文档目录
+ ///
+ ///
+ ///
+ public static void CopyDirectory(string srcPath, string destPath)
+ {
+ try
+ {
+ DirectoryInfo dir = new DirectoryInfo(srcPath);
+ FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //获取目录下(不包含子目录)的文件和子目录
+ foreach (FileSystemInfo i in fileinfo)
+ {
+ if (i is DirectoryInfo) //判断是否文件夹
+ {
+ if (!Directory.Exists(destPath + "\\" + i.Name))
+ {
+ Directory.CreateDirectory(destPath + "\\" + i.Name); //目标目录下不存在此文件夹即创建子文件夹
+ }
+ CopyDirectory(i.FullName, destPath + "\\" + i.Name); //递归调用复制子文件夹
+ }
+ else
+ {
+ File.Copy(i.FullName, destPath + "\\" + i.Name, true); //不是文件夹即复制文件,true表示可以覆盖同名文件
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw;
+ }
+ }
+
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void panel1_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ mouseOffset = new Point(-e.X, -e.Y);
+ isMouseDown = true;
+ }
+ }
+
+ private void panel1_MouseUp(object sender, MouseEventArgs e)
+ {
+ isMouseDown = false;
+ }
+
+ private void panel1_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (isMouseDown)
+ {
+ // 获取鼠标的位置
+ Point mousePos = MousePosition;
+ mousePos.Offset(mouseOffset.X, mouseOffset.Y);
+ Location = mousePos;
+ }
+ }
+
+ public static void SetFormRoundRectRgn(Control c, int rgnRadius)
+ {
+ int hRgn = 0;
+ hRgn = Win32.CreateRoundRectRgn(0, 0, c.Width + 1, c.Height + 1, rgnRadius, rgnRadius);
+ Win32.SetWindowRgn(c.Handle, hRgn, true);
+ Win32.DeleteObject(hRgn);
+ }
+
+ private void btnClose_Click(object sender, EventArgs e)
+ {
+ Application.Exit();
+ }
+
+ private void CloseMainProgram()
+ {
+ string in_sAppName = Program.softName; //(一个word文档程序)
+
+ try
+ {
+ System.Diagnostics.Process[] psiNewcas = System.Diagnostics.Process.GetProcessesByName(in_sAppName);
+
+ foreach (System.Diagnostics.Process p in psiNewcas)
+ {
+ p.Kill();
+ //p.WaitForExit();
+ //p.Close();
+ //Console.WriteLine(in_sAppName + "已经停止了");
+ }
+ }
+ catch
+ {
+ Console.WriteLine(in_sAppName + "停止失败");
+ }
+ }
+ }
+
+ public enum FormLevel
+ {
+ SMALL,
+ MEDIUM,
+ LARGE = 500
+ }
+
+
+}
diff --git a/Update/Update/MainForm.designer.cs b/Update/Update/MainForm.designer.cs
new file mode 100644
index 0000000..60a82e8
--- /dev/null
+++ b/Update/Update/MainForm.designer.cs
@@ -0,0 +1,166 @@
+
+namespace Update
+{
+ partial class MainForm
+ {
+ ///
+ /// 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(MainForm));
+ this.lblMessage = new System.Windows.Forms.Label();
+ this.btnOk = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.btnClose = new System.Windows.Forms.Button();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.progressBar1 = new System.Windows.Forms.ProgressBar();
+ this.panel1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lblMessage
+ //
+ this.lblMessage.Location = new System.Drawing.Point(14, 12);
+ this.lblMessage.Name = "lblMessage";
+ this.lblMessage.Size = new System.Drawing.Size(224, 69);
+ this.lblMessage.TabIndex = 0;
+ this.lblMessage.Text = "发现新版本,即将为您升级!";
+ this.lblMessage.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // btnOk
+ //
+ this.btnOk.BackColor = System.Drawing.Color.Blue;
+ this.btnOk.Cursor = System.Windows.Forms.Cursors.Hand;
+ this.btnOk.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255)))));
+ this.btnOk.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOk.Font = new System.Drawing.Font("微软雅黑", 11F);
+ this.btnOk.ForeColor = System.Drawing.Color.White;
+ this.btnOk.Location = new System.Drawing.Point(129, 137);
+ this.btnOk.Name = "btnOk";
+ this.btnOk.Size = new System.Drawing.Size(109, 30);
+ this.btnOk.TabIndex = 9;
+ this.btnOk.TabStop = false;
+ this.btnOk.Text = "确 定";
+ this.btnOk.UseVisualStyleBackColor = false;
+ this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Cursor = System.Windows.Forms.Cursors.Hand;
+ this.btnCancel.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255)))));
+ this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnCancel.Font = new System.Drawing.Font("微软雅黑", 11F);
+ this.btnCancel.ForeColor = System.Drawing.Color.Blue;
+ this.btnCancel.Location = new System.Drawing.Point(14, 137);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(109, 30);
+ this.btnCancel.TabIndex = 10;
+ this.btnCancel.TabStop = false;
+ this.btnCancel.Text = "取 消";
+ this.btnCancel.UseVisualStyleBackColor = false;
+ this.btnCancel.Visible = false;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.Blue;
+ this.panel1.Controls.Add(this.btnClose);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(256, 16);
+ this.panel1.TabIndex = 11;
+ this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);
+ this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);
+ this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp);
+ //
+ // btnClose
+ //
+ this.btnClose.Cursor = System.Windows.Forms.Cursors.Hand;
+ this.btnClose.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255)))));
+ this.btnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnClose.Font = new System.Drawing.Font("微软雅黑", 11F);
+ this.btnClose.ForeColor = System.Drawing.Color.White;
+ this.btnClose.Location = new System.Drawing.Point(240, -8);
+ this.btnClose.Name = "btnClose";
+ this.btnClose.Size = new System.Drawing.Size(17, 28);
+ this.btnClose.TabIndex = 11;
+ this.btnClose.TabStop = false;
+ this.btnClose.Text = "x";
+ this.btnClose.UseVisualStyleBackColor = false;
+ this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.Color.White;
+ this.panel2.Controls.Add(this.progressBar1);
+ this.panel2.Controls.Add(this.lblMessage);
+ this.panel2.Controls.Add(this.btnOk);
+ this.panel2.Controls.Add(this.btnCancel);
+ this.panel2.Location = new System.Drawing.Point(2, 16);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(252, 178);
+ this.panel2.TabIndex = 12;
+ //
+ // progressBar1
+ //
+ this.progressBar1.Location = new System.Drawing.Point(14, 95);
+ this.progressBar1.Name = "progressBar1";
+ this.progressBar1.Size = new System.Drawing.Size(224, 23);
+ this.progressBar1.TabIndex = 11;
+ this.progressBar1.Visible = false;
+ //
+ // MainForm
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(255)))));
+ this.ClientSize = new System.Drawing.Size(256, 196);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.panel2);
+ this.Font = new System.Drawing.Font("微软雅黑", 10F);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "MainForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "MessageForm";
+ this.Paint += new System.Windows.Forms.PaintEventHandler(this.MessageForm_Paint);
+ this.panel1.ResumeLayout(false);
+ this.panel2.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lblMessage;
+ private System.Windows.Forms.Button btnOk;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Button btnClose;
+ private System.Windows.Forms.ProgressBar progressBar1;
+ }
+}
\ No newline at end of file
diff --git a/Update/Update/MainForm.resx b/Update/Update/MainForm.resx
new file mode 100644
index 0000000..e836480
--- /dev/null
+++ b/Update/Update/MainForm.resx
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEIAAMQOAADEDgAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAecEhK3nBIZB5wSHYecEh+nnBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ IfR5wSHUecEhkHnBISwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEGecEhlHnBIf15wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH9ecEhmHnBIQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEGecEhu3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSG9ecEhBgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhlXnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIZUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAecEhLHnBIfx5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH8ecEhLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIY95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIZAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSHXecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh2HnBIVJ5wSENAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSENecEhUnnBIdh5wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh+XnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh13nBIRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEQecEh13nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIVIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIVJ5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSEOAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEMecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x05Ke8dO53vHTv97x07/e8dO/3vHTv97x07ke8dOSgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO5nvHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH
+ TuZ7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB7x05Je8dO5nvHTv97x07/e8dO/3vHTv97x07me8dOSQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB7x06Ae8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvHTv97x07/e8dO/3vHTv97x07/e8dO/3vH
+ Tv97x07/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTv97x07/e8dO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x07/e8dO/3vHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vH
+ Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHvHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH
+ Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/wAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vH
+ Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvHTot7x07de8dO3XvHTt17x07de8dO3XvHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTv97x07/e8dO3XvHTt17x07de8dO3XvHTt17x06MAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x04Ge8dOvXvHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x069e8dOBgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH
+ Tg17x07Ie8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vH
+ Tv97x07Ie8dODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAe8dOFXvHTtZ7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTv97x07We8dOFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x04ce8dO43vHTv97x07/e8dO/3vH
+ Tv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07je8dOHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH
+ TiZ7x07qe8dO/3vHTv97x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07qe8dOJgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAe8dONXvHTvB7x07/e8dO/3vHTv97x07/e8dO/3vHTv97x07we8dONgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x05Ce8dO+XvHTv97x07/e8dO/3vH
+ Tv97x075e8dOQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvH
+ Tk57x078e8dO/3vHTv97x078e8dOTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAe8dOYnvHTv57x07+e8dOYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7x053e8dOdwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSEOAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAB5wSEMecEh/3nBIf95wSH/ecEh/3nBIf95wSH/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEhUgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhUnnBIf95wSH/ecEh/3nBIf95wSH/ecEh/wAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBIfl5wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIdh5wSEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhEHnBIdh5wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIfkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAB5wSHXecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh2nnBIVJ5wSEOAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5wSEOecEhUnnB
+ Idp5wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSHXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAecEhj3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEhjwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHnBISt5wSH8ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/HnB
+ ISsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhlXnB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAHnBIQZ5wSG7ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIb15wSEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhBnnBIZR5wSH9ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/XnBIZh5wSEJAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAecEhKnnB
+ IY55wSHXecEh+HnBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nB
+ If95wSH/ecEh/3nBIf95wSH/ecEh/3nBIf95wSH/ecEh/3nBIfh5wSHWecEhjnnBISoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA/////////////////////////////////////////////////////////////////8AAAAAA
+ A///AAAAAAAA//4AAAAAAAB//gAAAAAAAH/8AAAAAAAAP/wAAAAAAAA//AD/////AD/8A//////AP/wH
+ /////+A//Af/////4D/8D//////wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//////
+ 8D/8D//////wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP
+ //AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//8A//8D/8D//wD//wP/wP//AP//A//A//8A//
+ 8D/8D/wAAD/wP/wP/AAAP/A//A/+AAB/8D/8D/8AAP/wP/wP/4AB//A//A//wAP/8D/8D//gB//wP/wP
+ //AP//A//A//+B//8D/8D//8P//wP/wP//5///A//Af/////4D/8B//////gP/wD/////8A//AD/////
+ AD/8AAAAAAAAP/wAAAAAAAA//gAAAAAAAH/+AAAAAAAAf/8AAAAAAAD//8AAAAAAA///////////////
+ //////////////////////////////////////////////////8=
+
+
+
\ No newline at end of file
diff --git a/Update/Update/Program.cs b/Update/Update/Program.cs
new file mode 100644
index 0000000..bc3fabc
--- /dev/null
+++ b/Update/Update/Program.cs
@@ -0,0 +1,207 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+
+namespace Update
+{
+ static class Program
+ {
+ public static string softName = "";
+ public static int oldVersion = 0;
+ public static int newVersion = 0;
+ public static string updateUrl = "";
+ public static List updateFileUrls = new List();
+
+ ///
+ /// 应用程序的主入口点。
+ ///
+ [STAThread]
+ static void Main()
+ {
+ if (File.Exists("UpdateConfig.ini"))
+ {
+ try
+ {
+ var text = File.ReadAllText("UpdateConfig.ini");
+ File.Delete("UpdateConfig.ini");
+
+ var arr = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
+ if (arr.Length > 3)
+ {
+ softName = arr[0];
+ oldVersion = Convert.ToInt32(arr[1]);
+ newVersion = Convert.ToInt32(arr[2]);
+ updateUrl = arr[3];
+
+ if (oldVersion == 0 || string.IsNullOrEmpty(softName) || string.IsNullOrEmpty(updateUrl))
+ return;
+
+ if (newVersion > oldVersion)
+ {
+ //Application.Current.Shutdown(); // 强制升级
+
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+ }
+ }
+ }
+ catch (Exception ex) { }
+ }
+ }
+
+ public static string HttpRequestPost(string url, string postData, string cookies = "", string codeType = "utf-8", string accept = "", string contentType = "")
+ {
+ HttpWebResponse response = null;
+ string result;
+ try
+ {
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
+ request.Method = "POST";
+ request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
+ if (!string.IsNullOrEmpty(accept))
+ request.Accept = accept;
+ request.ContentType = "application/x-www-form-urlencoded; charset=" + codeType;
+ if (!string.IsNullOrEmpty(contentType))
+ request.ContentType = contentType;
+
+ request.Referer = url;
+ request.AllowAutoRedirect = false;
+ if (!string.IsNullOrEmpty(cookies))
+ request.Headers.Set(HttpRequestHeader.Cookie, cookies);
+
+ byte[] byteData = Encoding.GetEncoding(codeType).GetBytes(postData);
+ request.ContentLength = byteData.Length;
+ using (Stream requestStream = request.GetRequestStream())
+ {
+ requestStream.Write(byteData, 0, byteData.Length);
+ }
+
+ response = (HttpWebResponse)request.GetResponse();
+ }
+ catch (WebException ex)
+ {
+ if (ex.Status == WebExceptionStatus.ProtocolError)
+ {
+ response = (HttpWebResponse)ex.Response;
+ result = ReadResponse(response);
+ if (response != null) response.Close();
+ return result;
+ }
+ else return ex.Message;
+ }
+ catch (Exception e)
+ {
+ if (response != null) response.Close();
+ return e.Message;
+ }
+ result = ReadResponse(response);
+ if (response != null) response.Close();
+ return result;
+ }
+
+ public static string ReadResponse(HttpWebResponse response)
+ {
+ using (Stream responseStream = response.GetResponseStream())
+ {
+ Stream streamToRead = responseStream;
+ if (response.ContentEncoding.ToLower().Contains("gzip"))
+ {
+ streamToRead = new GZipStream(streamToRead, CompressionMode.Decompress);
+ }
+ else if (response.ContentEncoding.ToLower().Contains("deflate"))
+ {
+ streamToRead = new DeflateStream(streamToRead, CompressionMode.Decompress);
+ }
+
+ using (StreamReader streamReader = new StreamReader(streamToRead, Encoding.UTF8))
+ {
+ return streamReader.ReadToEnd();
+ }
+ }
+ }
+
+ ///
+ /// 获取json中的int值
+ ///
+ ///
+ ///
+ ///
+ public static int GetIntJson(ref string html, string reg)
+ {
+ string temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*['""]([^']+?)['""]");
+ if (string.IsNullOrEmpty(temp))
+ temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*([\d-]+)");
+ int i;
+ if (int.TryParse(temp, out i))
+ return i;
+ return 0;
+ }
+
+ ///
+ /// 获取字符串
+ ///
+ ///
+ ///
+ ///
+ public static string GetStringJson(ref string html, string reg)
+ {
+ string temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*['""]([^']+?)['""]");
+ if (string.IsNullOrEmpty(temp))
+ temp = GetMatchRegexString(html, @"['""]" + reg + @"['""][\s]*:[\s]*([\d]+)");
+ if (!string.IsNullOrEmpty(temp) && temp.Contains("\""))
+ temp = temp.Substring(0, temp.IndexOf("\""));
+ if (!string.IsNullOrEmpty(temp) && temp.Contains("'"))
+ temp = temp.Substring(0, temp.IndexOf("'"));
+ return temp;
+ }
+
+ ///
+ /// 返回单个正则匹配项
+ ///
+ ///
+ ///
+ ///
+ public static string GetMatchRegexString(string sourceString, string RegexString)
+ {
+ if (!string.IsNullOrEmpty(sourceString))
+ {
+ MatchCollection mc = Regex.Matches(sourceString, RegexString, RegexOptions.IgnoreCase);
+ if (mc.Count > 0)
+ {
+ return mc[0].Groups[1].Value.ToString();
+ }
+ }
+ return null;
+ }
+
+ ///
+ /// 下载文件
+ ///
+ /// 下载地址
+ /// 保存目录
+ ///
+ public static bool DownloadFile(string Urlstring, string FilePath)
+ {
+ try
+ {
+ WebClientUtils webClient = new WebClientUtils();
+ webClient.Timeout = 300;
+ if (File.Exists(FilePath))
+ File.Delete(FilePath);
+ webClient.DownloadFile(Urlstring, FilePath);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ return false;
+ }
+ }
+ }
+}
diff --git a/Update/Update/Properties/AssemblyInfo.cs b/Update/Update/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..2866b10
--- /dev/null
+++ b/Update/Update/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Update")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Update")]
+[assembly: AssemblyCopyright("Copyright © 2021")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("a170cd54-8361-401b-842b-6b24387f07a5")]
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Update/Update/Properties/Resources.Designer.cs b/Update/Update/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..95ddb3e
--- /dev/null
+++ b/Update/Update/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Update.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.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() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [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("Update.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [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/Update/Update/Properties/Resources.resx b/Update/Update/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/Update/Update/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/Update/Update/Properties/Settings.Designer.cs b/Update/Update/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..74146ed
--- /dev/null
+++ b/Update/Update/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Update.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.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/Update/Update/Properties/Settings.settings b/Update/Update/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/Update/Update/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Update/Update/Update.csproj b/Update/Update/Update.csproj
new file mode 100644
index 0000000..4e7ecde
--- /dev/null
+++ b/Update/Update/Update.csproj
@@ -0,0 +1,98 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {A170CD54-8361-401B-842B-6B24387F07A5}
+ WinExe
+ Update
+ Update
+ v4.5.2
+ 512
+ true
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ ..\..\bin\
+ DEBUG;TRACE
+ prompt
+ 4
+ Off
+ false
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ false
+
+
+ update.ico
+
+
+
+ ..\packages\Tencent.QCloud.Cos.Sdk.5.4.48\lib\net45\COSXML.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ MainForm.cs
+
+
+
+
+ Component
+
+
+
+ MainForm.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Update/Update/WebClientUtils.cs b/Update/Update/WebClientUtils.cs
new file mode 100644
index 0000000..267f420
--- /dev/null
+++ b/Update/Update/WebClientUtils.cs
@@ -0,0 +1,144 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Cache;
+using System.Net.Security;
+using System.Security.Cryptography.X509Certificates;
+using System.Text;
+
+namespace Update
+{
+ public class WebClientUtils : WebClient
+ {///
+ /// 默认超时多少秒
+ ///
+ public int Timeout = 100;
+ ///
+ /// 允许自动重定向
+ ///
+ public bool AllowAutoRedirect = true;
+ public bool IsDelete = false;
+
+ private string OutIP = "";
+ ///
+ /// 证书列表
+ ///
+ public static List X509List = new List();
+ ///
+ /// 绑定IP
+ ///
+ ///
+ public WebClientUtils(string outIp)
+ {
+ OutIP = outIp;
+ CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
+ }
+
+ public WebClientUtils()
+ {
+ }
+ ///
+ /// 重写
+ ///
+ ///
+ ///
+ protected override WebRequest GetWebRequest(Uri address)
+ {
+ string s = address.ToString();
+ if (string.IsNullOrEmpty(s) || s.Length < 7 || !(s.Substring(0, 7).ToLower() == "http://" || s.Substring(0, 8).ToLower() == "https://"))
+ return null;
+ var request = (HttpWebRequest)base.GetWebRequest(address);
+ request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
+ request.Timeout = 1000 * Timeout;
+ request.ReadWriteTimeout = 500 * Timeout;
+ request.AllowAutoRedirect = AllowAutoRedirect;
+ ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
+ if (IsDelete)
+ request.Method = "DELETE";
+ if (!string.IsNullOrEmpty(OutIP))
+ {
+ request.ServicePoint.BindIPEndPointDelegate = (servicePoint, remoteEndPoint, retryCount) =>
+ {
+ servicePoint.MaxIdleTime = 20;
+ return new IPEndPoint(IPAddress.Parse(OutIP), 0);
+ };
+ }
+ if (request.RequestUri.Scheme == "https") //挂接验证服务端证书的回调
+ {
+ X509Certificate2 x509c = null;
+ for (int i = 0; i < X509List.Count; i++)
+ {
+ if (X509List[i].Domain.ToLower() == address.Host.ToLower())
+ {
+ x509c = X509List[i].X509;
+ break;
+ }
+ }
+ if (x509c == null)
+ {
+ ServicePointManager.ServerCertificateValidationCallback =
+ new RemoteCertificateValidationCallback(RemoteCertificateValidationCallback);
+ try
+ {
+ X509Store _store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
+ _store.Open(OpenFlags.ReadWrite);
+ string findValue = Dns.GetHostName(); //获取本地主机名称作为证书查找的参数
+ X509Certificate2Collection _certsCollection =
+ _store.Certificates.Find(X509FindType.FindByIssuerName, findValue, false);
+ if (_certsCollection.Count > 0)
+ {
+ x509c = _certsCollection[0];
+ request.ClientCertificates.Add(x509c);
+ }
+ }
+ catch { }
+
+ }
+ }
+ return request;
+ }
+
+ ///
+ /// 获取证书
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public bool RemoteCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
+ {
+ return true;
+ }
+
+ public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
+ {
+ //if (sslPolicyErrors == SslPolicyErrors.None) {
+ // return true;
+ //}
+
+ //Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
+
+ //// Do not allow this client to communicate with unauthenticated servers.
+ //return false;
+
+ return true;
+ }
+ }
+
+ ///
+ /// 网站证书
+ ///
+ public class Certificate
+ {
+ ///
+ /// 域名
+ ///
+ public string Domain { get; set; }
+ ///
+ /// 证书
+ ///
+ public X509Certificate2 X509 { get; set; }
+ }
+}
diff --git a/Update/Update/Win32.cs b/Update/Update/Win32.cs
new file mode 100644
index 0000000..c5668e6
--- /dev/null
+++ b/Update/Update/Win32.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Update
+{
+ public class Win32
+ {
+ #region Window Const
+
+ public const int WM_ERASEBKGND = 0x0014;
+ public const int WM_LBUTTONDOWN = 0x0201;
+ public const int WM_LBUTTONUP = 0x0202;
+ public const int WM_LBUTTONDBLCLK = 0x0203;
+ public const int WM_WINDOWPOSCHANGING = 0x46;
+ public const int WM_PAINT = 0xF;
+ public const int WM_CREATE = 0x0001;
+ public const int WM_ACTIVATE = 0x0006;
+ public const int WM_NCCREATE = 0x0081;
+ public const int WM_NCCALCSIZE = 0x0083;
+ public const int WM_NCPAINT = 0x0085;
+ public const int WM_NCACTIVATE = 0x0086;
+ public const int WM_NCLBUTTONDOWN = 0x00A1;
+ public const int WM_NCLBUTTONUP = 0x00A2;
+ public const int WM_NCLBUTTONDBLCLK = 0x00A3;
+ public const int WM_NCMOUSEMOVE = 0x00A0;
+
+ public const int WM_NCHITTEST = 0x0084;
+
+ public const int HTLEFT = 10;
+ public const int HTRIGHT = 11;
+ public const int HTTOP = 12;
+ public const int HTTOPLEFT = 13;
+ public const int HTTOPRIGHT = 14;
+ public const int HTBOTTOM = 15;
+ public const int HTBOTTOMLEFT = 0x10;
+ public const int HTBOTTOMRIGHT = 17;
+ public const int HTCAPTION = 2;
+ public const int HTCLIENT = 1;
+
+ public const int WM_FALSE = 0;
+ public const int WM_TRUE = 1;
+
+
+
+ #endregion
+
+ #region Public extern methods
+
+ [DllImport("gdi32.dll")]
+ public static extern int CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3);
+
+ [DllImport("user32.dll")]
+ public static extern int SetWindowRgn(IntPtr hwnd, int hRgn, Boolean bRedraw);
+
+ [DllImport("gdi32.dll", EntryPoint = "DeleteObject", CharSet = CharSet.Ansi)]
+ public static extern int DeleteObject(int hObject);
+
+ [DllImport("user32.dll")]
+ public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
+
+ [DllImport("user32.dll")]
+ public static extern bool ReleaseCapture();
+
+ #endregion
+ }
+}
diff --git a/Update/Update/app.config b/Update/Update/app.config
new file mode 100644
index 0000000..ff99501
--- /dev/null
+++ b/Update/Update/app.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Update/Update/packages.config b/Update/Update/packages.config
new file mode 100644
index 0000000..54163b8
--- /dev/null
+++ b/Update/Update/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Update/Update/update.ico b/Update/Update/update.ico
new file mode 100644
index 0000000..54e8eb1
Binary files /dev/null and b/Update/Update/update.ico differ