Browse Source

添加AOI文件解析功能

callm 3 years ago
parent
commit
7485e3a3cb

+ 355 - 0
FileWatcher/AutoAnalysisXml.Designer.cs

@@ -0,0 +1,355 @@
+namespace FileWatcher
+{
+    partial class AutoAnalysisXml
+    {
+        /// <summary>
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows 窗体设计器生成的代码
+
+        /// <summary>
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.XmlWatcher = new System.IO.FileSystemWatcher();
+            this.XmlFolder = new System.Windows.Forms.FolderBrowserDialog();
+            this.StartWatch = new System.Windows.Forms.Button();
+            this.StopWatch = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.FolderPath = new System.Windows.Forms.TextBox();
+            this.ChooseFolder = new System.Windows.Forms.Button();
+            this.OperateResult = new System.Windows.Forms.RichTextBox();
+            this.Clean = new System.Windows.Forms.Button();
+            this.ChooseBackUpFolder = new System.Windows.Forms.Button();
+            this.BackUpFolderPath = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.MakeCode_lable = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.Master = new System.Windows.Forms.ComboBox();
+            this.AutoStart = new System.Windows.Forms.CheckBox();
+            this.ma_code = new System.Windows.Forms.TextBox();
+            this.BatchAnalysus = new System.Windows.Forms.Button();
+            this.Timer = new System.Windows.Forms.Timer(this.components);
+            this.Device = new System.Windows.Forms.ComboBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.button1 = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
+            ((System.ComponentModel.ISupportInitialize)(this.XmlWatcher)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // XmlWatcher
+            // 
+            this.XmlWatcher.EnableRaisingEvents = true;
+            this.XmlWatcher.Filter = "*.xml";
+            this.XmlWatcher.SynchronizingObject = this;
+            // 
+            // StartWatch
+            // 
+            this.StartWatch.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.StartWatch.Location = new System.Drawing.Point(290, 512);
+            this.StartWatch.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.StartWatch.Name = "StartWatch";
+            this.StartWatch.Size = new System.Drawing.Size(128, 56);
+            this.StartWatch.TabIndex = 0;
+            this.StartWatch.Text = "开始监控";
+            this.StartWatch.UseVisualStyleBackColor = true;
+            this.StartWatch.Click += new System.EventHandler(this.StartWatch_Click);
+            // 
+            // StopWatch
+            // 
+            this.StopWatch.Enabled = false;
+            this.StopWatch.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.StopWatch.Location = new System.Drawing.Point(498, 512);
+            this.StopWatch.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.StopWatch.Name = "StopWatch";
+            this.StopWatch.Size = new System.Drawing.Size(128, 56);
+            this.StopWatch.TabIndex = 1;
+            this.StopWatch.Text = "停止监控";
+            this.StopWatch.UseVisualStyleBackColor = true;
+            this.StopWatch.Click += new System.EventHandler(this.StopWatch_Click);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("微软雅黑", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label1.Location = new System.Drawing.Point(54, 316);
+            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(162, 38);
+            this.label1.TabIndex = 2;
+            this.label1.Text = "监控文件夹";
+            // 
+            // FolderPath
+            // 
+            this.FolderPath.Enabled = false;
+            this.FolderPath.Location = new System.Drawing.Point(224, 316);
+            this.FolderPath.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.FolderPath.Name = "FolderPath";
+            this.FolderPath.Size = new System.Drawing.Size(436, 35);
+            this.FolderPath.TabIndex = 3;
+            // 
+            // ChooseFolder
+            // 
+            this.ChooseFolder.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.ChooseFolder.Location = new System.Drawing.Point(692, 316);
+            this.ChooseFolder.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.ChooseFolder.Name = "ChooseFolder";
+            this.ChooseFolder.Size = new System.Drawing.Size(156, 48);
+            this.ChooseFolder.TabIndex = 6;
+            this.ChooseFolder.Text = "选择文件夹";
+            this.ChooseFolder.UseVisualStyleBackColor = true;
+            this.ChooseFolder.Click += new System.EventHandler(this.ChooseFolder_Click);
+            // 
+            // OperateResult
+            // 
+            this.OperateResult.Location = new System.Drawing.Point(892, 22);
+            this.OperateResult.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.OperateResult.Name = "OperateResult";
+            this.OperateResult.Size = new System.Drawing.Size(749, 535);
+            this.OperateResult.TabIndex = 7;
+            this.OperateResult.Text = "";
+            // 
+            // Clean
+            // 
+            this.Clean.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.Clean.Location = new System.Drawing.Point(1229, 579);
+            this.Clean.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.Clean.Name = "Clean";
+            this.Clean.Size = new System.Drawing.Size(112, 48);
+            this.Clean.TabIndex = 8;
+            this.Clean.Text = "清除";
+            this.Clean.UseVisualStyleBackColor = true;
+            this.Clean.Click += new System.EventHandler(this.Clean_Click);
+            // 
+            // ChooseBackUpFolder
+            // 
+            this.ChooseBackUpFolder.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.ChooseBackUpFolder.Location = new System.Drawing.Point(692, 402);
+            this.ChooseBackUpFolder.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.ChooseBackUpFolder.Name = "ChooseBackUpFolder";
+            this.ChooseBackUpFolder.Size = new System.Drawing.Size(156, 48);
+            this.ChooseBackUpFolder.TabIndex = 11;
+            this.ChooseBackUpFolder.Text = "选择文件夹";
+            this.ChooseBackUpFolder.UseVisualStyleBackColor = true;
+            this.ChooseBackUpFolder.Click += new System.EventHandler(this.ChooseBackUpFolder_Click);
+            // 
+            // BackUpFolderPath
+            // 
+            this.BackUpFolderPath.Enabled = false;
+            this.BackUpFolderPath.Location = new System.Drawing.Point(224, 402);
+            this.BackUpFolderPath.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.BackUpFolderPath.Name = "BackUpFolderPath";
+            this.BackUpFolderPath.Size = new System.Drawing.Size(436, 35);
+            this.BackUpFolderPath.TabIndex = 10;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("微软雅黑", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label2.Location = new System.Drawing.Point(54, 402);
+            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(162, 38);
+            this.label2.TabIndex = 9;
+            this.label2.Text = "备份文件夹";
+            // 
+            // MakeCode_lable
+            // 
+            this.MakeCode_lable.AutoSize = true;
+            this.MakeCode_lable.Font = new System.Drawing.Font("微软雅黑", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.MakeCode_lable.Location = new System.Drawing.Point(54, 227);
+            this.MakeCode_lable.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.MakeCode_lable.Name = "MakeCode_lable";
+            this.MakeCode_lable.Size = new System.Drawing.Size(104, 38);
+            this.MakeCode_lable.TabIndex = 12;
+            this.MakeCode_lable.Text = "工单号";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("微软雅黑", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label4.Location = new System.Drawing.Point(54, 46);
+            this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(133, 38);
+            this.label4.TabIndex = 14;
+            this.label4.Text = "账套选择";
+            // 
+            // Master
+            // 
+            this.Master.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.Master.FormattingEnabled = true;
+            this.Master.Location = new System.Drawing.Point(224, 46);
+            this.Master.Margin = new System.Windows.Forms.Padding(6);
+            this.Master.Name = "Master";
+            this.Master.Size = new System.Drawing.Size(436, 32);
+            this.Master.TabIndex = 15;
+            // 
+            // AutoStart
+            // 
+            this.AutoStart.AutoSize = true;
+            this.AutoStart.Location = new System.Drawing.Point(686, 51);
+            this.AutoStart.Margin = new System.Windows.Forms.Padding(6);
+            this.AutoStart.Name = "AutoStart";
+            this.AutoStart.Size = new System.Drawing.Size(186, 28);
+            this.AutoStart.TabIndex = 16;
+            this.AutoStart.Text = "开机自动启动";
+            this.AutoStart.UseVisualStyleBackColor = true;
+            this.AutoStart.CheckedChanged += new System.EventHandler(this.AutoStart_CheckedChanged);
+            // 
+            // ma_code
+            // 
+            this.ma_code.Location = new System.Drawing.Point(224, 227);
+            this.ma_code.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.ma_code.Name = "ma_code";
+            this.ma_code.Size = new System.Drawing.Size(436, 35);
+            this.ma_code.TabIndex = 17;
+            // 
+            // BatchAnalysus
+            // 
+            this.BatchAnalysus.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.BatchAnalysus.Location = new System.Drawing.Point(692, 224);
+            this.BatchAnalysus.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.BatchAnalysus.Name = "BatchAnalysus";
+            this.BatchAnalysus.Size = new System.Drawing.Size(156, 48);
+            this.BatchAnalysus.TabIndex = 18;
+            this.BatchAnalysus.Text = "批量解析";
+            this.BatchAnalysus.UseVisualStyleBackColor = true;
+            this.BatchAnalysus.Click += new System.EventHandler(this.BatchAnalysus_Click);
+            // 
+            // Timer
+            // 
+            this.Timer.Interval = 10000;
+            this.Timer.Tick += new System.EventHandler(this.Timer_Tick);
+            // 
+            // Device
+            // 
+            this.Device.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.Device.FormattingEnabled = true;
+            this.Device.Items.AddRange(new object[] {
+            "AOI设备",
+            "选焊设备"});
+            this.Device.Location = new System.Drawing.Point(224, 138);
+            this.Device.Margin = new System.Windows.Forms.Padding(6);
+            this.Device.Name = "Device";
+            this.Device.Size = new System.Drawing.Size(436, 32);
+            this.Device.TabIndex = 20;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("微软雅黑", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label3.Location = new System.Drawing.Point(54, 138);
+            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(133, 38);
+            this.label3.TabIndex = 19;
+            this.label3.Text = "设备选择";
+            // 
+            // button1
+            // 
+            this.button1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.button1.Location = new System.Drawing.Point(692, 479);
+            this.button1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(128, 56);
+            this.button1.TabIndex = 21;
+            this.button1.Text = "OK音频";
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Click += new System.EventHandler(this.button1_Click);
+            // 
+            // button2
+            // 
+            this.button2.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.button2.Location = new System.Drawing.Point(692, 556);
+            this.button2.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(128, 56);
+            this.button2.TabIndex = 22;
+            this.button2.Text = "NG音频";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.button2_Click);
+            // 
+            // AutoAnalysisXml
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 24F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1654, 640);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.Device);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.BatchAnalysus);
+            this.Controls.Add(this.ma_code);
+            this.Controls.Add(this.AutoStart);
+            this.Controls.Add(this.Master);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.MakeCode_lable);
+            this.Controls.Add(this.ChooseBackUpFolder);
+            this.Controls.Add(this.BackUpFolderPath);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.Clean);
+            this.Controls.Add(this.OperateResult);
+            this.Controls.Add(this.ChooseFolder);
+            this.Controls.Add(this.FolderPath);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.StopWatch);
+            this.Controls.Add(this.StartWatch);
+            this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.MaximizeBox = false;
+            this.Name = "AutoAnalysisXml";
+            this.Text = "UAS自动过站解析器";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
+            this.Load += new System.EventHandler(this.Form1_Load);
+            ((System.ComponentModel.ISupportInitialize)(this.XmlWatcher)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.IO.FileSystemWatcher XmlWatcher;
+        private System.Windows.Forms.FolderBrowserDialog XmlFolder;
+        private System.Windows.Forms.Button StopWatch;
+        private System.Windows.Forms.Button StartWatch;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.TextBox FolderPath;
+        private System.Windows.Forms.Button ChooseFolder;
+        private System.Windows.Forms.RichTextBox OperateResult;
+        private System.Windows.Forms.Button Clean;
+        private System.Windows.Forms.Button ChooseBackUpFolder;
+        private System.Windows.Forms.TextBox BackUpFolderPath;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label MakeCode_lable;
+        private System.Windows.Forms.ComboBox Master;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.CheckBox AutoStart;
+        private System.Windows.Forms.TextBox ma_code;
+        private System.Windows.Forms.Button BatchAnalysus;
+        private System.Windows.Forms.Timer Timer;
+        private System.Windows.Forms.ComboBox Device;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Button button2;
+        private System.Windows.Forms.Button button1;
+    }
+}
+

+ 815 - 0
FileWatcher/AutoAnalysisXml.cs

@@ -0,0 +1,815 @@
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.IO;
+using System.Threading;
+using System.Windows.Forms;
+using System.Xml;
+using System.Text;
+using System.Media;
+
+namespace FileWatcher
+{
+    public partial class AutoAnalysisXml : Form
+    {
+
+        DataHelper dh;
+
+        DataTable dt;
+
+        DataTable DB;
+
+        /// <summary>
+        /// 用户编号
+        /// </summary>
+        string iusercode;
+        /// <summary>
+        /// 岗位资源
+        /// </summary>
+        string isource;
+
+        Tip tipform;
+
+        Thread InitDB;
+        /// <summary>
+        /// 线别
+        /// </summary>
+        string ilinecode;
+        /// <summary>
+        /// 不良代码组
+        /// </summary>
+        string ibadgroup;
+        /// <summary>
+        /// 当前工序
+        /// </summary>
+        string istepcode;
+        StringBuilder sql = new StringBuilder();
+        /// <summary>
+        /// 缓存的文件
+        /// </summary>
+        public static string CachePath = Environment.GetEnvironmentVariable("windir").Substring(0, 1) + @":/UAS_MES/XmlAnalysor/Cache.xml";
+        /// <summary>
+        /// 缓存的文件夹
+        /// </summary>
+        public static string CachePathFolder = Environment.GetEnvironmentVariable("windir").Substring(0, 1) + @":/UAS_MES/XmlAnalysor/";
+        /// <summary>
+        /// 需要解析的文件名
+        /// </summary>
+        List<string> _FileName = new List<string>();
+
+        public AutoAnalysisXml()
+        {
+            tipform = new Tip();
+            InitializeComponent();
+            StartPosition = FormStartPosition.CenterScreen;
+        }
+
+        public AutoAnalysisXml(string iUserName, string iSource)
+        {
+            tipform = new Tip();
+            InitializeComponent();
+            iusercode = iUserName;
+            isource = iSource.ToUpper();
+            StartPosition = FormStartPosition.CenterScreen;
+        }
+
+        private void Form1_Load(object sender, EventArgs e)
+        {
+            tipform.Show();
+            CheckForIllegalCrossThreadCalls = false;
+            FormBorderStyle = FormBorderStyle.FixedSingle;
+            InitDB = new Thread(ConnectDB);
+            //添加监控事件
+            XmlWatcher.Created += new FileSystemEventHandler(XmlWatcher_Created);
+            SetLoadingWindow stw = new SetLoadingWindow(InitDB, "正在启动程序");
+            stw.StartPosition = FormStartPosition.CenterScreen;
+            stw.ShowDialog();
+            List<string> CacheInf = new List<string>();
+            DB = (DataTable)dh.ExecuteSql("select ms_pwd,ma_user,ma_address,ma_inneraddress from master where ma_user='MES'", "select");
+            Master.DataSource = DB;
+            Master.DisplayMember = "ma_user";
+            Master.ValueMember = "ma_user";
+            //获取缓存信息
+            try
+            {
+                FolderPath.Text = BaseUtil.GetCacheData("FolderPath").ToString();
+                BackUpFolderPath.Text = BaseUtil.GetCacheData("BackUpFolderPath").ToString();
+                Master.Text = BaseUtil.GetCacheData("Master").ToString();
+                //AutoStart.Checked = (bool)BaseUtil.GetCacheData("AutoStart");
+            }
+            catch (Exception ex) { MessageBox.Show(ex.Message); }
+            for (int i = 0; i < DB.Rows.Count; i++)
+            {
+                if (Master.Text == DB.Rows[i]["ma_user"].ToString())
+                {
+                    DataHelper.DBConnectionString = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=" + DB.Rows[i]["ma_user"].ToString() + ";Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.10)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
+                    dh = new DataHelper();
+                }
+            }
+            //获取岗位资源相关信息
+            DataTable dt = (DataTable)dh.ExecuteSql("select sc_linecode,sc_stepcode,st_badgroupcode from source left join step on sc_stepcode=st_code where sc_code='" + isource + "'", "select");
+            if (dt.Rows.Count > 0)
+            {
+                ilinecode = dt.Rows[0]["sc_linecode"].ToString();
+                istepcode = dt.Rows[0]["sc_stepcode"].ToString();
+                ibadgroup = dt.Rows[0]["st_badgroupcode"].ToString();
+            }
+        }
+
+        private void ConnectDB()
+        {
+            dh = new DataHelper();
+        }
+
+        private void StartWatch_Click(object sender, EventArgs e)
+        {
+            if (FolderPath.Text == "" || BackUpFolderPath.Text == "")
+            {
+                OperateResult.AppendText("请选择监控文件夹和备份文件夹\n");
+                return;
+            }
+            else
+            {
+                if (!Directory.Exists(FolderPath.Text))
+                {
+                    OperateResult.AppendText("监控文件夹不存在\n");
+                    return;
+                }
+                if (!Directory.Exists(BackUpFolderPath.Text))
+                {
+                    OperateResult.AppendText("备份文件夹不存在\n");
+                    return;
+                }
+            }
+            if (FolderPath.Text == BackUpFolderPath.Text)
+            {
+                OperateResult.AppendText("监控文件夹和备份文件夹不能相同\n");
+                return;
+            }
+            for (int i = 0; i < DB.Rows.Count; i++)
+            {
+                if (Master.Text == DB.Rows[i]["ma_user"].ToString())
+                {
+                    DataHelper.DBConnectionString = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=" + DB.Rows[i]["ma_user"].ToString() + ";Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.10)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
+                    dh = new DataHelper();
+                    LogicHandler.dh = new DataHelper();
+                }
+            }
+            //存在工单必须是已下放状态
+            if (!dh.CheckExist("make", "ma_statuscode='STARTED' and ma_code='" + ma_code.Text + "'") && ma_code.Text != "" && Device.Text == "AOI设备")
+            {
+                OperateResult.AppendText("工单不存在或者未下放\n");
+                return;
+            }
+            if (!dh.CheckExist("make", "ma_code='" + ma_code.Text + "'") && ma_code.Text != "" && Device.Text == "选焊设备")
+            {
+                OperateResult.AppendText("工单不存\n");
+                return;
+            }
+            XmlWatcher.Path = FolderPath.Text;
+            XmlWatcher.Filter = "*.txt";
+            XmlWatcher.EnableRaisingEvents = true;
+            //设置缓存数据
+            BaseUtil.SetCacheData("FolderPath", FolderPath.Text);
+            BaseUtil.SetCacheData("BackUpFolderPath", BackUpFolderPath.Text);
+            BaseUtil.SetCacheData("Master", Master.Text);
+            BaseUtil.SetCacheData("AutoStart", AutoStart.Checked);
+            //设置按钮不可点击
+            StartWatch.Enabled = false;
+            ChooseFolder.Enabled = false;
+            Master.Enabled = false;
+            ma_code.Enabled = false;
+            ChooseBackUpFolder.Enabled = false;
+            StopWatch.Enabled = true;
+            OperateResult.AppendText("开始执行监控\n");
+        }
+
+        public void CreateNode(XmlDocument xmlDoc, XmlNode parentNode, string name, string value)
+        {
+            XmlNode node = xmlDoc.CreateNode(XmlNodeType.Element, name, null);
+            node.InnerText = value;
+            parentNode.AppendChild(node);
+        }
+
+        private void XmlWatcher_Created(object sender, FileSystemEventArgs e)
+        {
+            while (true)
+            {
+                try
+                {
+                    using (Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read))
+                    {
+                        if (stream != null)
+                            break;
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message);
+                }
+            }
+            switch (e.Name.Substring(e.Name.LastIndexOf(".") + 1).ToUpper())
+            {
+                case "TXT":
+                    TxtHandleProcess(e.FullPath);
+                    break;
+                case "XML":
+                    XmlHandleProcess(e.FullPath);
+                    break;
+                default:
+                    break;
+            }
+        }
+        string nextLine;
+        private void TxtHandleProcess(string FileName)
+        {
+            List<string> badcode = new List<string>();
+            List<string> badlocation = new List<string>();
+            List<string> badprod = new List<string>();
+            if (Device.Text == "AOI设备")
+            {
+                StreamReader sR = File.OpenText(FileName);
+
+                string[] data1 = null;
+                while ((nextLine = sR.ReadLine()) != null)
+                {
+                    data1 = nextLine.Split(';');
+                }
+                string SoftVersion = data1[0];
+                List<string[]> dic = new List<string[]>();
+                List<string> sndata = new List<string>();
+                for (int i = 0; i < data1.Length; i++)
+                {
+                    //如果软件版本相同的时候,则表示一个新的SN
+                    if ((SoftVersion == data1[i] && i != 0) || i == data1.Length - 1)
+                    {
+                        dic.Add(sndata.ToArray());
+                        sndata.Clear();
+                    }
+                    sndata.Add(data1[i]);
+                }
+                foreach (string[] content in dic)
+                {
+                    string SN = "";
+                    string Machine = "";
+                    string EmName = "";
+                    string Day = "";
+                    string Time = "";
+                    string Result = "";
+                    string TotalPart = "";
+                    string NGPart = "";
+                    int MissTest = 0;
+                    string[] data = content;
+                    for (int i = 0; i < data.Length; i++)
+                    {
+                        switch (i.ToString())
+                        {
+                            case "0":
+                                SoftVersion = data[i];
+                                break;
+                            case "1":
+                                SN = data[i];
+                                break;
+                            case "2":
+                                Machine = data[i];
+                                break;
+                            case "4":
+                                EmName = data[i];
+                                break;
+                            case "6":
+                                Day = data[i];
+                                break;
+                            case "7":
+                                Time = data[i];
+                                break;
+                            case "8":
+                                Result += data[i];
+                                break;
+                            case "9":
+                                Result += data[i];
+                                break;
+                            case "10":
+                                Result += data[i];
+                                break;
+                            case "11":
+                                Result += data[i];
+                                break;
+                            case "13":
+                                TotalPart = data[i];
+                                break;
+                            case "14":
+                                NGPart = data[i];
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                    if (SN == "")
+                    {
+                        tipform.startthread("序列号不能为空", "NG");
+                        continue;
+                    }
+                    if (data.Length > 15)
+                    {
+                        for (int i = 15; i < data.Length; i++)
+                        {
+                            switch ((i - 15) % 6)
+                            {
+                                case 0:
+                                    if (badlocation.Count >= 1)
+                                    {
+                                        continue;
+                                    }
+                                    badlocation.Add(data[i]);
+                                    break;
+                                case 1:
+                                    if (badprod.Count >= 1)
+                                    {
+                                        continue;
+                                    }
+                                    badprod.Add(data[i]);
+                                    break;
+                                case 2:
+                                    if (badcode.Count >= 1)
+                                    {
+                                        continue;
+                                    }
+                                    badcode.Add(data[i].ToUpper());
+                                    break;
+                                default:
+                                    break;
+                            }
+                        }
+                    }
+                    sR.Close();
+                    //如果没有不良位号等数据则是15个数据
+                    if (Result == "0001")
+                    {
+                        if (data.Length > 16)
+                        {
+                            MissTest = -1;
+                            Result = "NG";
+                        }
+                        else
+                        {
+                            Result = "OK";
+                        }
+                    }
+                    else
+                    {
+                        Result = "OK";
+                    }
+                    string makecode = "";
+                    string stepcode = "";
+                    string oErrMessage = "";
+                    string oMSID = "";
+                    if (LogicHandler.CheckStepSNAndMacode(ma_code.Text, isource, SN, iusercode, out makecode, out oMSID, out oErrMessage))
+                    {
+                        //获取序列号ID最大的工单
+                        dt = (DataTable)dh.ExecuteSql("select ms_makecode,ms_id,ms_stepcode from makeserial where ms_sncode='" + SN + "' order by ms_id desc", "select");
+                        if (dt.Rows.Count > 0)
+                        {
+                            ma_code.Text = dt.Rows[0]["ms_makecode"].ToString();
+                            makecode = dt.Rows[0]["ms_makecode"].ToString();
+                            stepcode = dt.Rows[0]["ms_stepcode"].ToString();
+                            if (stepcode == istepcode)
+                            {
+                                tipform.startthread("序列号 " + SN + "已执行过" + istepcode, "NG");
+                                OperateResult.AppendText("序列号 " + SN + "已执行过" + istepcode + "\n");
+                                continue;
+                            }
+                            SoundPlayer player = new SoundPlayer();
+                            switch (Result)
+                            {
+                                case "OK":
+                                    if (!LogicHandler.SetStepResult(makecode, isource, SN, "自动过站采集", Result, iusercode, out oErrMessage))
+                                    {
+                                        OperateResult.AppendText(oErrMessage + "\n");
+                                        tipform.startthread(oErrMessage, Result);
+                                        continue;
+                                    }
+                                    tipform.startthread("序列号 " + SN + "通过检测", Result);
+                                    player.SoundLocation = Application.StartupPath + @"\8378.wav";
+                                    player.Load();
+                                    player.Play();
+                                    break;
+                                case "NG":
+                                    RecordBadInfo(SN, makecode, FileName, "", badcode.ToArray(), badlocation.ToArray(), badprod.ToArray());
+                                    //所有的序列号均采集为良品
+                                    if (!LogicHandler.SetTestNGDetail(SN, makecode, iusercode, isource, Result, out oErrMessage))
+                                    {
+                                        OperateResult.AppendText(oErrMessage + "\n");
+                                        tipform.startthread(oErrMessage, Result);
+                                        continue;
+                                    }
+                                    tipform.startthread("序列号 " + SN + "未通过检测", Result);
+                                    player.SoundLocation = Application.StartupPath + @"\5185.wav";
+                                    player.Load();
+                                    player.Play();
+                                    break;
+                                default:
+                                    break;
+                            }
+                            LogicHandler.AutoPassLog(SN, isource, makecode, Day + Time, istepcode, ilinecode, SoftVersion, Result == "NG" ? "-1" : "0", "0", MissTest, TotalPart, NGPart);
+                            FileName = FileName.Substring(FileName.LastIndexOf(@"\") + 1);
+                            FileInfo file = new FileInfo(FolderPath.Text + @"\" + FileName);
+                            if (file.Exists)
+                            {
+                                try
+                                {
+                                    for (int i = 1; i <= 20; i++)
+                                    {
+                                        if (!File.Exists(BackUpFolderPath.Text + @"\" + FileName))
+                                        {
+                                            file.MoveTo(BackUpFolderPath.Text + @"\" + FileName);
+                                            OperateResult.AppendText("成功解析文件" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + " " + FileName + "\n");
+                                            break;
+                                        }
+                                        else if (!File.Exists(BackUpFolderPath.Text + @"\" + FileName.Split('.')[0] + "(" + i + ")" + "." + FileName.Split('.')[1]))
+                                        {
+                                            file.MoveTo(BackUpFolderPath.Text + @"\" + FileName.Split('.')[0] + "(" + i + ")" + "." + FileName.Split('.')[1]);
+                                            OperateResult.AppendText("成功解析文件" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + " " + FileName + "\n");
+                                            break;
+                                        }
+                                    }
+                                }
+                                catch (Exception ex)
+                                {
+                                    OperateResult.AppendText(FileName + ex.Message + "\n");
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        OperateResult.AppendText(oErrMessage + "\n");
+                        tipform.startthread(oErrMessage, Result);
+                        continue;
+                    }
+                }
+            }
+            else if (Device.Text == "选焊设备")
+            {
+                try
+                {
+                    Dictionary<string, string> dic = new Dictionary<string, string>();
+                    BaseUtil.GetWriteInfo(FileName, out dic);
+                    string sql = "insert into AOITESTDETAIL(atd_id,atd_makecode,atd_indate,";
+                    string sql1 = " values(AOITESTDETAIL_seq.nextval,'" + ma_code.Text + "',sysdate,";
+                    foreach (var item in dic)
+                    {
+                        sql += item.Key + ",";
+                        if (item.Key.Contains("starttime") || item.Key.Contains("endtime"))
+                            sql1 += "to_date('" + item.Value + "','dd/mm/yyyy hh24:mi:ss'),";
+                        else
+                            sql1 += "'" + item.Value + "',";
+                    }
+                    sql = sql.Substring(0, sql.Length - 1) + ")" + sql1.Substring(0, sql1.Length - 1) + ")";
+                    dh.ExecuteSql(sql, "insert");
+                    OperateResult.AppendText("解析成功:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n" + FileName + "\n");
+                }
+                catch (Exception e)
+                {
+                    OperateResult.AppendText("解析失败:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\n" + FileName + "\n" + e.Message + "\n");
+                }
+            }
+        }
+        /// <summary>
+        /// 使用进程处理文件,避免界面假死
+        /// </summary>
+        private void XmlHandleProcess(string FileName)
+        {
+            string test_date = "";
+            string test_result = "";
+            string test_sn = "";
+            string imageurl = "";
+            string oMSID = "";
+            string oErrMessage = "";
+            XmlReader myReader = XmlReader.Create(FolderPath.Text + @"\" + FileName);
+            OperateResult.AppendText("读取文件" + FileName + "\n");
+            //获取采集的项目名称
+            List<string> badcode = new List<string>();
+            //获取采集项目的结果
+            List<string> badlocation = new List<string>();
+            while (myReader.Read())
+            {
+                if (myReader.NodeType == XmlNodeType.Element && myReader.Name == "test" && myReader.IsStartElement())
+                {
+                    test_sn = myReader.GetAttribute("test_sn");
+                    test_result = myReader.GetAttribute("test_result");
+                    test_date = myReader.GetAttribute("test_date");
+                    imageurl = myReader.GetAttribute("imgurl");
+                }
+                //if (myReader.NodeType == XmlNodeType.Text)
+                //{
+                //    if (code_or_location % 2 == 0)
+                //    {
+                //        badcode.Add(myReader.Value);
+                //        code_or_location++;
+                //    }
+                //    else
+                //    {
+                //        badlocation.Add(myReader.Value);
+                //        code_or_location++;
+                //    }
+                //}
+                if (myReader.NodeType == XmlNodeType.Element && myReader.Name == "err_reason" && myReader.IsStartElement())
+                {
+                    badcode.Add(myReader.ReadInnerXml() + " ");
+                }
+                if (myReader.NodeType == XmlNodeType.Element && myReader.Name == "err_location" && myReader.IsStartElement())
+                {
+                    badlocation.Add(myReader.ReadInnerXml() + " ");
+                }
+
+
+            }
+            myReader.Close();
+            //获取文件名的序列号,如SA123456.xml,如果开头为-表示无条码需要自动获取
+            string sncode = FileName.Substring(0, 1) == "-" ? "" : FileName.Split('.')[0];
+            string makecode = "";
+            //获取序列号ID最大的工单号,所有序列号都测试为良品
+            if (sncode == "")
+            {
+                //获取资源,线别,工序相等,并且状态在线的序列号进行分配
+                sql.Clear();
+                sql.Append("select ms_sncode,ms_makecode from makeserial left join source on sc_code=ms_sccode where ");
+                sql.Append("sc_linecode='" + ilinecode + "' and ms_nextstepcode='" + istepcode + "' and ms_status=1 order by ms_id");
+                dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
+                if (dt.Rows.Count > 0)
+                {
+                    makecode = dt.Rows[0]["ms_makecode"].ToString();
+                    sncode = dt.Rows[0]["ms_sncode"].ToString();
+                }
+                else
+                {
+                    OperateResult.AppendText("当前线别在" + istepcode + "无可分配序列号");
+                    tipform.startthread("当前线别在" + istepcode + "无可分配序列号", "NG");
+                    return;
+                }
+                //-2-NG2017/10/2514:46:29.xml取第二位版号
+                string combinecode = FileName.Substring(1, 1);
+                if (LogicHandler.CheckStepSNAndMacode(ma_code.Text == "" ? makecode : ma_code.Text, isource, sncode, iusercode, out makecode, out oMSID, out oErrMessage))
+                {
+                    //插入日志
+                    LogicHandler.AutoPassLog(sncode, isource, makecode, test_date, istepcode, ilinecode, FileName, test_result == "NG" ? "-1" : "0", "-1", 0, "", "");
+                    //如果是不良品记录日志,用于测试采集判负
+                    if (test_result == "NG")
+                    {
+                        RecordBadInfo(sncode, makecode, FileName, combinecode, badcode.ToArray(), badlocation.ToArray(), null);
+                    }
+                    if (!LogicHandler.SetStepResult(makecode, isource, sncode, "自动过站采集", "OK", iusercode, out oErrMessage))
+                    {
+                        OperateResult.AppendText(oErrMessage + "\n");
+                        tipform.startthread(oErrMessage, "NG");
+                        return;
+                    }
+                    tipform.startthread("序列号 " + sncode + "通过检测", test_result);
+                }
+                else
+                {
+                    OperateResult.AppendText(oErrMessage + "\n");
+                    tipform.startthread(oErrMessage, "NG");
+                    return;
+                }
+            }
+            else
+            {
+                string status = "";
+                string errmessage = "";
+                bool NoteAlready = false;
+                LogicHandler.GetMakeInfo(sncode, out makecode, out status, out errmessage);
+                if (ma_code.Text != makecode && makecode != "" && ma_code.Text != "" && status != "2")
+                {
+                    string ChangeMakeCode = MessageBox.Show(this.ParentForm, "序列号" + sncode + "所属工单不同,是否切换?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
+                    //如果选择不切换赋值当前界面工单
+                    if (ChangeMakeCode != "Yes")
+                    {
+                        makecode = ma_code.Text;
+                    }
+                    else
+                    {
+                        NoteAlready = true;
+                    }
+                }
+                if (LogicHandler.CheckStepSNAndMacode(ma_code.Text == "" ? makecode : ma_code.Text, isource, sncode, iusercode, out makecode, out oMSID, out oErrMessage))
+                {
+                    if (!NoteAlready)
+                    {
+                        if (makecode != ma_code.Text && ma_code.Text != "")
+                        {
+                            string ChangeMakeCode = MessageBox.Show(this.ParentForm, "序列号所属工单不同,是否切换?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
+                            //如果选择不切换赋值当前界面工单
+                            if (ChangeMakeCode == "Yes")
+                            {
+                                ma_code.Text = makecode;
+                            }
+                            else
+                            {
+                                OperateResult.AppendText(">>请重新采集序列号\n");
+                                tipform.startthread("请重新采集序列号", test_result);
+                                return;
+                            }
+                        }
+                    }
+                    //获取序列号ID最大的工单
+                    dt = (DataTable)dh.ExecuteSql("select ms_makecode,ms_id from makeserial where ms_sncode='" + sncode + "' order by ms_id desc", "select");
+                    if (dt.Rows.Count > 0)
+                    {
+                        ma_code.Text = dt.Rows[0]["ms_makecode"].ToString();
+                        makecode = dt.Rows[0]["ms_makecode"].ToString();
+                        switch (test_result)
+                        {
+                            case "OK":
+                                if (!LogicHandler.SetStepResult(makecode, isource, sncode, "自动过站采集", test_result, iusercode, out oErrMessage))
+                                {
+                                    OperateResult.AppendText(oErrMessage + "\n");
+                                    tipform.startthread(oErrMessage, test_result);
+                                    return;
+                                }
+                                tipform.startthread("序列号 " + sncode + "通过检测", test_result);
+                                break;
+                            case "NG":
+                                RecordBadInfo(sncode, makecode, FileName, "", badcode.ToArray(), badlocation.ToArray(), null);
+                                //所有的序列号均采集为良品
+                                if (!LogicHandler.SetTestNGDetail(sncode, makecode, iusercode, isource, test_result, out oErrMessage))
+                                {
+                                    OperateResult.AppendText(oErrMessage + "\n");
+                                    tipform.startthread(oErrMessage, test_result);
+                                    return;
+                                }
+                                tipform.startthread("序列号 " + sncode + "未通过检测", test_result);
+                                break;
+                            default:
+                                break;
+                        }
+                        LogicHandler.AutoPassLog(sncode, isource, makecode, test_date, istepcode, ilinecode, FileName, test_result == "NG" ? "1" : "0", "0", 0, "", "");
+                    }
+                }
+                else
+                {
+                    OperateResult.AppendText(oErrMessage + "\n");
+                    tipform.startthread(oErrMessage, "NG");
+                    return;
+                }
+            }
+            FileInfo file = new FileInfo(FolderPath.Text + @"\" + FileName);
+            if (file.Exists)
+            {
+                try
+                {
+                    for (int i = 1; i <= 20; i++)
+                    {
+                        if (!File.Exists(BackUpFolderPath.Text + @"\" + FileName))
+                        {
+                            file.MoveTo(BackUpFolderPath.Text + @"\" + FileName);
+                            OperateResult.AppendText("成功解析文件" + FileName + "\n");
+                            break;
+                        }
+                        else if (!File.Exists(BackUpFolderPath.Text + @"\" + FileName.Split('.')[0] + "(" + i + ")" + "." + FileName.Split('.')[1]))
+                        {
+                            file.MoveTo(BackUpFolderPath.Text + @"\" + FileName.Split('.')[0] + "(" + i + ")" + "." + FileName.Split('.')[1]);
+                            OperateResult.AppendText("成功解析文件" + FileName + "\n");
+                            break;
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    OperateResult.AppendText(FileName + ex.Message + "\n");
+                }
+            }
+        }
+
+        private void RecordBadInfo(string sncode, string makecode, string filename, string combine, string[] badcode, string[] badlocation, string[] soncode)
+        {
+            string[] ID = dh.GetSEQ("makebad_seq", badcode.Length);
+            sql.Clear();
+            sql.Append("update makebad set mb_status=-1 where mb_sncode='" + sncode + "' and mb_stepcode='" + istepcode + "' and mb_makecode='" + makecode + "' and mb_status=0");
+            dh.ExecuteSql(sql.ToString(), "update");
+            sql.Clear();
+            sql.Append("insert into makebad(mb_id,mb_makecode,mb_mscode,mb_sncode,mb_inman,mb_indate,mb_stepcode");
+            sql.Append(",mb_sourcecode,mb_badcode,mb_bgcode,mb_badtable,mb_status,mb_badlocation,mb_soncode,mb_content) select :ID");
+            sql.Append(",ma_code,ms_code,ms_sncode,'" + iusercode + "',sysdate,'" + istepcode + "','" + isource + "',");
+            sql.Append(":bc_code,'" + ibadgroup + "','','0',:location,:soncode,'" + nextLine + "' from make left join makeSerial on ms_makecode=ma_code ");
+            sql.Append("where ms_sncode='" + sncode + "' and ms_makecode='" + makecode + "'");
+            dh.BatchInsert(sql.ToString(), new string[] { "ID", "bc_code", "location", "soncode" }, ID, badcode, badlocation, soncode);
+            sql.Clear();
+            sql.Append("update makebad set mb_badname=(select DISTINCT bc_name from badcode where bc_code=mb_badcode),mb_bgname=(select DISTINCT bg_name from badgroup where bg_code=mb_bgcode) ");
+            sql.Append("where mb_id=:ID");
+            dh.BatchInsert(sql.ToString(), new string[] { "ID" }, ID);
+            //记录判断日志
+            if (dh.getFieldDataByCondition("source", "sc_scantype", "sc_code='" + isource + "'").ToString() == "REJUCE")
+            {
+                LogicHandler.AutoPassJudge(sncode, makecode, isource, filename, ilinecode, combine);
+            }
+        }
+
+        private void StopWatch_Click(object sender, EventArgs e)
+        {
+            XmlWatcher.EnableRaisingEvents = false;
+            StartWatch.Enabled = true;
+            ma_code.Enabled = true;
+            Master.Enabled = true;
+            ChooseFolder.Enabled = true;
+            ChooseBackUpFolder.Enabled = true;
+            StopWatch.Enabled = false;
+            OperateResult.AppendText("停止执行监控\n");
+        }
+
+        private void Clean_Click(object sender, EventArgs e)
+        {
+            OperateResult.Clear();
+        }
+
+        private void ChooseFolder_Click(object sender, EventArgs e)
+        {
+            FolderBrowserDialog folder = new FolderBrowserDialog();
+            folder.Description = "选择监控文件夹";
+            DialogResult result = folder.ShowDialog();
+            if (result == DialogResult.OK)
+            {
+                FolderPath.Text = folder.SelectedPath;
+            }
+        }
+
+        private void ChooseBackUpFolder_Click(object sender, EventArgs e)
+        {
+            FolderBrowserDialog folder = new FolderBrowserDialog();
+            folder.Description = "选择备份文件夹";
+            DialogResult result = folder.ShowDialog();
+            if (result == DialogResult.OK)
+            {
+                BackUpFolderPath.Text = folder.SelectedPath;
+            }
+        }
+
+        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            string ExitConfirm = MessageBox.Show(this, "确认退出?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
+            if (ExitConfirm != "Yes")
+            {
+                WindowState = FormWindowState.Minimized;
+                e.Cancel = true;
+            }
+        }
+
+        private void AutoStart_CheckedChanged(object sender, EventArgs e)
+        {
+            SetAutoRun();
+        }
+
+        private void SetAutoRun()
+        {
+            if (AutoStart.Checked) //设置开机自启动  
+            {
+                string path = Application.ExecutablePath;
+                RegistryKey rk = Registry.LocalMachine;
+                RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
+                rk2.SetValue("UAS自动过站解析器.exe", path);
+                rk2.Close();
+                rk.Close();
+            }
+            else //取消开机自启动  
+            {
+                string path = Application.ExecutablePath;
+                RegistryKey rk = Registry.LocalMachine;
+                RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
+                rk2.DeleteValue("UAS自动过站解析器.exe", false);
+                rk2.Close();
+                rk.Close();
+            }
+        }
+
+        private void BatchAnalysus_Click(object sender, EventArgs e)
+        {
+            var AllXmls = Directory.GetFiles(FolderPath.Text, "*.txt");
+            foreach (var Xml in AllXmls)
+            {
+                TxtHandleProcess(Xml);
+            }
+        }
+
+        private void Timer_Tick(object sender, EventArgs e)
+        {
+            dh.ExecuteSql("select sysdate from dual", "select");
+        }
+
+        private void button1_Click(object sender, EventArgs e)
+        {
+            SoundPlayer player = new SoundPlayer();
+            player.SoundLocation = Application.StartupPath + @"\8378.wav";
+            player.Load();
+            player.Play();
+        }
+
+        private void button2_Click(object sender, EventArgs e)
+        {
+            SoundPlayer player = new SoundPlayer();
+            player.SoundLocation = Application.StartupPath + @"\5185.wav";
+            player.Load();
+            player.Play();
+        }
+    }
+}

+ 129 - 0
FileWatcher/AutoAnalysisXml.resx

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="XmlWatcher.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="XmlFolder.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>164, 17</value>
+  </metadata>
+  <metadata name="Timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>296, 17</value>
+  </metadata>
+</root>

+ 234 - 0
FileWatcher/BaseUtil.cs

@@ -0,0 +1,234 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+using System.Xml;
+
+namespace FileWatcher
+{
+    class BaseUtil
+    {
+        public static void CreateXml(string iSN, string iTestResult)
+        {
+            //创建XML文档
+            FileStream fcaches = new FileStream(iSN + ".xml", FileMode.OpenOrCreate, FileAccess.ReadWrite);
+            fcaches.Close();
+            FileInfo info = new FileInfo(iSN + ".xml");
+            if (info.Length == 0)
+            {
+                XmlDocument doc = new XmlDocument();
+                //创建类型声明节点  
+                XmlNode node = doc.CreateXmlDeclaration("1.0", "utf-8", "");
+                doc.AppendChild(node);
+                //创建根节点  
+                XmlElement xeRoot = doc.CreateElement("cacheInfo");
+                doc.AppendChild(xeRoot);
+                doc.Save(iSN + ".xml");
+            }
+        }
+
+        public static object GetCacheData(string ParamName)
+        {
+            try
+            {
+                object returnData = null;
+                //根据地址读取xml文件
+                XmlDocument doc = new XmlDocument();
+                XmlReaderSettings settings = new XmlReaderSettings();
+                //忽略文档里面的注释
+                settings.IgnoreComments = true;
+                XmlReader reader = XmlReader.Create(AutoAnalysisXml.CachePath, settings);
+                doc.Load(reader);
+                //先得到根节点
+                XmlNode rootNode = doc.SelectSingleNode("cacheInfo");
+                //再由根节点去找制定的节点
+                XmlNodeList nodeList = rootNode.ChildNodes;
+                foreach (XmlNode node in nodeList)
+                {
+                    //找到了这个节点名字
+                    if (node.Name == ParamName)
+                    {
+                        //返回节点的内容
+                        switch (((XmlElement)node).GetAttribute("Type"))
+                        {
+                            case "System.String":
+                                returnData = node.InnerText;
+                                break;
+                            case "System.Int32":
+                                returnData = int.Parse(node.InnerText);
+                                break;
+                            case "System.Boolean":
+                                returnData = node.InnerText == "True" ? true : false;
+                                break;
+                            default:
+                                break;
+                        }
+                        break;
+                    }
+                }
+                //关闭reader
+                reader.Close();
+                if (returnData == null)
+                    return "";
+                else
+                    return returnData;
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e.Message + e.StackTrace);
+                return "";
+            }
+        }
+
+        public static void SetCacheData(string ParamName, object Value)
+        {
+            try
+            {
+                //根据地址读取xml文件
+                XmlDocument doc = new XmlDocument();
+                XmlReaderSettings settings = new XmlReaderSettings();
+                //忽略文档里面的注释
+                settings.IgnoreComments = true;
+                XmlReader reader = XmlReader.Create(AutoAnalysisXml.CachePath, settings);
+                doc.Load(reader);
+                //先得到根节点
+                XmlNode rootNode = doc.SelectSingleNode("cacheInfo");
+                //再由根节点去找制定的节点
+                XmlNodeList nodeList = rootNode.ChildNodes;
+                bool flag = false;
+                foreach (XmlNode node in nodeList)
+                {
+                    //找到了这个节点名字
+                    if (node.Name == ParamName)
+                    {
+                        //就直接赋值
+                        node.InnerText = Value.ToString();
+                        flag = true;
+                    }
+                }
+                //如果没有该节点,就创建节点保存结果
+                if (!flag)
+                {
+                    //创建节点
+                    XmlElement newNode = doc.CreateElement(ParamName);
+                    XmlAttribute attr = doc.CreateAttribute("Type");
+                    attr.InnerText = Value.GetType().ToString();
+                    newNode.InnerText = Value.ToString();
+                    newNode.SetAttributeNode(attr);
+                    //讲新建的节点挂到根节点上
+                    rootNode.AppendChild(newNode);
+                }
+                //关闭Reader
+                reader.Close();
+                doc.Save(AutoAnalysisXml.CachePath);
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message + ex.StackTrace);
+            }
+        }
+
+
+        //播放音频文件
+        public static void PlaySound(string FileName)
+        {
+            //要加载COM组件:Microsoft speech object Library    
+            if (!System.IO.File.Exists(FileName))
+            {
+                return;
+            }
+            //SpeechLib.SpVoiceClass pp = new SpeechLib.SpVoiceClass();
+            //SpeechLib.SpFileStreamClass spFs = new SpeechLib.SpFileStreamClass();
+            //spFs.Open(FileName, SpeechLib.SpeechStreamFileMode.SSFMOpenForRead, true);
+            //SpeechLib.ISpeechBaseStream Istream = spFs as SpeechLib.ISpeechBaseStream;
+            //pp.SpeakStream(Istream, SpeechLib.SpeechVoiceSpeakFlags.SVSFIsFilename);
+            //spFs.Close();
+        }
+
+        public static void GetWriteInfo(string FilePath, out Dictionary<string, string> Dic)
+        {
+            Dic = new Dictionary<string, string>();
+            string txt = "";
+            StreamReader sr = new StreamReader(FilePath);
+            while (!sr.EndOfStream)
+            {
+                string str = sr.ReadLine();
+                txt += str + "\n";
+            }
+            sr.Close();
+            sr.Dispose();
+            Dic.Add("atd_sncode", FilePath.Substring(FilePath.LastIndexOf("\\") + 1).Replace(".txt", ""));
+            Dic.Add("atd_software", Regex.Match(txt, "Program Name,\\S+").Value.Replace("Program Name,", ""));
+            Dic.Add("atd_pot", Regex.Match(txt, "Board Segment,\\S+").Value.Replace("Board Segment,", ""));
+            Dic.Add("atd_size", Regex.Match(txt, "Baord Size \\(L x W\\) \\[mm\\],\\S+").Value.Replace("Baord Size (L x W) [mm],", ""));
+            Dic.Add("atd_pot1set", Regex.Match(txt, "Pot-1 Set Temp. \\[deg],\\S+").Value.Replace("Pot-1 Set Temp. [deg],", ""));
+            Dic.Add("atd_pot2set", Regex.Match(txt, "Pot-2 Set Temp. \\[deg],\\S+").Value.Replace("Pot-2 Set Temp. [deg],", ""));
+            Dic.Add("atd_pot1avgtemp", Regex.Match(txt, "Pot-1 Avg. Temp. \\[deg],\\S+").Value.Replace("Pot-1 Avg. Temp. [deg],", ""));
+            Dic.Add("atd_pot2avgtemp", Regex.Match(txt, "Pot-2 Avg. Temp. \\[deg],\\S+").Value.Replace("Pot-2 Avg. Temp. [deg],", ""));
+            Dic.Add("atd_boardtime", Regex.Match(txt, "Machine Duration \\[s],\\S+").Value.Replace("Machine Duration [s],", ""));
+
+            //开始时间
+            MatchCollection starttime = Regex.Matches(txt, "Start TimeStamp,\\S+ \\S+");
+            for (int i = 0; i < starttime.Count; i++)
+            {
+                switch (i)
+                {
+                    case 0:
+                        Dic.Add("atd_boardstarttime", starttime[i].Value.Replace("Start TimeStamp,", ""));
+                        break;
+                    case 1:
+                        Dic.Add("atd_flstarttime", starttime[i].Value.Replace("Start TimeStamp,", ""));
+                        break;
+                    case 2:
+                        Dic.Add("atd_phstarttime", starttime[i].Value.Replace("Start TimeStamp,", ""));
+                        break;
+                    case 3:
+                        Dic.Add("atd_sostarttime", starttime[i].Value.Replace("Start TimeStamp,", ""));
+                        break;
+                    default:
+                        break;
+                }
+            }
+            MatchCollection endtime = Regex.Matches(txt, "End TimeStamp,\\S+ \\S+");
+            for (int i = 0; i < starttime.Count; i++)
+            {
+                switch (i)
+                {
+                    case 0:
+                        Dic.Add("atd_boardendtime", endtime[i].Value.Replace("End TimeStamp,", ""));
+                        break;
+                    case 1:
+                        Dic.Add("atd_flendtime", endtime[i].Value.Replace("End TimeStamp,", ""));
+                        break;
+                    case 2:
+                        Dic.Add("atd_phendtime", endtime[i].Value.Replace("End TimeStamp,", ""));
+                        break;
+                    case 3:
+                        Dic.Add("atd_soendtime", endtime[i].Value.Replace("End TimeStamp,", ""));
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            MatchCollection duration = Regex.Matches(txt, "Total Zone Duration \\[s],\\S+");
+            for (int i = 0; i < starttime.Count; i++)
+            {
+                switch (i)
+                {
+                    case 0:
+                        Dic.Add("atd_fltime", duration[i].Value.Replace("Total Zone Duration [s],", ""));
+                        break;
+                    case 1:
+                        Dic.Add("atd_phtime", duration[i].Value.Replace("Total Zone Duration [s],", ""));
+                        break;
+                    case 2:
+                        Dic.Add("atd_sotime", duration[i].Value.Replace("Total Zone Duration [s],", ""));
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+    }
+}

+ 2 - 2
FileWatcher/DataHelper.cs

@@ -9,9 +9,9 @@ namespace FileWatcher
     class DataHelper
     {
         //系统默认的的连接字符串
-        private string ConnectionStrings = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=MES;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.8.0.82)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
+        private string ConnectionStrings = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=DGW;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=81.71.42.91)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
         //用户选择的数据库的连接字符串
-        public static string DBConnectionString= "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=MES;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.8.0.82)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
+        public static string DBConnectionString= "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=DGW;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=81.71.42.91)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));";
         public static OracleConnection connection = null;
         OracleCommand command = null;
         int ReconnectTime = 0;

+ 47 - 0
FileWatcher/FileWatcher.csproj

@@ -46,10 +46,45 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
+    <Reference Include="UMES.DLLService">
+      <HintPath>..\UAS_MesInterface(ODLF)\bin\Debug\UMES.DLLService.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="AutoAnalysisXml.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AutoAnalysisXml.Designer.cs">
+      <DependentUpon>AutoAnalysisXml.cs</DependentUpon>
+    </Compile>
+    <Compile Include="BaseUtil.cs" />
     <Compile Include="DataHelper.cs" />
+    <Compile Include="Form2.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form2.Designer.cs">
+      <DependentUpon>Form2.cs</DependentUpon>
+    </Compile>
     <Compile Include="ftpOperater.cs" />
+    <Compile Include="LoadingCircle.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="LoadingCircle.Designer.cs">
+      <DependentUpon>LoadingCircle.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LogicHandler.cs" />
+    <Compile Include="SetLoadingWindow.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SetLoadingWindow.Designer.cs">
+      <DependentUpon>SetLoadingWindow.cs</DependentUpon>
+    </Compile>
+    <Compile Include="测试记录解析DCW.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="测试记录解析DCW.Designer.cs">
+      <DependentUpon>测试记录解析DCW.cs</DependentUpon>
+    </Compile>
     <Compile Include="测试记录解析.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -64,6 +99,18 @@
     </Compile>
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="AutoAnalysisXml.resx">
+      <DependentUpon>AutoAnalysisXml.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Form2.resx">
+      <DependentUpon>Form2.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SetLoadingWindow.resx">
+      <DependentUpon>SetLoadingWindow.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="测试记录解析DCW.resx">
+      <DependentUpon>测试记录解析DCW.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="测试记录解析.resx">
       <DependentUpon>测试记录解析.cs</DependentUpon>
     </EmbeddedResource>

+ 104 - 0
FileWatcher/Form2.Designer.cs

@@ -0,0 +1,104 @@
+namespace FileWatcher
+{
+    partial class Tip
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.checkBox1 = new System.Windows.Forms.CheckBox();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.panel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.BackColor = System.Drawing.SystemColors.Menu;
+            this.label1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label1.ForeColor = System.Drawing.Color.Black;
+            this.label1.Location = new System.Drawing.Point(13, 10);
+            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.label1.MaximumSize = new System.Drawing.Size(400, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(0, 27);
+            this.label1.TabIndex = 0;
+            // 
+            // checkBox1
+            // 
+            this.checkBox1.AutoSize = true;
+            this.checkBox1.BackColor = System.Drawing.SystemColors.Menu;
+            this.checkBox1.Font = new System.Drawing.Font("宋体", 7.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.checkBox1.ForeColor = System.Drawing.Color.Black;
+            this.checkBox1.Location = new System.Drawing.Point(13, 68);
+            this.checkBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.checkBox1.Name = "checkBox1";
+            this.checkBox1.Size = new System.Drawing.Size(107, 17);
+            this.checkBox1.TabIndex = 1;
+            this.checkBox1.Text = "是否自动隐藏";
+            this.checkBox1.UseVisualStyleBackColor = false;
+            this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.checkBox1);
+            this.panel1.Controls.Add(this.label1);
+            this.panel1.Location = new System.Drawing.Point(3, 0);
+            this.panel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(413, 91);
+            this.panel1.TabIndex = 2;
+            this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
+            this.panel1.MouseEnter += new System.EventHandler(this.Form2_MouseEnter);
+            this.panel1.MouseLeave += new System.EventHandler(this.Form2_MouseLeave);
+            // 
+            // Tip
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.SystemColors.Menu;
+            this.ClientSize = new System.Drawing.Size(416, 98);
+            this.Controls.Add(this.panel1);
+            this.ForeColor = System.Drawing.Color.White;
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.Name = "Tip";
+            this.Text = "Form2";
+            this.TopMost = true;
+            this.Load += new System.EventHandler(this.Form2_Load);
+            this.panel1.ResumeLayout(true);
+            this.panel1.PerformLayout();
+            this.ResumeLayout(true);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.CheckBox checkBox1;
+        private System.Windows.Forms.Panel panel1;
+    }
+}

+ 136 - 0
FileWatcher/Form2.cs

@@ -0,0 +1,136 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace FileWatcher
+{
+    public partial class Tip : Form
+    {
+        int state;
+
+        public Tip()
+        {
+            InitializeComponent();
+        }
+        private void Form2_Load(object sender, EventArgs e)
+        {
+            this.ShowInTaskbar = false;
+            this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
+            this.Top = this.Height;
+            state = 0;
+            label1.Text = DateTime.Now.ToString();
+        }
+
+        public void startthread(string filename,string type)
+        {
+            label1.Text = filename;
+            if(type  == "OK")
+            label1.ForeColor = System.Drawing.Color.Green;
+            if(type == "NG")
+            label1.ForeColor = System.Drawing.Color.Red;
+                  
+            //thread.Start();
+            using (BackgroundWorker bw = new BackgroundWorker())
+            {
+                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
+                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
+                bw.RunWorkerAsync("Tank");
+            }
+        }
+
+        private void bw_DoWork(object sender, DoWorkEventArgs e)
+        {
+
+        }
+        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            if (checkBox1.Checked)
+            {
+                aa();
+                Thread.Sleep(2000);
+                bb();
+            }
+        }
+        public void aa()
+        {
+            if (state == 0)
+            {
+                state = 1;
+                int t = this.Left;
+                for (int i = t; i >= Screen.PrimaryScreen.WorkingArea.Width - this.Width; i--)
+                {
+                    this.Left = i;
+                    Application.DoEvents();
+                }
+                state = 0;
+            }
+        }
+
+        public void bb()
+        {
+            if (this.Left <= Screen.PrimaryScreen.WorkingArea.Width - 10 && state == 0)
+            {
+                state = 1;
+                int t = this.Left;
+                for (int i = t; i < Screen.PrimaryScreen.WorkingArea.Width - 10; i++)
+                {
+                    this.Left = i;
+                    Application.DoEvents();
+                }
+                state = 0;
+            }
+        }
+
+        private void Form2_MouseEnter(object sender, EventArgs e)
+        {
+            if (state == 0)
+            {
+                state = 1;
+                int t = this.Left;
+                for (int i = t; i >= Screen.PrimaryScreen.WorkingArea.Width - this.Width; i=i-2)
+                {
+                    this.Left = i;
+                    Application.DoEvents();
+                }
+                state = 0;
+            }
+        }
+
+        private void Form2_MouseLeave(object sender, EventArgs e)
+        {
+            if (checkBox1.Checked)
+            {
+                Panel p = sender as Panel;
+                //如果Mouse Leave,则清除背景图,否则不处理
+                Point mousePoint = p.PointToClient(Control.MousePosition);
+                if (!p.ClientRectangle.Contains(mousePoint))
+                {
+                    if (this.Left <= Screen.PrimaryScreen.WorkingArea.Width - 10 && state == 0)
+                    {
+                        state = 1;
+                        int t = this.Left;
+                        for (int i = t; i < Screen.PrimaryScreen.WorkingArea.Width - 10; i = i + 2)
+                        {
+                            this.Left = i;
+                            Application.DoEvents();
+                        }
+                        state = 0;
+                    }
+                }
+            }      
+        }
+
+        private void panel1_Paint(object sender, PaintEventArgs e)
+        {
+
+        }
+
+        private void checkBox1_CheckedChanged(object sender, EventArgs e)
+        {
+            if (!checkBox1.Checked)
+                aa();  
+        }
+    }
+}

+ 120 - 0
FileWatcher/Form2.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 21 - 0
FileWatcher/LoadingCircle.Designer.cs

@@ -0,0 +1,21 @@
+//#####################################################################################
+//★★★★★★★           http://www.cnpopsoft.com [华普软件]           ★★★★★★★
+//★★★★★★★           华普软件-VB、C#专业论文与源码荟萃!           ★★★★★★★
+//#####################################################################################
+
+namespace UAS_AutoPass
+{
+    partial class LoadingCircle
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+
+    }
+}

+ 470 - 0
FileWatcher/LoadingCircle.cs

@@ -0,0 +1,470 @@
+//#####################################################################################
+//★★★★★★★           http://www.cnpopsoft.com [华普软件]           ★★★★★★★
+//★★★★★★★           华普软件-VB、C#专业论文与源码荟萃!           ★★★★★★★
+//#####################################################################################
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Text;
+using System.Windows.Forms;
+
+namespace FileWatcher
+{
+    public partial class LoadingCircle : Control
+    {
+        #region 常数
+        private const double NumberOfDegreesInCircle = 360;
+        private const double NumberOfDegreesInHalfCircle = NumberOfDegreesInCircle / 2;
+        private const int DefaultInnerCircleRadius = 8;
+        private const int DefaultOuterCircleRadius = 10;
+        private const int DefaultNumberOfSpoke = 10;
+        private const int DefaultSpokeThickness = 4;
+        private readonly Color DefaultColor = Color.DarkGray;
+
+        private const int MacOSXInnerCircleRadius = 5;
+        private const int MacOSXOuterCircleRadius = 11;
+        private const int MacOSXNumberOfSpoke = 12;
+        private const int MacOSXSpokeThickness = 2;
+
+        private const int FireFoxInnerCircleRadius = 6;
+        private const int FireFoxOuterCircleRadius = 7;
+        private const int FireFoxNumberOfSpoke = 9;
+        private const int FireFoxSpokeThickness = 4;
+
+        private const int IE7InnerCircleRadius = 8;
+        private const int IE7OuterCircleRadius = 9;
+        private const int IE7NumberOfSpoke = 24;
+        private const int IE7SpokeThickness = 4;
+
+        #endregion
+
+        #region 枚举
+
+        public enum StylePresets
+        {
+            MacOSX,
+            Firefox,
+            IE7,
+            Custom
+        }
+
+        #endregion
+
+        #region 局部变量
+
+        private Timer m_Timer;
+        private bool m_IsTimerActive;
+        private int m_NumberOfSpoke;
+        private int m_SpokeThickness;
+        private int m_ProgressValue;
+        private int m_OuterCircleRadius;
+        private int m_InnerCircleRadius;
+        private PointF m_CenterPoint;
+        private Color m_Color;
+        private Color[] m_Colors;
+        private double[] m_Angles;
+        private StylePresets m_StylePreset;
+
+        #endregion
+
+        #region 属性
+
+        /// <summary>
+        /// 获取和设置控件高亮色
+        /// </summary>
+        /// <value>高亮色</value>
+        [TypeConverter("System.Drawing.ColorConverter"),
+        Category("LoadingCircle"),
+        Description("获取和设置控件高亮色")]
+        public Color Color
+        {
+            get
+            {
+                return m_Color;
+            }
+            set
+            {
+                m_Color = value;
+
+                GenerateColorsPallet();
+                Invalidate();
+            }
+        }
+
+        /// <summary>
+        /// 获取和设置外围半径
+        /// </summary>
+        /// <value>外围半径</value>
+        [System.ComponentModel.Description("获取和设置外围半径"),
+         System.ComponentModel.Category("LoadingCircle")]
+        public int OuterCircleRadius
+        {
+            get
+            {
+                if (m_OuterCircleRadius == 0)
+                    m_OuterCircleRadius = DefaultOuterCircleRadius;
+
+                return m_OuterCircleRadius;
+            }
+            set
+            {
+                m_OuterCircleRadius = value;
+                Invalidate();
+            }
+        }
+
+        /// <summary>
+        /// 获取和设置内圆半径
+        /// </summary>
+        /// <value>内圆半径</value>
+        [System.ComponentModel.Description("获取和设置内圆半径"),
+         System.ComponentModel.Category("LoadingCircle")]
+        public int InnerCircleRadius
+        {
+            get
+            {
+                if (m_InnerCircleRadius == 0)
+                    m_InnerCircleRadius = DefaultInnerCircleRadius;
+
+                return m_InnerCircleRadius;
+            }
+            set
+            {
+                m_InnerCircleRadius = value;
+                Invalidate();
+            }
+        }
+
+        /// <summary>
+        /// 获取和设置辐条数量
+        /// </summary>
+        /// <value>辐条数量</value>
+        [System.ComponentModel.Description("获取和设置辐条数量"),
+        System.ComponentModel.Category("LoadingCircle")]
+        public int NumberSpoke
+        {
+            get
+            {
+                if (m_NumberOfSpoke == 0)
+                    m_NumberOfSpoke = DefaultNumberOfSpoke;
+                return m_NumberOfSpoke;
+            }
+            set
+            {
+                if (m_NumberOfSpoke != value && m_NumberOfSpoke > 0)
+                {
+                    m_NumberOfSpoke = value;
+                    GenerateColorsPallet();
+                    GetSpokesAngles();
+                    Invalidate();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 获取和设置一个布尔值,表示当前控件<see cref="T:LoadingCircle"/>是否激活。
+        /// </summary>
+        /// <value><c>true</c> 表示激活;否则,为<c>false</c>。</value>
+        [System.ComponentModel.Description("获取和设置一个布尔值,表示当前控件是否激活。"),
+        System.ComponentModel.Category("LoadingCircle")]
+        public bool Active
+        {
+            get
+            {
+                return m_IsTimerActive;
+            }
+            set
+            {
+                m_IsTimerActive = value;
+                ActiveTimer();
+            }
+        }
+
+        /// <summary>
+        /// 获取和设置辐条粗细程度。
+        /// </summary>
+        /// <value>辐条粗细值</value>
+        [System.ComponentModel.Description("获取和设置辐条粗细程度。"),
+        System.ComponentModel.Category("LoadingCircle")]
+        public int SpokeThickness
+        {
+            get
+            {
+                if (m_SpokeThickness <= 0)
+                    m_SpokeThickness = DefaultSpokeThickness;
+                return m_SpokeThickness;
+            }
+            set
+            {
+                m_SpokeThickness = value;
+                Invalidate();
+            }
+        }
+
+        /// <summary>
+        /// 获取和设置旋转速度。
+        /// </summary>
+        /// <value>旋转速度</value>
+        [System.ComponentModel.Description("获取和设置旋转速度。"),
+        System.ComponentModel.Category("LoadingCircle")]
+        public int RotationSpeed
+        {
+            get
+            {
+                return m_Timer.Interval;
+            }
+            set
+            {
+                if (value > 0)
+                    m_Timer.Interval = value;
+            }
+        }
+
+        /// <summary>
+        /// 快速设置预定义风格。
+        /// </summary>
+        /// <value>风格的值</value>
+        [Category("LoadingCircle"),
+        Description("快速设置预定义风格。"),
+         DefaultValue(typeof(StylePresets), "Custom")]
+        public StylePresets StylePreset
+        {
+            get { return m_StylePreset; }
+            set
+            {
+                m_StylePreset = value;
+
+                switch (m_StylePreset)
+                {
+                    case StylePresets.MacOSX:
+                        SetCircleAppearance(MacOSXNumberOfSpoke,
+                            MacOSXSpokeThickness, MacOSXInnerCircleRadius,
+                            MacOSXOuterCircleRadius);
+                        break;
+                    case StylePresets.Firefox:
+                        SetCircleAppearance(FireFoxNumberOfSpoke,
+                            FireFoxSpokeThickness, FireFoxInnerCircleRadius,
+                            FireFoxOuterCircleRadius);
+                        break;
+                    case StylePresets.IE7:
+                        SetCircleAppearance(IE7NumberOfSpoke,
+                            IE7SpokeThickness, IE7InnerCircleRadius,
+                            IE7OuterCircleRadius);
+                        break;
+                    case StylePresets.Custom:
+                        SetCircleAppearance(DefaultNumberOfSpoke,
+                            DefaultSpokeThickness,
+                            DefaultInnerCircleRadius,
+                            DefaultOuterCircleRadius);
+                        break;
+                }
+            }
+        }
+
+        #endregion
+
+        #region 构造函数及事件处理
+
+        public LoadingCircle()
+        {
+            SetStyle(ControlStyles.UserPaint, true);
+            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+            SetStyle(ControlStyles.ResizeRedraw, true);
+            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
+
+            m_Color = DefaultColor;
+
+            GenerateColorsPallet();
+            GetSpokesAngles();
+            GetControlCenterPoint();
+
+            m_Timer = new Timer();
+            m_Timer.Tick += new EventHandler(aTimer_Tick);
+            ActiveTimer();
+
+            this.Resize += new EventHandler(LoadingCircle_Resize);
+        }
+
+        void LoadingCircle_Resize(object sender, EventArgs e)
+        {
+            GetControlCenterPoint();
+        }
+
+        void aTimer_Tick(object sender, EventArgs e)
+        {
+            m_ProgressValue = ++m_ProgressValue % m_NumberOfSpoke;
+            Invalidate();
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            if (m_NumberOfSpoke > 0)
+            {
+                e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
+
+                int intPosition = m_ProgressValue;
+                for (int intCounter = 0; intCounter < m_NumberOfSpoke; intCounter++)
+                {
+                    intPosition = intPosition % m_NumberOfSpoke;
+                    DrawLine(e.Graphics,
+                             GetCoordinate(m_CenterPoint, m_InnerCircleRadius, m_Angles[intPosition]),
+                             GetCoordinate(m_CenterPoint, m_OuterCircleRadius, m_Angles[intPosition]),
+                             m_Colors[intCounter], m_SpokeThickness);
+                    intPosition++;
+                }
+            }
+
+            base.OnPaint(e);
+        }
+
+        #endregion
+
+        #region 局部方法
+
+        private Color Darken(Color _objColor, int _intPercent)
+        {
+            int intRed = _objColor.R;
+            int intGreen = _objColor.G;
+            int intBlue = _objColor.B;
+            return Color.FromArgb(_intPercent, Math.Min(intRed, byte.MaxValue), Math.Min(intGreen, byte.MaxValue), Math.Min(intBlue, byte.MaxValue));
+        }
+
+        private void GenerateColorsPallet()
+        {
+            m_Colors = GenerateColorsPallet(m_Color, Active, m_NumberOfSpoke);
+        }
+
+        private Color[] GenerateColorsPallet(Color _objColor, bool _blnShadeColor, int _intNbSpoke)
+        {
+            Color[] objColors = new Color[NumberSpoke];
+
+            byte bytIncrement = (byte)(byte.MaxValue / NumberSpoke);
+
+            byte PERCENTAGE_OF_DARKEN = 0;
+
+            for (int intCursor = 0; intCursor < NumberSpoke; intCursor++)
+            {
+                if (_blnShadeColor)
+                {
+                    if (intCursor == 0 || intCursor < NumberSpoke - _intNbSpoke)
+                        objColors[intCursor] = _objColor;
+                    else
+                    {
+                        PERCENTAGE_OF_DARKEN += bytIncrement;
+
+                        if (PERCENTAGE_OF_DARKEN > byte.MaxValue)
+                            PERCENTAGE_OF_DARKEN = byte.MaxValue;
+
+                        objColors[intCursor] = Darken(_objColor, PERCENTAGE_OF_DARKEN);
+                    }
+                }
+                else
+                    objColors[intCursor] = _objColor;
+            }
+
+            return objColors;
+        }
+
+        private void GetControlCenterPoint()
+        {
+            m_CenterPoint = GetControlCenterPoint(this);
+        }
+
+        private PointF GetControlCenterPoint(Control _objControl)
+        {
+            return new PointF(_objControl.Width / 2, _objControl.Height / 2 - 1);
+        }
+
+        private void DrawLine(Graphics _objGraphics, PointF _objPointOne, PointF _objPointTwo,
+                              Color _objColor, int _intLineThickness)
+        {
+            using (Pen objPen = new Pen(new SolidBrush(_objColor), _intLineThickness))
+            {
+                objPen.StartCap = LineCap.Round;
+                objPen.EndCap = LineCap.Round;
+                _objGraphics.DrawLine(objPen, _objPointOne, _objPointTwo);
+            }
+        }
+
+        private PointF GetCoordinate(PointF _objCircleCenter, int _intRadius, double _dblAngle)
+        {
+            double dblAngle = Math.PI * _dblAngle / NumberOfDegreesInHalfCircle;
+
+            return new PointF(_objCircleCenter.X + _intRadius * (float)Math.Cos(dblAngle),
+                              _objCircleCenter.Y + _intRadius * (float)Math.Sin(dblAngle));
+        }
+
+        private void GetSpokesAngles()
+        {
+            m_Angles = GetSpokesAngles(NumberSpoke);
+        }
+
+        private double[] GetSpokesAngles(int _intNumberSpoke)
+        {
+            double[] Angles = new double[_intNumberSpoke];
+            double dblAngle = (double)NumberOfDegreesInCircle / _intNumberSpoke;
+
+            for (int shtCounter = 0; shtCounter < _intNumberSpoke; shtCounter++)
+                Angles[shtCounter] = (shtCounter == 0 ? dblAngle : Angles[shtCounter - 1] + dblAngle);
+
+            return Angles;
+        }
+
+        private void ActiveTimer()
+        {
+            if (m_IsTimerActive)
+                m_Timer.Start();
+            else
+            {
+                m_Timer.Stop();
+                m_ProgressValue = 0;
+            }
+
+            GenerateColorsPallet();
+            Invalidate();
+        }
+
+        #endregion
+
+        #region 全局方法
+
+        /// <summary>
+        /// 获取适合控件区域的矩形大小。
+        /// </summary>
+        /// <param name="proposedSize">The custom-sized area for a control.</param>
+        /// <returns>
+        /// An ordered pair of type <see cref="T:System.Drawing.Size"></see> representing the width and height of a rectangle.
+        /// </returns>
+        public override Size GetPreferredSize(Size proposedSize)
+        {
+            proposedSize.Width =
+                (m_OuterCircleRadius + m_SpokeThickness) * 2;
+
+            return proposedSize;
+        }
+
+        /// <summary>
+        /// 设置控件的外观
+        /// </summary>
+        /// <param name="numberSpoke">条数</param>
+        /// <param name="spokeThickness">粗细</param>
+        /// <param name="innerCircleRadius">内圆半径</param>
+        /// <param name="outerCircleRadius">外圆半径</param>
+        public void SetCircleAppearance(int numberSpoke, int spokeThickness,
+            int innerCircleRadius, int outerCircleRadius)
+        {
+            NumberSpoke = numberSpoke;
+            SpokeThickness = spokeThickness;
+            InnerCircleRadius = innerCircleRadius;
+            OuterCircleRadius = outerCircleRadius;
+
+            Invalidate();
+        }
+
+        #endregion
+    }
+}

+ 221 - 0
FileWatcher/LogicHandler.cs

@@ -0,0 +1,221 @@
+using System.Collections.Generic;
+using System.Data;
+using System.Text;
+
+namespace FileWatcher
+{
+    class LogicHandler
+    {
+        public LogicHandler() { }
+
+        public static DataHelper dh = new DataHelper();
+        //用于拼接SQL
+        static StringBuilder sql = new StringBuilder();
+        //用于存放批量执行的SQL
+        static List<string> sqls = new List<string>();
+
+        public static bool CheckStepSNAndMacode(string iMakeCode, string iSourceCode, string iSN, string iUserCode, out string oMakeCode, out string oMsID, out string oErrorMessage)
+        {
+            oErrorMessage = "";
+            oMakeCode = "";
+            oMsID = "";
+            string[] param = new string[] { iMakeCode, iSourceCode, iSN, iUserCode, oMakeCode, oMsID, oErrorMessage };
+            dh.CallProcedure("CS_CHECKSTEPSNANDMACODE", ref param);
+            oMakeCode = param[4];
+            oMsID = param[5];
+            oErrorMessage = param[6];
+            if (oErrorMessage == "" || oErrorMessage == null || oErrorMessage == "null")
+                return true;
+            else
+                return false;
+        }
+
+        public static void AutoPassLog(string iSN, string iSource, string iMakeCode, string iDate, string iStepCode, string iLineCode, string iFileName, string iIFNG, string iIFAutoSN, int iMiss, string iTestPart, string iNGPart)
+        {
+            sql.Clear();
+            sql.Append("insert into AUTOSCANLOG(as_id,as_indate,as_testdate,as_sourcecode,as_stepcode,");
+            sql.Append("as_linecode,as_makecode,as_sncode,as_filename,as_ifng,as_autosn,as_realng,as_testpart,as_ngpart)values(AUTOSCANLOG_seq.nextval,");
+            sql.Append("sysdate,to_date('" + iDate + "','yyyymmddhh24miss'),'" + iSource + "','" + iStepCode + "','" + iLineCode + "','" + iMakeCode + "',");
+            sql.Append("'" + iSN + "','" + iFileName + "','" + iIFNG + "','" + iIFAutoSN + "','" + iMiss + "','" + iTestPart + "','" + iNGPart + "')");
+            dh.ExecuteSql(sql.ToString(), "select");
+        }
+
+        /// <summary>
+        /// 获取工单的最近一条执行记录
+        /// </summary>
+        /// <param name="iSnCode"></param>
+        /// <param name="oMakeCode"></param>
+        /// <param name="oErrorMessage"></param>
+        /// <returns></returns>
+        public static bool GetMakeInfo(string iSnCode, out string oMakeCode, out string oStatus, out string oErrorMessage)
+        {
+            //取MakeProcess表中的执行记录ID最大的一个工单的号码
+            oMakeCode = "";
+            oErrorMessage = "";
+            oStatus = "";
+            DataTable dt = dh.getFieldsDataByCondition("MakeSerial", new string[] { "ms_makecode", "ms_status" }, "ms_id=(select max(ms_id) from makeserial where ms_sncode='" + iSnCode + "')");
+            if (dt.Rows.Count > 0)
+            {
+                oMakeCode = dt.Rows[0]["ms_makecode"].ToString();
+                oStatus = dt.Rows[0]["ms_status"].ToString();
+            }
+            if (oMakeCode != "")
+                return true;
+            else
+            {
+                oErrorMessage = "序列号:" + iSnCode + " 未归属工单";
+                return false;
+            }
+        }
+
+        public static void AutoPassJudge(string iSN, string iMakeCode, string iSource, string iFileName, string iLineCode, string iCombine)
+        {
+            //插入不良判断记录
+            sql.Clear();
+            sql.Append("insert into AUTOSCAN_REJUDGE(asr_id,asr_indate,asr_filename,asr_combinecode,asr_sourcecode,");
+            sql.Append("asr_linecode,asr_makecode,asr_sncode) values(AUTOSCAN_REJUDGE_seq.nextval,sysdate,");
+            sql.Append("'" + iFileName + "','" + iCombine + "','" + iSource + "','" + iLineCode + "','" + iMakeCode + "','" + iSN + "')");
+            dh.ExecuteSql(sql.ToString(), "insert");
+        }
+
+        public static bool CheckUserLogin(string iUserCode, string iPassWord, out string oErrorMessage)
+        {
+            oErrorMessage = "";
+            string SQL = "select em_code from employee where upper(em_code)=:UserName and em_password =:PassWord";
+            DataTable dt;
+            dt = (DataTable)dh.ExecuteSql(SQL, "select", iUserCode.ToUpper(), iPassWord);
+            if (dt.Rows.Count > 0)
+                return true;
+            else
+            {
+                oErrorMessage = "用户名或者密码不正确!";
+                return false;
+            }
+        }
+
+        public static bool SetTestNGDetail(string iSnCode, string iMakeCode, string iUserCode, string iSourceCode, string iResult, out string oErrorMessage)
+        {
+            oErrorMessage = "";
+            string StepCode = "";
+            string StepName = "";
+            if (iResult == "" || iResult == null)
+                iResult = "检查未通过";
+            GetStepCodeAndNameBySource(iSourceCode, ref StepCode, ref StepName);
+            //更新序列号已经采集的工序 ms_paststep 已采集数据,更新下一工序
+            //如果存在送检批号则进行删除
+            if (dh.CheckExist("oqcbatchdetail", "obd_sncode='" + iSnCode + "'"))
+            {
+                string checkno = dh.getFieldDataByCondition("oqcbatchdetail", "obd_checkno", "obd_sncode='" + iSnCode + "'").ToString();
+                dh.ExecuteSql("delete from oqcbatchdetail where obd_sncode='" + iSnCode + "'", "delete");
+                dh.ExecuteSql("update oqcbatch set ob_nowcheckqty=ob_nowcheckqty-1 where ob_checkno='" + checkno + "'", "update");
+            }
+            //之前保存的不良就不再调用
+            DataTable dt = dh.getFieldsDataByCondition("makeserial", new string[] { "ms_stepcode", "nvl(ms_ifrework,0)ms_ifrework" }, "ms_sncode='" + iSnCode + "' and ms_makecode='" + iMakeCode + "'");
+            if (dt.Rows.Count > 0)
+            {
+                string ifrework = dt.Rows[0]["ms_ifrework"].ToString();
+                string ms_stepcode = dt.Rows[0]["ms_stepcode"].ToString();
+                if (ms_stepcode == StepCode)
+                {
+                    if (ifrework == "0")
+                        dh.UpdateByCondition("makeserial", "ms_status=3", "ms_sncode='" + iSnCode + "' and ms_makecode='" + iMakeCode + "'");
+                    else
+                        dh.UpdateByCondition("makeserial", "ms_reworkstatus=3", "ms_sncode='" + iSnCode + "' and ms_makecode='" + iMakeCode + "'");
+                }
+                else
+                {
+                    if (ifrework == "0")
+                        dh.UpdateByCondition("makeserial", "ms_nextstepcode='',ms_paststep = ms_paststep ||'," + StepCode + "',ms_status=3", "ms_sncode='" + iSnCode + "' and ms_makecode='" + iMakeCode + "' ");
+                    else
+                        dh.UpdateByCondition("makeserial", "ms_nextstepcode='',ms_paststep = ms_paststep ||'," + StepCode + "',ms_reworkstatus=3", "ms_sncode='" + iSnCode + "' and ms_makecode='" + iMakeCode + "'");
+                    SetStepResult(iMakeCode, iSourceCode, iSnCode, "不良采集", iResult, iUserCode, out oErrorMessage);
+                }
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 获取步骤代码和名称
+        /// </summary>
+        /// <param name="Source"></param>
+        /// <param name="StepCode"></param>
+        /// <param name="StepName"></param>
+        private static void GetStepCodeAndNameBySource(string Source, ref string StepCode, ref string StepName)
+        {
+            DataTable dt = dh.getFieldsDataByCondition("source", new string[] { "sc_stepcode", "sc_stepname", "sc_linecode" }, "sc_code='" + Source + "'");
+            if (dt.Rows.Count > 0)
+            {
+                StepCode = dt.Rows[0]["sc_stepcode"].ToString();
+                StepName = dt.Rows[0]["sc_stepname"].ToString();
+            }
+        }
+
+        public static bool CheckUserAndResourcePassed(string iUserCode, string iSourceCode, out string oErrorMessage)
+        {
+            oErrorMessage = "";
+            iUserCode = iUserCode.ToUpper();
+            iSourceCode = iSourceCode.ToUpper();
+            string SQL = "select em_code,em_type from employee where upper(em_code)=:UserName ";
+            DataTable dt;
+            dt = (DataTable)dh.ExecuteSql(SQL, "select", iUserCode);
+            if (dt.Rows.Count > 0)
+            {
+                string em_type = dt.Rows[0]["em_type"].ToString();
+                if (iSourceCode == "")
+                {
+                    oErrorMessage = "岗位资源不允许为空";
+                    return false;
+                }
+                if (em_type == "admin")
+                {
+                    if (dh.CheckExist("Source", "upper(sc_code)='" + iSourceCode + "' and sc_statuscode='AUDITED'"))
+                    {
+                        return true;
+                    }
+                    else
+                    {
+                        oErrorMessage = "岗位资源编号错误或者未审核!";
+                        return false;
+                    }
+                }
+                else
+                {
+                    dt = dh.getFieldsDatasByCondition("cs$empgroup left join cs$userresource on ur_groupcode=eg_groupcode left join source on ur_resourcecode=sc_code", new string[] { "upper(ur_resourcecode) ur_resourcecode" }, "upper(eg_emcode)= '" + iUserCode + "' and sc_statuscode='AUDITED'");
+                    //如果存在该编号
+                    if (dt.Rows.Count > 0)
+                    {
+                        //判断如果多个岗位资源存在,用户输入的只要在其中就行
+                        for (int i = 0; i < dt.Rows.Count; i++)
+                        {
+                            if (dt.Rows[i]["ur_resourcecode"].ToString() == iSourceCode)
+                                return true;
+                        }
+                        oErrorMessage = "用户不处于当前资源所属分组!";
+                    }
+                    else
+                        oErrorMessage = "岗位资源编号错误或者未审核!";
+                }
+            }
+            else
+                oErrorMessage = "用户不存在!";
+            return false;
+        }
+
+        public static bool SetStepResult(string iMakeCode, string iSourceCode, string iSN, string iMPKind, string iResult, string iUserCode, out string oErrorMessage)
+        {
+            return CS_SetResult(iMakeCode, iSourceCode, iSN, iUserCode, iResult, out oErrorMessage);
+        }
+
+        public static bool CS_SetResult(string iMakeCode, string iSourceCode, string iSN, string iUserCode, string iResult, out string oErrorMessage)
+        {
+            oErrorMessage = "";
+            string[] param = new string[] { iMakeCode, iSourceCode, iSN, iUserCode, iResult, oErrorMessage };
+            dh.CallProcedure("CS_SETSTEPRESULT", ref param);
+            oErrorMessage = param[5];
+            if (oErrorMessage == "" || oErrorMessage == null || oErrorMessage == "null")
+                return true;
+            else
+                return false;
+        }
+    }
+}

+ 1 - 1
FileWatcher/Program.cs

@@ -15,7 +15,7 @@ namespace FileWatcher
         {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
-            Application.Run(new 测试记录解析());
+            Application.Run(new 测试记录解析DCW());
         }
     }
 }

+ 86 - 0
FileWatcher/SetLoadingWindow.Designer.cs

@@ -0,0 +1,86 @@
+namespace FileWatcher
+{
+    partial class SetLoadingWindow
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetLoadingWindow));
+            this.CancelThread = new System.Windows.Forms.Button();
+            this.loadingCircle1 = new LoadingCircle();
+            this.SuspendLayout();
+            // 
+            // CancelThread
+            // 
+            this.CancelThread.Location = new System.Drawing.Point(155, 144);
+            this.CancelThread.Name = "CancelThread";
+            this.CancelThread.Size = new System.Drawing.Size(75, 26);
+            this.CancelThread.TabIndex = 1;
+            this.CancelThread.Text = "取消";
+            this.CancelThread.UseVisualStyleBackColor = true;
+            this.CancelThread.Click += new System.EventHandler(this.CancelThread_Click);
+            // 
+            // loadingCircle1
+            // 
+            this.loadingCircle1.Active = false;
+            this.loadingCircle1.Color = System.Drawing.Color.DarkGray;
+            this.loadingCircle1.InnerCircleRadius = 5;
+            this.loadingCircle1.Location = new System.Drawing.Point(141, 65);
+            this.loadingCircle1.Margin = new System.Windows.Forms.Padding(4);
+            this.loadingCircle1.Name = "loadingCircle1";
+            this.loadingCircle1.NumberSpoke = 12;
+            this.loadingCircle1.OuterCircleRadius = 11;
+            this.loadingCircle1.RotationSpeed = 100;
+            this.loadingCircle1.Size = new System.Drawing.Size(100, 62);
+            this.loadingCircle1.SpokeThickness = 2;
+            this.loadingCircle1.StylePreset = LoadingCircle.StylePresets.MacOSX;
+            this.loadingCircle1.TabIndex = 0;
+            this.loadingCircle1.Text = "loadingCircle1";
+            // 
+            // SetLoadingWindow
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(379, 198);
+            this.Controls.Add(this.CancelThread);
+            this.Controls.Add(this.loadingCircle1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.Name = "SetLoadingWindow";
+            this.Text = "SetLoadingWindow";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetLoadingWindow_FormClosing);
+            this.Load += new System.EventHandler(this.SetLoadingWindow_Load);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private LoadingCircle loadingCircle1;
+        private System.Windows.Forms.Button CancelThread;
+    }
+}

+ 60 - 0
FileWatcher/SetLoadingWindow.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace FileWatcher
+{
+    public partial class SetLoadingWindow : Form
+    {
+
+        Thread LoadingThread;
+
+        public SetLoadingWindow()
+        {
+            InitializeComponent();
+        }
+
+        public SetLoadingWindow(Thread LoadEvent, string Title)
+        {
+            InitializeComponent();
+            LoadingThread = LoadEvent;
+            Text = Title;
+        }
+
+        private void SetLoadingWindow_Load(object sender, EventArgs e)
+        {
+            //设置Loading的大小,启动传递过来的进程 
+            loadingCircle1.OuterCircleRadius = 20;
+            loadingCircle1.InnerCircleRadius = 12;
+            loadingCircle1.Active = true;
+
+            LoadingThread.Start();
+            //在本窗体新建一个进程用来判断传递的进程是否执行结束
+            Thread t1 = new Thread(SetLoadFinish);
+            t1.Start();
+        }
+
+        private void SetLoadFinish()
+        {
+            while (LoadingThread.IsAlive)
+            {
+
+            }
+            Close();
+        }
+
+        //在进程结束之前不允许此窗体被关闭
+        private void SetLoadingWindow_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            if (LoadingThread.IsAlive)
+            {
+                e.Cancel = true;
+            }
+        }
+
+        private void CancelThread_Click(object sender, EventArgs e)
+        {
+            LoadingThread.Abort();
+        }
+    }
+}

+ 1253 - 0
FileWatcher/SetLoadingWindow.resx

@@ -0,0 +1,1253 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABMLAAATCwAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA
+        AAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAABAAA
+        AAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAwAA
+        AAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAABAAAAAQAAAAEAAAABAAAAAQAA
+        AAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAIAAAADAAAAAwAAAAMAAAAEAAAABQAAAAUAAAAGAAAABwAA
+        AAgAAAAKAAAACwAAAAwAAAAMAAAADQAAAA4AAAAPAAAAEAAAABIAAAATAAAAEwAAABQAAAAVAAAAFgAA
+        ABcAAAAXAAAAGAAAABgAAAAaAAAAGgAAABsAAAAbAAAAGwAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAA
+        ABwAAAAcAAAAHAAAABwAAAAbAAAAGwAAABsAAAAaAAAAGgAAABkAAAAYAAAAGAAAABcAAAAXAAAAFgAA
+        ABYAAAAVAAAAEwAAABIAAAARAAAAEAAAAA8AAAAOAAAADQAAAAwAAAALAAAACgAAAAgAAAAIAAAABwAA
+        AAYAAAAFAAAABAAAAAQAAAADAAAAAgAAAAIAAAACAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAIAAAACgAA
+        AAsAAAAOAAAAEAAAABIAAAAVAAAAGAAAABsAAAAdAAAAIQAAACQAAAAoAAAAKgAAAC0AAAAwAAAAMwAA
+        ADYAAAA6AAAAPAAAAD4AAABBAAAAQwAAAEUAAABHAAAASQAAAEsAAABMAAAATgAAAFAAAABRAAAAUgAA
+        AFMAAABUAAAAVQAAAFUAAABVAAAAVQAAAFYAAABWAAAAVQAAAFUAAABVAAAAVQAAAFQAAABTAAAAUwAA
+        AFIAAABRAAAAUAAAAE4AAABMAAAASwAAAEoAAABJAAAARwAAAEQAAABDAAAAPwAAAD0AAAA6AAAANwAA
+        ADQAAAAxAAAALgAAACsAAAAnAAAAJAAAACEAAAAeAAAAGgAAABgAAAAVAAAAEwAAABAAAAAOAAAADAAA
+        AAkAAAAIAAAABgAAAAUAAAAEAAAAAwAAAAIAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAA
+        AAQAAAAGAAAACAAAAAoAAAANAAAAEAAAABUAAAAZAAAAHQAAACIAAAAoAAAALQAAADQAAAA5AAAAPwAA
+        AEUAAABMAAAAUgAAAFgAAABdAAAAYwAAAGgAAABtAAAAcgAAAHYAAAB6AAAAfgAAAIEAAACEAAAAhwAA
+        AIoAAACNAAAAjwAAAJEAAACSAAAAlAAAAJUAAACXAAAAmAAAAJkAAACaAAAAmgAAAJsAAACbAAAAmwAA
+        AJsAAACbAAAAmwAAAJsAAACaAAAAmgAAAJkAAACYAAAAlwAAAJYAAACVAAAAkwAAAJIAAACQAAAAjwAA
+        AI0AAACKAAAAhwAAAIUAAACBAAAAfQAAAHoAAAB1AAAAcQAAAG0AAABnAAAAYgAAAFwAAABWAAAATwAA
+        AEkAAABDAAAAPAAAADYAAAAxAAAAKgAAACUAAAAfAAAAGgAAABYAAAASAAAADwAAAAwAAAAJAAAABwAA
+        AAUAAAAEAAAAAwAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAGAAAACAAAAAsAAAAPAAAAFAAAABkAAAAfAAAAJQAA
+        AC0AAAA0AAAAPQAAAEUAAABPAAAAVwAAAGAAAABrAAAAdwICAoMEBASLBQUFkgQEBJgEBASeBAQEogQE
+        BKcEBASsBAQErwQEBLMEBAS2BAQEuAQEBLsEBAS9AwMDvwMDA8EDAwPDAwMDxAMDA8UDAwPGAwMDxwMD
+        A8gDAwPJAwMDyQMDA8oDAwPKAwMDywMDA8sDAwPLAwMDywMDA8sDAwPLAwMDywMDA8sDAwPKAwMDygMD
+        A8kDAwPJAwMDyAMDA8cDAwPGAwMDxgMDA8UDAwPEAwMDwgMDA8ADAwO+BAQEvAQEBLoEBAS3BAQEtAQE
+        BLAEBAStBAQEqQQEBKQEBASfBAQEmQUFBZMEBASLAwMDggAAAHcAAABqAAAAXgAAAFYAAABMAAAAQwAA
+        ADoAAAAyAAAAKgAAACIAAAAdAAAAGAAAABIAAAAOAAAACwAAAAcAAAAFAAAAAwAAAAMAAAABAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABQAA
+        AAgAAAAMAAAAEAAAABUAAAAcAAAAIwAAACsAAAAzAAAAPgAAAEkAAABUAAAAXgAAAGwKCgqFJiYmp0FB
+        QcVUVFTZX19f5WRkZOtmZmbtZmZm7mVlZe9lZWXwZWVl8WRkZPJkZGTzZGRk82RkZPRjY2P0Y2Nj9GNj
+        Y/VjY2P1Y2Nj9WNjY/ZjY2P2Y2Nj9mNjY/ZjY2P2YmJi92JiYvdiYmL3YmJi92JiYvdiYmL3YmJi92Ji
+        YvdiYmL3YmJi92JiYvdiYmL3YmJi92JiYvdiYmL3YmJi92JiYvdiYmL2YmJi9mJiYvZiYmL2Y2Nj9mNj
+        Y/ZjY2P2Y2Nj9mNjY/VjY2P1Y2Nj9WNjY/RkZGTzZGRk82RkZPJkZGTyZWVl8WVlZfBmZmbvZmZm7mVl
+        ZethYWHmV1dX20ZGRsgsLCyrDw8PiQAAAGwAAABdAAAAUgAAAEcAAAA8AAAAMgAAACkAAAAiAAAAGwAA
+        ABUAAAAPAAAACwAAAAcAAAAFAAAABAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAQAAAAGAAAACQAAAAwAAAARAAAAFgAAAB0AAAAmAAAALwAA
+        ADkAAABEAAAATgAAAFwVFRWDRUVFvWlpaeh9fX37hYWF/4eHh/+IiIj/iYmJ/4mJif+Kior/ioqK/4qK
+        iv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qK
+        iv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qK
+        iv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/ioqK/4qK
+        iv+Kior/ioqK/4qKiv+Kior/ioqK/4qKiv+Kior/iYmJ/4mJif+IiIj/hYWF/39/f/xubm7tTk5Oxh8f
+        H4sAAABfAAAATgAAAEMAAAA5AAAALwAAACYAAAAeAAAAFwAAABEAAAAMAAAACQAAAAUAAAADAAAAAgAA
+        AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAA
+        AAQAAAAGAAAACQAAAA0AAAARAAAAFwAAAB0AAAAlAAAALQAAADUHBwdQRUVFoXJycumEhIT/iYmJ/4qK
+        iv+Li4v/jY2N/46Ojv+Pj4//kJCQ/5CQkP+QkJD/kJCQ/5CQkP+RkZH/kZGR/5GRkf+RkZH/kZGR/5GR
+        kf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GR
+        kf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GR
+        kf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5GRkf+RkZH/kZGR/5CQkP+QkJD/kJCQ/5CQ
+        kP+Pj4//jo6O/42Njf+Li4v/ioqK/4mJif+Ghob/d3d38E9PT7ESEhJdAAAAOQAAADEAAAAnAAAAIAAA
+        ABkAAAATAAAADgAAAAoAAAAHAAAABAAAAAMAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABgAAAAkAAAAMAAAAEAAA
+        ABQAAAAYIyMjQmVlZbiDg4P7ioqK/4uLi/+Ojo7/kZGR/5SUlP+Xl5f/mJiY/5qamv+bm5v/nJyc/5yc
+        nP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc
+        nP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc
+        nP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc
+        nP+cnJz/nJyc/5ycnP+cnJz/nJyc/5ycnP+cnJz/m5ub/5qamv+ZmZn/l5eX/5WVlf+SkpL/j4+P/4yM
+        jP+Kior/hYWF/21tbc0yMjJZAAAAHQAAABgAAAAUAAAADwAAAAsAAAAIAAAABgAAAAQAAAADAAAAAgAA
+        AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAQBAQEFAAAABTs7OzZ0dHTDiIiI/4yMjP+Pj4//k5OT/5iY
+        mP+cnJz/oKCg/6Kiov+lpaX/pqam/6enp/+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io
+        qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io
+        qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io
+        qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io
+        qP+np6f/pqam/6Wlpf+jo6P/oKCg/52dnf+ZmZn/lJSU/5CQkP+MjIz/iYmJ/3p6etpJSUlPAAAACgEB
+        AQgAAAAGAAAABAAAAAMAAAACAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAe7u
+        7gA+Pj4ieHh4vYqKiv+Ojo7/kpKS/5iYmP+dnZ3/o6Oj/6enp/+rq6v/ra2t/6+vr/+xsbH/sbGx/7Ky
+        sv+ysrL/srKy/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Oz
+        s/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Oz
+        s/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Oz
+        s/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Kysv+ysrL/srKy/7Kysv+xsbH/sLCw/66urv+rq6v/qKio/6Sk
+        pP+fn5//mZmZ/5OTk/+Ojo7/i4uL/319fdZOTk47////AAQEBAEAAAABAAAAAQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAA6OjoAGhoaC3R0dJuLi4v/j4+P/5SUlP+bm5v/oqKi/6io
+        qP+tra3/sbGx/7S0tP+3t7f/uLi4/7m5uf+6urr/urq6/7q6uv+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+        u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+        u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+        u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6
+        uv+6urr/urq6/7m5uf+4uLj/t7e3/7W1tf+ysrL/rq6u/6mpqf+jo6P/nJyc/5aWlv+QkJD/jY2N/3x8
+        fL5AQEAcXV1dACkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        /wBqampdioqK9ZGRkf+Wlpb/nJyc/6SkpP+rq6v/sbGx/7a2tv+6urr/vLy8/76+vv+/v7//wMDA/8DA
+        wP/AwMD/wMDA/8DAwP/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB
+        wf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB
+        wf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB
+        wf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/AwMD/wMDA/8DAwP/AwMD/wMDA/7+/v/++vr7/vLy8/7q6
+        uv+3t7f/srKy/6ysrP+lpaX/np6e/5eXl/+SkpL/jY2N/nNzc4MAAAADGBgYAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREQBXV1cASUlJGYWFhceTk5P/l5eX/52dnf+lpaX/ra2t/7S0
+        tP+5ubn/vb29/8DAwP/CwsL/w8PD/8PDw//ExMT/xMTE/8TExP/ExMT/xcXF/8XFxf/FxcX/xcXF/8XF
+        xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF
+        xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF
+        xf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XF
+        xf/ExMT/xMTE/8TExP/ExMT/xMTE/8PDw//CwsL/wMDA/76+vv+6urr/tbW1/66urv+np6f/n5+f/5iY
+        mP+Tk5P/ioqK4l5eXjJ4eHgA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMnJ
+        yQB2dnZgkpKS+piYmP+dnZ3/paWl/62trf+1tbX/u7u7/8DAwP/Dw8P/xMTE/8XFxf/Gxsb/xsbG/8fH
+        x//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fH
+        x//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fH
+        x//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fH
+        x//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Gxsb/xsbG/8XF
+        xf/ExMT/w8PD/8DAwP+8vLz/tra2/6+vr/+np6f/n5+f/5iYmP+VlZX/fn5+iQAAAAEXFxcAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDwAJiYmCYqKiq6ampr/np6e/6SkpP+tra3/tbW1/7u7
+        u//BwcH/xMTE/8bGxv/Hx8f/yMjI/8jIyP/IyMj/yMjI/8fHx//Hx8f/wMDA/7m5uf+3t7f/v7+//8bG
+        xv/Hx8f/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI
+        yP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI
+        yP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI
+        yP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8fHx//Gxsb/xMTE/8HBwf+8vLz/tra2/66u
+        rv+mpqb/n5+f/5ubm/+Pj4/SWlpaG2FhYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZ2
+        dgBsbGwpl5eX4p+fn/+kpKT/q6ur/7Ozs/+7u7v/wcHB/8XFxf/Hx8f/yMjI/8nJyf/Jycn/ycnJ/8nJ
+        yf/Hx8f/srKy/4KCgv9VVVX/Pz8//z09Pf9QUFD/goKC/7a2tv/Hx8f/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+        yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+        yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+        yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+        yf/Jycn/ycnJ/8jIyP/Hx8f/xcXF/8HBwf+8vLz/tbW1/62trf+lpaX/oKCg/5qamvV7e3tKmZmZAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkAISEhFCgoKD5paWl/6qqqv+ysrL/ubm5/8DA
+        wP/FxcX/yMjI/8nJyf/Kysr/y8vL/8vLy//Kysr/yMjI/5qamv8+Pj7/Ghoa/xYWFv8WFhb/FhYW/xYW
+        Fv8cHBz/RERE/5aWlv/FxcX/ysrK/8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rK
+        yv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rK
+        yv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rK
+        yv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Kysr/ysrK/8rKyv/Ly8v/ysrK/8nJyf/IyMj/xcXF/8HB
+        wf+7u7v/s7Oz/6ysrP+mpqb/oqKi/42NjXr///8ABwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADd3d0AkZGRdKenp/+rq6v/sbGx/7i4uP++vr7/xMTE/8jIyP/Kysr/zMzM/8zMzP/MzMz/zMzM/8vL
+        y/+ioqL/MTEx/xYWFf8ZGRn/GRkZ/xkZGf8ZGRn/GRkZ/xkZGf8XFxb/LCws/52dnf/Ly8v/zMzM/8zM
+        zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM
+        zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM
+        zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM
+        zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8rKyv/Jycn/xcXF/8DAwP+5ubn/srKy/6ysrP+oqKj/mJiYngAA
+        AAI3NzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAP///wCdnZ2HrKys/7CwsP+2trb/vLy8/8PD
+        w//IyMj/y8vL/8zMzP/Nzc3/zs7O/87Ozv/Nzc3/t7e3/0RERP8VFRX/Ghoa/xoaGv8aGhr/Ghoa/xoa
+        Gv8aGhr/Ghoa/xoaGv8YGBf/UVFQ/729vv/Nzc3/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O
+        zv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O
+        zv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O
+        zv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Nzc3/zc3N/8vL
+        y//IyMj/xMTE/76+vv+3t7f/sbGx/62trf+goKCzPj4+B0xMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAsLCwA////AKOjo5CxsbH/tbW1/7q6uv/AwMD/xsbG/8rKyv/Nzc3/zs7O/8/Pz//Pz8//z8/P/83N
+        zf95eXn/ExMT/xgYGP8aGhr/Ghoa/xoaGv8aGhr/Ghoa/xoaGv8aGhr/Ghoa/xoaGv8eHh7/fHx8/8rK
+        yv/Ozs7/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/P
+        z//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/P
+        z//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/P
+        z//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Ozs7/zc3N/8vLy//Hx8f/wsLC/7y8vP+2trb/srKy/6en
+        p7lUVFQIVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwD///8ApqamkbW1tf+5ubn/vr6+/8TE
+        xP/IyMj/zMzM/8/Pz//Q0ND/0NDQ/9DQ0P/Q0ND/yMjI/0xMTP8ODg7/GRkZ/xsbG/8bGxv/Gxsb/xsb
+        G/8bGxv/Gxsb/xsbG/8bGxv/Gxsb/xoaGf8vLy7/oqKi/8/Pz//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ
+        0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ
+        0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ
+        0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ
+        0P/Pz8//zc3N/8nJyf/FxcX/v7+//7q6uv+2trb/q6uruVdXVwhXV1cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAMzMzAP///wCpqamRuLi4/7y8vP/BwcH/xsbG/8vLy//Pz8//0NDQ/9LS0v/S0tL/0tLS/9LS
+        0v/IyMj/RUVF/wsLC/8XFxf/Gxsb/xwcHP8cHBz/HBwb/xwcHP8cHBz/HBwc/xwcHP8cHBz/HBwc/xoa
+        Gf9NTU3/vr2+/9HR0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS
+        0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS
+        0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS
+        0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9HR0f/Pz8//zMzM/8fHx//CwsL/vb29/7m5
+        uf+urq65WFhYCFlZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQA////AKurq5G7u7v/vr6+/8PD
+        w//IyMj/zc3N/9DQ0P/S0tL/09PT/9PT0//T09P/09PT/9DQ0P9paWn/CQkJ/xISEv8ZGRn/HBwc/x0c
+        HP8dHBz/HRwc/x0cHP8dHBz/HRwc/x0cHP8dHBz/HBwc/x4eHf90c3P/zMzM/9PT0//T09P/09PT/9PT
+        0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT
+        0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT
+        0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT
+        0//T09P/0tLS/9HR0f/Ozs7/ycnJ/8TExP+/v7//vLy8/7CwsLlZWVkIWlpaAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAADU1NQD///8Arq6ukb29vf/AwMD/xcXF/8rKyv/Ozs7/0tLS/9TU1P/V1dX/1dXV/9XV
+        1f/V1dX/1NTU/7Ozs/8vLy//CgoK/xQUFP8bGxr/HR0d/x0dHf8dHR3/HR0d/x0dHf8dHR3/HR0d/x0d
+        Hf8dHR3/HBwc/yoqKf+YmJj/0tLS/9TU1P/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV
+        1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV
+        1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV
+        1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/U1NT/0tLS/8/Pz//Ly8v/xsbG/8HB
+        wf++vr7/srKyuVtbWwhbW1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1AP///wCvr6+Rv7+//8LC
+        wv/Hx8f/zMzM/9DQ0P/T09P/1dXV/9bW1v/W1tb/1tbW/9bW1v/W1tb/1NTU/5iYmP8cHBz/DAwM/xYW
+        Fv8cHBz/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/HBwc/0FBQP+2trb/1dXV/9bW
+        1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW
+        1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW
+        1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW1v/W1tb/1tbW/9bW
+        1v/W1tb/1tbW/9XV1f/U1NT/0dHR/83Nzf/IyMj/w8PD/7+/v/+0tLS5W1tbCFxcXAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAA1NTUA////ALCwsJHAwMD/xMTE/8nJyf/Nzc3/0tLS/9XV1f/X19f/2NjY/9jY
+        2P/Y2Nj/2NjY/9jY2P/X19f/09PT/4CAgP8SEhL/Dw8P/xgYGP8dHR3/Hx8f/x8fH/8fHx7/Hx8f/x8f
+        H/8fHx//Hx8f/x8fH/8fHx7/Hh0d/2JiYv/Kysr/19fX/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY
+        2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY
+        2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY
+        2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9jY2P/Y2Nj/19fX/9XV1f/S0tL/zs7O/8nJ
+        yf/ExMT/wcHB/7W1tblcXFwIXV1dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NgD///8AsbGxkcHB
+        wf/FxcX/ysrK/8/Pz//T09P/1tbW/9jY2P/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/zs7O/2ho
+        aP8NDQ3/ERER/xoaGv8fHh7/IB8f/yAgH/8gHx//ICAf/yAgH/8gIB//ICAf/yAgH/8fHx//JSQk/4iI
+        iP/U1NT/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ
+        2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ
+        2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ
+        2f/Z2dn/2dnZ/9nZ2f/Y2Nj/19fX/9TU1P/Q0ND/y8vL/8bGxv/CwsL/tra2uVxcXAhdXV0AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAANjY2AP///wCzs7ORw8PD/8bGxv/Ly8v/0NDQ/9XV1f/Y2Nj/2tra/9vb
+        2//b29v/29vb/9vb2//b29v/29vb/9vb2//a2tr/yMjI/1JSUv8LCwv/ExMT/xwbG/8gIB//ISAg/yEg
+        IP8hICD/ISAg/yEgIP8hICD/ISAg/yEgIP8fHx//NTU1/6urq//Z2dn/29vb/9vb2//b29v/29vb/9vb
+        2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb
+        2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb
+        2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9ra2v/Y2Nj/1dXV/9HR
+        0f/MzMz/x8fH/8TExP+4uLi5XV1dCF5eXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjYA////ALS0
+        tJHExMT/yMjI/83Nzf/S0tL/1tbW/9nZ2f/b29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc
+        3P/b29v/vb29/z4+Pv8LCwv/FhUV/x4dHf8hISD/IiEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yIh
+        If8fHx//UVFR/8XFxf/b29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc
+        3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc
+        3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc
+        3P/c3Nz/3Nzc/9zc3P/c3Nz/29vb/9ra2v/X19f/09PT/83Nzf/IyMj/xcXF/7m5ubleXl4IXl5eAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NwD///8AtbW1kcXFxf/Jycn/zs7O/9PT0//X19f/29vb/9zc
+        3P/d3d3/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/93d3f/c3Nz/r6+v/ywsLP8MDAz/GBcX/x8f
+        H/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8jIyL/dnZ2/9TU1P/d3d3/3t7e/97e
+        3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e
+        3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e
+        3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/d3d3/29vb/9jY
+        2P/U1NT/z8/P/8rKyv/Gxsb/urq6uV5eXghfX18AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzc3AP//
+        /wC3t7eRx8fH/8rKyv/Pz8//1NTU/9nZ2f/c3Nz/3t7e/9/f3//f39//39/f/9/f3//f39//39/f/9/f
+        3//f39//39/f/9/f3//c3Nz/nZ2d/x8fH/8PDg7/GhoZ/yEhIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj
+        I/8jIyP/IyMj/yIiIv8uLS3/nJyc/9zc3P/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f
+        3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f
+        3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f
+        3//f39//39/f/9/f3//f39//39/f/97e3v/d3d3/2tra/9bW1v/Q0ND/y8vL/8fHx/+8vLy5Xl5eCF9f
+        XwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgA////ALi4uJHIyMj/zMzM/9HR0f/W1tb/2tra/93d
+        3f/f39//4ODg/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Dg4P/h4eH/4eHh/+Dg4P/b29v/iYmJ/xYW
+        Ff8RERH/HBwb/yIiIv8kJCP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yIiIv9DQ0P/vLy8/9/f
+        3//g4OD/4eHh/+Dg4P/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh
+        4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh
+        4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/g4OD/4ODg/97e
+        3v/b29v/19fX/9LS0v/MzMz/ycnJ/729vblfX18IYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4
+        OAD///8AuLi4kcnJyf/Nzc3/0tLS/9fX1//c3Nz/39/f/+Hh4f/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li
+        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Hh4f/Y2Nj/c3Nz/xAQEP8TExP/Hh4d/yQkI/8lJSX/JSUl/yUl
+        JP8lJSX/JSUl/yUlJf8lJSX/JSUk/yQjI/9jY2L/0dHR/+Hh4f/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li
+        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li
+        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li
+        4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/h4eH/39/f/9zc3P/Y2Nj/09PT/87Ozv/Kysr/vb29uV9f
+        XwhgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4AP///wC6urqRysrK/87Ozv/T09P/2NjY/93d
+        3f/g4OD/4uLi/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li
+        4v/S0tL/XV1d/w0NDf8WFhb/ICAg/yUlJf8mJib/JiYm/yYmJf8mJib/JiYm/yYmJv8mJib/JiYl/ykp
+        KP+Hh4f/3Nzc/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li
+        4v/h4eH/3t7e/9nZ2f/U1NT/z8/P/8vLy/++vr65YGBgCGFhYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAA4ODgA////ALu7u5HMzMz/z8/P/9TU1P/Z2dn/3t7e/+Hh4f/j4+P/5OTk/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/Jycn/SEhI/w0NDf8ZGBj/IiIi/ycm
+        Jv8nJyf/Jycn/ycnJv8nJyf/Jycn/ycnJ/8nJyf/JiYl/zc3Nv+rq6r/4uLi/+Tk5P/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/k5OT/5OTk/+Li4v/f39//29vb/9XV1f/Q0ND/zMzM/8DA
+        wLlhYWEIYmJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQD///8AvLy8kc3Nzf/Q0ND/1tbW/9vb
+        2//f39//4uLi/+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+Tk5P+8vLz/NjY2/w4ODv8bGxr/JCQk/ygoJ/8oKCj/KCgo/ygoJ/8oKCj/KCgo/ygo
+        KP8oKCj/JiYl/09PTv/Hx8f/5eXl/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/l5eX/4+Pj/+Dg4P/c3Nz/1tbW/9HR0f/Ozs7/wcHBuWFhYQhiYmIAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAOTk5AP///wC9vb2Rzs7O/9HR0f/X19f/3Nzc/+Hh4f/k5OT/5ubm/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5ubm/+Xl5f+srKz/Jycn/xAQ
+        EP8dHR3/JiYl/ykpKP8pKSn/KSko/ykpKf8pKSn/KSkp/ykpKf8pKSj/KCgn/3Bvb//Z2dn/5ubm/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+bm5v/k5OT/4eHh/93d3f/Y2Nj/0tLS/8/P
+        z//CwsK5YmJiCGNjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OjoA////AL6+vpHPz8//0tLS/9jY
+        2P/d3d3/4uLi/+Xl5f/n5+f/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/5+fn/+Tk5P+YmJj/HBwc/xMTE/8gIB//KCgn/yoqKf8rKir/Kyop/ysq
+        Kv8rKir/Kyoq/ysqKv8qKin/MDAv/5WVlf/j4+P/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/5+fn/+Xl5f/i4uL/3t7e/9nZ2f/T09P/z8/P/8PDw7ljY2MIY2NjAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAADo6OgD///8Av7+/kc/Pz//T09P/2dnZ/97e3v/j4+P/5ubm/+jo6P/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+Hh
+        4f+CgoL/FBQU/xYWFf8iIiL/Kikp/ysrKv8sKyv/Kysq/ysrK/8rKyv/Kysr/ywrK/8qKin/QEA//7e3
+        tv/n5+f/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/o6Oj/5ubm/+Pj4//f39//2tra/9TU
+        1P/Q0ND/xMTEuWNjYwhkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjo6AP///wC/v7+R0NDQ/9XV
+        1f/a2tr/39/f/+Tk5P/n5+f/6enp/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6enp/9zc3P9ra2v/ERAQ/xkZGP8lJST/Kysq/y0s
+        LP8tLCz/LSwr/y0sK/8tLCv/LSwr/y0sLP8qKin/Wlpa/9DQ0P/p6en/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+np6f/n5+f/5OTk/+Dg4P/b29v/1dXV/9HR0f/ExMS5Y2NjCGRkZAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAA6OjoA////AMDAwJHR0dH/1dXV/9ra2v/g4OD/5OTk/+jo6P/q6ur/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6urq/9TU1P9VVVX/Dw8P/xwbG/8nJyb/LSws/y4tLf8uLS3/Li0t/y4tLf8uLS3/Li0t/y4t
+        LP8uLS3/fn19/+Dg4P/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+jo6P/l5eX/4eHh/9vb
+        2//W1tb/0tLS/8XFxblkZGQIZGRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OgD///8AwcHBkdLS
+        0v/W1tb/29vb/+Hh4f/l5eX/6enp/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/8jIyP9BQUH/EBAQ/x4e
+        Hv8pKSj/Li4t/y8vLv8vLy7/Ly4u/y8vLv8vLy7/Ly8u/y4uLf83Nzb/oaGh/+jo6P/r6+v/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/r6+v/6enp/+bm5v/i4uL/3Nzc/9fX1//T09P/xsbGuWRkZAhlZWUAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAOjo6AP///wDBwcGR09PT/9fX1//c3Nz/4eHh/+bm5v/p6en/7Ozs/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/s7Oz/6+vr/7m5uf8wMDD/EhIS/yEhIP8sKyr/MC8u/zAwL/8wMC//MDAv/zAw
+        L/8wMC//MDAv/y4uLf9JSUj/wMDA/+vr6//t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/q6ur/5+fn/+Pj
+        4//d3d3/2NjY/9TU1P/Hx8e5ZWVlCGVlZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsA////AMLC
+        wpHU1NT/2NjY/93d3f/i4uL/5+fn/+rq6v/s7Oz/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/6urq/6am
+        pv8jIyP/FRUU/yQkI/8uLS3/MTEw/zExMP8xMTD/MTEw/zExMP8xMTD/MTEw/y8vLv9lZWT/19fX/+zs
+        7P/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+vr6//n5+f/4+Pj/97e3v/Y2Nj/1NTU/8fHx7llZWUIZmZmAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwD///8Aw8PDkdTU1P/Y2Nj/3d3d/+Pj4//n5+f/6+vr/+3t
+        7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/6Ojo/5GRkP8aGhr/GBgX/ycmJv8wLy7/MjIx/zIy
+        Mf8yMjH/MjIx/zIyMf8yMjH/MjEx/zMzMv+IiIf/5eXl/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/6+vr/+jo
+        6P/k5OT/3t7e/9nZ2f/V1dX/yMjIuWVlZQhmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7AP//
+        /wDDw8OR1NTU/9jY2P/d3d3/4+Pj/+fn5//r6+v/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/t7e3/4+Pj/3p6ev8VFBT/Gxsa/yopKP8yMTD/MzMy/zMzMv8zMzL/MzMy/zMzMv8zMzL/MjIx/z8+
+        Pf+vr6//6+vr/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/r6+v/6urq/+zs7P/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/r6+v/6Ojo/+Tk5P/e3t7/2dnZ/9XV1f/IyMi5ZWVlCGZm
+        ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsA////AMPDw5HU1NT/2NjY/93d3f/j4+P/5+fn/+vr
+        6//t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/3Nzc/2NjY/8SEhL/Hh4d/yws
+        K/8zMzL/NTQz/zU0M/80NDP/NTQz/zU0M/81NDP/MjIx/1lZWP/Q0ND/7e3t/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+zs7P/d3d3/r6+v/4yM
+        i/+Dg4P/o6Oi/9fX1//r6+v/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+vr
+        6//o6Oj/5OTk/97e3v/Z2dn/1dXV/8jIyLllZWUIZmZmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7
+        OwD///8Aw8PDkdTU1P/Y2Nj/3d3d/+Pj4//n5+f/6+vr/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/t7e3/0tLS/05OTv8SEhL/ISEg/y8uLf81NDP/NjU0/zY1NP82NTT/NjU0/zY1
+        NP81NTT/NTUz/4GAgP/j4+P/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/s7Oz/z8/P/3FxcP85OTj/MzMy/zMyMf84Nzb/YGBf/7a2tv/o6Oj/7e3t/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/6+vr/+jo6P/k5OT/3t7e/9nZ2f/V1dX/yMjIuWVl
+        ZQhmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7AP///wDDw8OR1NTU/9jY2P/d3d3/4+Pj/+fn
+        5//r6+v/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/t7e3/xMTE/zw7
+        O/8UFBP/JCQj/zExMP82NjX/NzY1/zc2Nf83NjX/NzY1/zc2Nf82NTT/QD8+/6urqv/q6uv/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/6+vr/8TExP9dXVz/NDMy/zY2
+        NP83NjX/NzY1/zY2Nf80NDP/SEhH/6Sko//l5eX/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t
+        7f/r6+v/6Ojo/+Tk5P/e3t7/2dnZ/9XV1f/IyMi5ZWVlCGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAA7OzsA////AMPDw5HU1NT/2NjY/93d3f/j4+P/5+fn/+vr6//t7e3/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/s7Oz/s7Oz/y0sLP8WFhb/Jycm/zMzMv83Nzb/ODc2/zg3
+        Nv84Nzb/ODc2/zg3Nv82NTT/WFdW/83Nzf/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+3t7f/FxcX/T09O/zEwMP84Nzb/ODc2/zg3Nv84Nzb/ODc2/zg3Nv82NjX/QkFA/5SU
+        lP/i4uL/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+vr6//o6Oj/5OTk/97e3v/Z2dn/1dXV/8jI
+        yLllZWUIZmZmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwD///8Aw8PDkdTU1P/Y2Nj/3d3d/+Pj
+        4//n5+f/6+vr/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t
+        7f/q6ur/n5+f/yEhIf8aGRn/Kyop/zU1NP85ODf/OTg3/zk4N/85ODf/OTg3/zk4N/84Nzb/fX18/+Hh
+        4f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/6urq/3p6ev8jIiH/NTU0/zk5
+        N/85ODf/OTg3/zk4N/85ODf/OTg3/zk4N/84Nzb/Pz89/5+fnv/p6en/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/t7e3/6+vr/+jo6P/k5OT/3t7e/9nZ2f/V1dX/yMjIuWVlZQhmZmYAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAOzs7AP///wDDw8OR1NTU/9jY2P/d3d3/4+Pj/+fn5//r6+v/7e3t/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/n5+f/iYmJ/xoaGf8dHRz/Li0s/zc3
+        Nv86OTj/Ojo4/zo5OP86Ojj/Ojo4/zo5OP9BQD//pqam/+rq6v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/m5ub/ZmZm/yQjIv82NjT/Ojk4/zo6OP86Ojj/Ojo4/zo6OP86Ojj/Ojo4/zo6
+        OP84ODb/UlJR/8rKyv/t7e3/7u7u/+7u7v/u7u7/7u7u/+3t7f/r6+v/6Ojo/+Tk5P/e3t7/2dnZ/9XV
+        1f/IyMi5ZWVlCGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsA////AMPDw5HU1NT/2NjY/93d
+        3f/j4+P/5+fn/+vr6//t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+3t7f/h4eH/cnJy/xYWFf8gIB//MTAv/zk5OP87Ozn/Ozs5/zs7Of87Ozn/Ozs5/zo5
+        OP9XVlX/ysnJ/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+bm5v9qaWn/Kikp/zk4
+        N/87Ozn/Ozs5/zs7Of87Ozn/Ozs5/zs7Of87Ozn/Ozs5/zs6Of86OTj/i4qK/+fn5//u7u7/7u7u/+7u
+        7v/u7u7/7e3t/+vr6//o6Oj/5OTk/97e3v/Z2dn/1dXV/8jIyLllZWUIZmZmAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAADs7OwD///8Aw8PDkdTU1P/Y2Nj/3d3d/+Pj4//n5+f/6urq/+3t7f/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/Z2dn/XFxc/xUV
+        FP8kJCP/MzMy/zs6Of88PDv/PDw7/zw8O/88PDv/PDw6/zs6Of96eXj/39/f/+3t7f/u7u7/7u7u/+7u
+        7v/u7u7/7u7u/+7u7v/t7e3/4+Pj/35+ff82NTT/PDs6/zw8O/88PDv/PDw7/zw8O/88PDv/PDw7/zw8
+        O/88PDv/PDw7/zs6Of9TUlH/zc3M/+3t7f/u7u7/7u7u/+7u7v/t7e3/6+vr/+jo6P/k5OT/3t7e/9jY
+        2P/V1dX/yMjIuWVlZQhmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7AP///wDCwsKR09PT/9fX
+        1//c3Nz/4uLi/+bm5v/q6ur/7Ozs/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/NzMz/SEhI/xYVFf8nJyb/NjU0/z08O/8+PTz/Pj08/z49
+        O/8+PTz/PTw7/0JCQP+hoaH/5+fn/+Xl5f/Nzc3/vLy8/8vLy//h4eH/6urq/+Df3/+Yl5f/SEhH/zw8
+        Ov8+PTz/Pj08/z49O/8+PTz/Pj08/z49PP8+PTz/Pj08/z49O/8+PTz/PT07/z08O/+qqan/7e3t/+3t
+        7f/t7e3/7e3t/+zs7P/q6ur/5+fn/+Pj4//d3d3/2NjY/9TU1P/Hx8e5ZWVlCGVlZQAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAA6OjoA////AMLCwpHT09P/19fX/9zc3P/i4uL/5ubm/+rq6v/s7Oz/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+vr
+        6/++vr7/Nzc3/xgYF/8rKin/ODg3/z49PP8/Pj3/Pj48/z4+PP8/Pj3/PTw7/1ZWVP+rq6r/hoaF/1NT
+        Uv9GRkT/UVBP/3Z1df+urq7/hYWE/0JCQP89PDv/Pz49/z8+Pf8+Pjz/Pj49/z4+PP8/Pj3/Pz49/z8+
+        Pf8/Pj3/Pz49/z4+PP88Ozr/PDs6/7Gxsf/t7e3/7e3t/+3t7f/t7e3/7Ozs/+rq6v/n5+f/4+Pj/93d
+        3f/Y2Nj/1NTU/8fHx7llZWUIZWVlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OgD///8AwcHBkdPT
+        0//X19f/3Nzc/+Hh4f/m5ub/6enp/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t
+        7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7Ozs/+rq6v+rq6v/Kiop/xsbGv8uLSz/Ozo5/z8/
+        Pf9APz7/QD89/0A/Pv9APz3/QD8+/0dHRf8/Pj3/Pj48/z8+Pf8+Pjz/Pj07/0VFQ/9BQD//Pz49/0A/
+        Pv9APz3/QD89/0A/Pf9APz3/QD8+/0A/Pv8/Pz3/Pz89/z8/Pf8/Pz3/PT07/zIyMP9lZWT/29vb/+zs
+        7P/t7e3/7e3t/+3t7f/s7Oz/6urq/+fn5//j4+P/3d3d/9jY2P/U1NT/x8fHuWVlZQhlZWUAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAOjo6AP///wDBwcGR0tLS/9bW1v/b29v/4eHh/+Xl5f/p6en/6+vr/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/6+vr/+fn5/+Xlpb/ICAg/x4eHf8xMTD/PTw7/0FAPv9BQD//QUA+/0FAP/9BQD7/QD8+/0FA
+        Pv9BQD//QUA+/0FAP/9BQD7/QEA+/0FAPv9BQD//QUA+/0FAP/9BQD//QUA+/0FAP/9BQD7/Pz49/zw7
+        Ov86OTj/Ozo5/zo5OP8xMC//UVFQ/8PDw//q6ur/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//p6en/5ubm/+Li
+        4v/c3Nz/19fX/9PT0//Gxsa5ZGRkCGVlZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OjoA////AMHB
+        wZHS0tL/1tbW/9vb2//h4eH/5eXl/+jo6P/r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+Pj4/+BgID/Ghoa/yIi
+        If80NDP/Pz49/0JBP/9CQUD/QkE//0JBQP9CQUD/QkFA/0JBQP9CQUD/QkFA/0JBQP9CQUD/QkFA/0JB
+        QP9CQUD/QkFA/0JBQP9CQUD/QkE//z8+Pf81NDP/KSgn/yUkJP8nJiX/JiYl/1JSUf/BwcD/6urq/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+np6f/m5ub/4uLi/9zc3P/X19f/09PT/8bGxrlkZGQIZWVlAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OgD///8AwMDAkdHR0f/V1dX/2tra/+Dg4P/k5OT/6Ojo/+rq
+        6v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6urq/9zc3P9qamr/GBcX/yYmJf85ODf/QkE//0NCQf9DQkH/Q0JB/0NC
+        Qf9DQkH/Q0JB/0NCQf9DQkH/Q0JB/0NCQf9DQkH/Q0JB/0NCQf9DQkH/Q0JB/0NCQf9CQUD/PDs6/0RD
+        Qv9ISEf/MjIy/ygnJ/9iYmL/ycnJ/+np6f/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/6Ojo/+Xl
+        5f/h4eH/29vb/9bW1v/S0tL/xcXFuWRkZAhkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjo6AP//
+        /wDAwMCR0dHR/9XV1f/a2tr/4ODg/+Tk5P/n5+f/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/9LS
+        0v9WVlb/Hx4e/zU0M/9CQT//RENC/0RDQv9EQ0L/RENC/0RDQv9EQ0L/RENC/0RDQv9EQ0L/RENC/0RD
+        Qv9EQ0L/RENC/0RDQv9EQ0L/RENB/0ZFRP94eHf/w8PD/9bW1v/Jycn/vr6+/9vb2//q6ur/6+vr/+vr
+        6//r6+v/6+vr/+vr6//r6+v/6+vr/+rq6v/o6Oj/5eXl/+Hh4f/b29v/1tbW/9LS0v/FxcW5ZGRkCGRk
+        ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OjoA////AL+/v5HQ0ND/1NTU/9ra2v/f39//4+Pj/+fn
+        5//p6en/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6Ojo/8TExP9QUE//OTk3/0RDQf9FREP/RURC/0VE
+        Qv9FREL/RURC/0VEQv9FREL/RURC/0VEQv9FREL/RURC/0VEQv9FREL/RURC/0VEQv9EQ0L/Tk1M/6en
+        pv/j4+P/6enp/+rq6v/r6+v/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6enp/+fn
+        5//k5OT/4ODg/9ra2v/V1dX/0dHR/8TExLljY2MIZGRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6
+        OgD///8Av7+/kdDQ0P/U1NT/2dnZ/97e3v/j4+P/5ubm/+np6f/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+np
+        6f/n5+f/xcXF/19eXf9CQT//RkVD/0ZFQ/9GRUP/RkVD/0ZFQ/9GRUP/RkVD/0ZFQ/9GRUP/RkVD/0ZF
+        Q/9GRUP/RkVD/0ZFQ/9GRUP/RkVD/0ZFQ/9FREL/VlVT/76+vv/p6en/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/p6en/5+fn/+Tk5P/g4OD/2tra/9XV1f/R0dH/xMTEuWNj
+        YwhkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjo6AP///wC/v7+Rz8/P/9PT0//Z2dn/3t7e/+Pj
+        4//m5ub/6Ojo/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5+fn/8fHx/9nZmX/Q0JA/0dGRP9HRkT/R0ZE/0dG
+        RP9HRkT/R0ZE/0dGRP9HRkT/R0ZE/0dGRP9HRkT/R0ZE/0dGRP9HRkT/R0ZE/0dGRP9HRkT/R0ZE/0VE
+        Q/88PDr/mpqa/+jo6P/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+jo
+        6P/m5ub/4+Pj/9/f3//a2tr/1NTU/9DQ0P/ExMS5Y2NjCGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAA6OjoA////AL6+vpHPz8//09PT/9jY2P/d3d3/4uLi/+Xl5f/n5+f/6Ojo/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+jo6P/p6en/6Ojo/+bm
+        5v/Hx8f/ZmZl/0NCQf9HR0X/SEdF/0hHRf9IR0X/SEdF/0hHRf9IR0X/SEdF/0hHRf9IR0X/SEdF/0hH
+        Rf9IR0X/SEdF/0hHRf9IR0X/SEdF/0hHRf9GRkT/PTw7/01MS/+/v7//6Ojo/+np6f/p6en/6enp/+np
+        6f/p6en/6enp/+np6f/p6en/6enp/+np6f/o6Oj/6Ojo/+bm5v/j4+P/3t7e/9nZ2f/U1NT/0NDQ/8TE
+        xLljY2MIZGRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OgD///8Avr6+kc/Pz//S0tL/2NjY/93d
+        3f/i4uL/5eXl/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/y8vL/1xcW/89PDr/SEdF/0lIRv9ISEb/SEhG/0hI
+        Rv9ISEb/SEhG/0hIRv9ISEb/SEhG/0hIRv9ISEb/SEhG/0hIRv9ISEb/SEhG/0lIRv9JSEb/R0ZF/z49
+        PP9IR0b/ra2s/+Tk5P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/n5+f/5eXl/+Li4v/e3t7/2NjY/9PT0//Pz8//w8PDuWJiYghjY2MAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAOTk5AP///wC9vb2Rzs7O/9LS0v/X19f/3Nzc/+Hh4f/k5OT/5ubm/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5/+Xlpb/JCQj/zo5OP9HRkX/SUlH/0lJR/9JSUf/SUlH/0lJR/9JSUf/SUlH/0lJR/9JSUf/SUlH/0lJ
+        R/9JSUf/SUlH/0lIR/9JSUf/SUlH/0hHRf8+Pjz/R0dG/6mpqf/j4+P/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//l5eX/4uLi/93d3f/Y2Nj/0tLS/8/P
+        z//CwsK5YmJiCGNjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTkA////AL29vZHOzs7/0dHR/9fX
+        1//c3Nz/4ODg/+Pj4//m5ub/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5ubm/5WVlf8hISD/NTQz/0ZFRP9KSUj/SklI/0pJ
+        SP9KSUj/SklI/0pJSP9KSUj/SklI/0pJSP9KSUj/SklI/0pJSP9KSUf/SklI/0pJSP9JSEb/Pz49/0hH
+        Rv+pqKj/4uLi/+bm5v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5ubm/+Tk5P/h4eH/3d3d/9fX1//S0tL/zs7O/8LCwrliYmIIY2NjAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAADk5OQD///8AvLy8kc3Nzf/R0dH/1tbW/9vb2//g4OD/4+Pj/+Xl5f/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/l5eX/zc3N/11cXP87Ojn/SUhG/0tKSP9LSkj/S0pI/0tKSP9LSkj/S0pI/0tKSP9LSkj/S0pI/0tK
+        SP9LSkj/S0pI/0tKSP9LSkj/SklH/0A/Pf9JSEf/qamo/+Hh4f/l5eX/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/4+Pj/+Dg4P/c3Nz/19fX/9LS
+        0v/Ozs7/wsLCuWJiYghiYmIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTk5AP///wC8vLyRzc3N/9DQ
+        0P/W1tb/29vb/9/f3//i4uL/5OTk/+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5eXl/+Tk5P/T09P/enp5/0ZFRP9LSkn/TEtJ/0xL
+        Sf9MS0n/TEtJ/0xLSf9MS0n/TEtJ/0xLSf9MS0n/TEtJ/0xLSf9MS0n/TEtJ/0pJSP9APz7/SUhH/6mp
+        qP/h4eH/5eXl/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm
+        5v/m5ub/5eXl/+Xl5f/j4+P/4ODg/9zc3P/X19f/0dHR/87Ozv/BwcG5YmJiCGJiYgAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAA5OTkA////ALy8vJHNzc3/0NDQ/9XV1f/a2tr/39/f/+Li4v/k5OT/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/j4+P/zMzM/35+fP9MTEr/TEtJ/01MSv9MTEr/TExK/0xMSv9NTEr/TUxK/0xMSv9MTEr/TExK/0xM
+        Sv9MTEr/TUxK/01MSv9LSkj/QUA+/0pKSP+qqqn/4eHh/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5OTk/+Li4v/f39//29vb/9bW
+        1v/R0dH/zs7O/8HBwbliYmIIYmJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk5OQD///8AvLy8kc3N
+        zf/Q0ND/1dXV/9ra2v/e3t7/4eHh/+Pj4//k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/j4+P/4eHh/8PDw/9xcG//SklH/01MSv9NTEv/TUxL/01M
+        S/9NTEv/TUxK/01MSv9NTEr/TUxK/01MS/9NTEv/TUxL/01MS/9NTEr/S0pI/0FAPv9MS0r/q6ur/+Dg
+        4P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/j4+P/4eHh/9/f3//b29v/1tbW/9HR0f/Ozs7/wcHBuWJiYghiYmIAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAOTk5AP///wC9vb2Rzs7O/9HR0f/V1dX/2tra/97e3v/h4eH/4+Pj/+Pj
+        4//k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//k5OT/4+Pj/9/f3//b29v/3Nzc/93d3f/b29v/2NjY/8/P
+        z/+oqKj/Z2Zl/0xLSf9OTUv/Tk1L/05NS/9OTUv/Tk1L/01MS/9LSkj/SEdF/0lIRv9NTEr/Tk1L/05N
+        S/9NTEr/SklH/0VEQv87Ozn/TEtK/62trP/g4OD/4+Pj/+Tk5P/j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Pj4//h4eH/39/f/9vb
+        2//W1tb/0tLS/87Ozv/CwsK5YmJiCGNjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OjoA////AL6+
+        vpHPz8//0tLS/9bW1v/a2tr/3t7e/+Dg4P/i4uL/4+Pj/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//k5OT/zMzM/3V1df9gYGD/bW1s/3FxcP9xcG//Z2Zk/1JRT/9NTEr/Tk1L/05NTP9OTUv/Tk1L/0xL
+        Sv9LSkj/R0ZF/0A/Pv89PTv/RERC/01MSv9OTUv/SklI/0NDQf83NjX/Kiop/0NDQv+tra3/4ODg/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/j4+P/4uLi/+Hh4f/f39//29vb/9fX1//T09P/z8/P/8TExLlkZGQIZGRkAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NwD///8AwcHBjtHR0f/U1NT/19fX/9vb2//e3t7/4ODg/+Li
+        4v/j4+P/4+Pj/+Pj4//j4+P/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//f39//ra2s/0BAP/8YFxf/JSQj/zIy
+        MP87Ozn/QUA+/0NCQf9FREL/RkVE/0dGRf9GRUT/RENB/0A/Pf8/Pj3/X19e/11cW/9DQ0H/R0ZF/0JB
+        QP82NjT/MTAv/01NTP9ra2r/r6+v/+Dg4P/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//i4uL/4eHh/9/f
+        3//c3Nz/2NjY/9TU1P/R0dH/xcXFuGRkZAhmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMAP//
+        /wDDw8OD1NTU/9bW1v/Z2dn/3d3d/9/f3//h4eH/4uLi/+Pj4//j4+P/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//h4eH/w8PD/2JiYv8iIiL/Gxsb/yAgH/8kJCP/JyYl/yopKP8uLSz/NDMy/zo6
+        OP9FREP/WllY/319fP+QkJD/T05N/zU0M/8vLy7/Ly4t/09PTv+Uk5P/zMzM/93d3f/i4uL/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/j4+P/4+Pj/+Li4v/h4eH/39/f/93d3f/a2tr/19fX/9XV1f/Hx8euTExMBWho
+        aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8fHxAMLCwmnW1tb/2tra/9zc3P/e3t7/4ODg/+Hh
+        4f/i4uL/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//i4uL/1tbW/6en
+        p/96enr/YWFg/1JSUv9ISEj/QkJB/0NDQv9TU1L/ZGNj/2xsa/9iYWH/SEhH/y0tLP8nJiX/MzIy/1VV
+        VP+Wlpb/zc3N/+Dg4P/i4uL/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4uLi/+Hh
+        4f/g4OD/39/f/93d3f/a2tr/2NjY/8nJyZP///8AYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADR0dEAwcHBQtnZ2fTe3t7/39/f/+Dg4P/h4eH/4eHh/+Li4v/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Dg4P/b29z/2NjY/9LS0v+5ubj/kI+P/2pq
+        av9RUVH/UVFR/1tbW/9qamr/g4KC/5+fn/+7u7r/1NTU/+Hh4f/i4uL/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/b29v/ycnJavb2
+        9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALu7uwC2trYb2tra1uDg4P/h4eH/4eHh/+Hh
+        4f/h4eH/4uLi/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Hh4f/d3d3/19fX/9DQ0P/V1dX/2tra/97e3v/h4eH/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li
+        4v/h4eH/4eHh/+Hh4f/h4eH/4ODg/93d3e7FxcU30dHRACwsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAj4+PAA4ODgLW1taX4ODg/+Hh4f/h4eH/4eHh/+Hh4f/i4uL/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4uLi/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/2travKur
+        qw2xsbEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A39/fAM7OzkPf39/x4uLi/+Li
+        4v/i4uL/4uLi/+Pj4//j4+P/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+        4//j4+P/4+Pj/+Pj4//k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Pj
+        4//j4+P/4uLi/+Li4v/i4uL/4uLi/+Hh4f3U1NRn////ACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACoqKgC5ubkAq6urCNvb26fi4uL/4uLi/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk
+        5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Pj4//i4uL/4uLi/+Li4v/i4uL/3d3dycPD
+        wxjJyckAioqKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp6QDe3t4A0dHRNeHh
+        4ePj4+P/4+Pj/+Pj4//j4+P/5OTk/+Xl5f/l5eX/5eXl/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm5v/l5eX/5eXl/+Xl
+        5f/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Li4vTW1tZW9/f3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAYmJiAKqqqgD///8A2traauPj4/jk5OT/5OTk/+Tk5P/k5OT/5eXl/+bm
+        5v/m5ub/5+fn/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl
+        5f/l5eX/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5eXl/+Tk5P/k5OT/5OTk/+Tk5P/j4+P/3d3dj7Gx
+        sQbDw8MAm5ubAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv7+/AMzM
+        zAC9vb0H3t7eieTk5Pzl5eX/5eXl/+Xl5f/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+        5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/6Ojo/+jo6P/o6Oj/6Ojo/+fn
+        5//m5ub/5eXl/+Xl5f/l5eX/5eXl/+Dg4KrNzc0U19fXANXV1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1tbWANbW1gDMzMwL4ODgiOXl5fjm5ub/5ubm/+bm
+        5v/n5+f/6Ojo/+np6f/p6en/6enp/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+        6P/p6en/6enp/+np6f/p6en/6enp/+np6f/o6Oj/5+fn/+bm5v/m5ub/5ubm/+Xl5f/h4eGn1NTUGd7e
+        3gDw8PAAMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAA/Pz8A3t7eANjY2ADHx8cH4ODga+Xl5eTn5+f/5+fn/+fn5//o6Oj/6enp/+rq6v/q6ur/6urq/+vr
+        6//q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq
+        6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/r6+v/6urq/+rq6v/q6ur/6enp/+jo
+        6P/n5+f/5+fn/+fn5//m5ubw4eHhh9PT0xHf398A+Pj4AIiIiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFRUUA29vbANXV1QD///8A3t7eNeXl
+        5abn5+fx6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6Ojo/+jo6P/n5+f35ubmuuDg4Eq9vb0D2traAOrq
+        6gCRkZEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAA0tLSAMbGxgDk5OQA09PTB+Li4kHl5eWT5+fn0+jo6PPp6en+6enp/+rq
+        6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
+        7P/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo
+        6Pbo6Ojb5ubmouPj41HZ2dkP6OjoANLS0gDa2toAV1dXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAra2tAOvr
+        6wDY2NgA5eXlAFxcXAHg4OAX5OTkPeXl5WLo6Oh86OjoiOfn54zn5+eM5+fnjOjo6Izo6OiM6OjojOjo
+        6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo
+        6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo
+        6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo6Izo6OiM6OjojOjo
+        6Izo6OiM5+fnjOfn54zn5+eM6Ojoiujo6H/l5eVo5eXlReHh4R7MzMwD6OjoANvb2wD///8Ax8fHAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKenpwDi4uIA1NTUAODg4ADm5uYA6urqAOrq
+        6gD5+fkA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+        /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD+/v4A6+vrAOrq
+        6gDn5+cA4eHhANjY2AD29vYAvLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtra0AtbW1AM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7O
+        zgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7O
+        zgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7O
+        zgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7OzgDOzs4Azs7OAM7O
+        zgDOzs4Azs7OAM7OzgDOzs4Azs7OAM/PzwDMzMwAzc3NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        /////////////////////////////////////////////////////////////////////////4AAAAAA
+        D//////////+AAAAAAAAAAAAA///////AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAAB////AAAAAA
+        AAAAAAAAAAAf///gAAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAH///g
+        AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAH///gAAAAAAAAAAAAAAAA
+        B///+AAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAB/////+AAAAAAAAAA
+        AAAAB//////gAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAA
+        AAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////
+        wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD
+        /////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAA
+        AAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAA
+        AAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////
+        wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD
+        /////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAA
+        AAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAA
+        AAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////
+        wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD
+        /////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAA
+        AAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAA
+        AAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////
+        wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD
+        /////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAA
+        AAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAA
+        AAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////gAAAAAAAAAAAAAAP/////
+        4AAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAf/////8AAAAAAAAAAAAAAP
+        //////gAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAB///////AAAAAAAAAAAAAA///////4AAAAAAAAA
+        AAAAf///////AAAAAAAAAAAAAP///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP/////////4AA
+        AAAAAAAB////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        //////////////////////////////////8=
+</value>
+  </data>
+</root>

+ 75 - 65
FileWatcher/ftpOperater.cs

@@ -11,19 +11,17 @@ namespace FileWatcher
     class ftpOperater
     {
         //从配置文件读取FTP信息
-        public static string FTPAddress = Properties.Settings.Default.Properties["FTPAddress"].DefaultValue.ToString().Split('|')[0];
+        //public static string FTPAddress = Properties.Settings.Default.Properties["FTPAddress"].DefaultValue.ToString().Split('|')[0];
 
         public static string DownLoadTo = Environment.GetEnvironmentVariable("windir").Substring(0, 1) + @":\" + @"打印标签\";
 
-        private string FTPInf;
         private string ftpServerIP;
         private string ftpUser;
         private string ftpPwd;
-        bool status = false;
 
         public ftpOperater()
         {
-            string[] FTPInf = "ftp://10.8.0.82|vsftpd|vsftpd".Split('|');
+            string[] FTPInf = "ftp://81.71.42.91|vsftpd|uas321vsftpd2021".Split('|');
             this.ftpServerIP = FTPInf[0];
             this.ftpUser = FTPInf[1];
             this.ftpPwd = FTPInf[2];
@@ -34,49 +32,57 @@ namespace FileWatcher
         }
 
         #region
-        public void UpLoadFile(string filepath, string filename, string UploadFolder)
+        public void UpLoadFile(string filepath, string filename, string UploadFolder,string BackUp)
         {
-            //上传之前判断文件是否存在
-            string[] filelist = GetFileList();
-            if (filelist != null)
-                for (int i = 0; i < filelist.Length; i++)
+            try
+            {
+                //上传之前判断文件是否存在
+                //string[] filelist = GetFileList();
+                //if (filelist != null)
+                //    for (int i = 0; i < filelist.Length; i++)
+                //    {
+                //        if (filelist[i] == filename)
+                //        {
+                //            string upload = MessageBox.Show("已存在同名文件,是否覆盖", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
+                //            if (upload.ToString() != "Yes")
+                //            {
+                //                return;
+                //            }
+                //        }
+                //    }
+                FtpWebRequest reqFTP;
+                FtpCheckDirectoryExist(UploadFolder);
+                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServerIP + UploadFolder + filename));
+                reqFTP.UseBinary = true;
+                reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
+                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
+                FileInfo file = new FileInfo(filepath + "/" + filename);
+                const int BufferSize = 2048;
+                byte[] content = new byte[BufferSize - 1 + 1];
+                int dataRead;
+                using (FileStream fs = file.OpenRead())
                 {
-                    if (filelist[i] == filename)
+                    //把上传的文件写入流
+                    using (Stream rs = reqFTP.GetRequestStream())
                     {
-                        string upload = MessageBox.Show("已存在同名文件,是否覆盖", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
-                        if (upload.ToString() != "Yes")
+                        do
                         {
-                            return;
-                        }
+                            //每次读文件流的2KB
+                            dataRead = fs.Read(content, 0, BufferSize);
+                            rs.Write(content, 0, dataRead);
+                        } while (!(dataRead < BufferSize));
+                        rs.Close();
                     }
+                    fs.Close();
                 }
-            FtpWebRequest reqFTP;
-            FtpCheckDirectoryExist(UploadFolder);
-            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServerIP + UploadFolder + filename));
-            reqFTP.UseBinary = true;
-            reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
-            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
-            FileInfo file = new FileInfo(filepath + "/" + filename);
-            const int BufferSize = 2048;
-            byte[] content = new byte[BufferSize - 1 + 1];
-            int dataRead;
-            using (FileStream fs = file.OpenRead())
+                Thread.Sleep(1000);
+            }
+            catch (Exception ex)
             {
-                //把上传的文件写入流
-                using (Stream rs = reqFTP.GetRequestStream())
-                {
-                    do
-                    {
-                        //每次读文件流的2KB
-                        dataRead = fs.Read(content, 0, BufferSize);
-                        rs.Write(content, 0, dataRead);
-                    } while (!(dataRead < BufferSize));
-                    rs.Close();
-                }
-                fs.Close();
+                Console.WriteLine(ex.Message);
             }
-            Thread.Sleep(1000);
-            File.Delete(filepath + "/" + filename);
+        
+            //File.Delete(filepath + "/" + filename);
         }
 
         private static void BeginWriteCallBack(IAsyncResult ar)
@@ -269,8 +275,10 @@ namespace FileWatcher
                         curDir += dir + "/";
                         FtpMakeDir(curDir);
                     }
-                    catch (Exception)
-                    { }
+                    catch (Exception ex)
+                    {
+                        Console.WriteLine(ex.Message);
+                    }
                 }
             }
         }
@@ -283,16 +291,18 @@ namespace FileWatcher
         //创建目录  
         public Boolean FtpMakeDir(string localFile)
         {
+            //Console.WriteLine(ftpServerIP + localFile);
             FtpWebRequest req = (FtpWebRequest)WebRequest.Create(ftpServerIP + localFile);
-            req.Credentials = new NetworkCredential(ftpUser, ftpPwd);
-            req.Method = WebRequestMethods.Ftp.MakeDirectory;
             try
             {
+                req.Credentials = new NetworkCredential(ftpUser, ftpPwd);
+                req.Method = WebRequestMethods.Ftp.MakeDirectory;
                 FtpWebResponse response = (FtpWebResponse)req.GetResponse();
                 response.Close();
             }
-            catch (Exception)
+            catch (Exception ex)
             {
+                Console.WriteLine(ex.Message);
                 req.Abort();
                 return false;
             }
@@ -342,27 +352,27 @@ namespace FileWatcher
         }
 
 
-        public string DownLoadFromSharePath(string URL, string fileName)
-        {
-            //目标路径
-            string targetPath = FTPInf;
-            //var file = Directory.GetFiles(targetPath);
-            string sourceFile = Path.Combine(URL);
-            string destFile = Path.Combine(DownLoadTo, fileName);
-            //不存在文件的话进行创建
-            if (!Directory.Exists(DownLoadTo))
-                Directory.CreateDirectory(DownLoadTo);
-            //将文件复制到指定位置
-            try
-            {
-                File.Copy(sourceFile, destFile, true);
-            }
-            catch
-            {
-                MessageBox.Show("标签文件更新失败,不在指定维护路径" + URL + "中或已被占用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
-            }
-            return destFile;
-        }
+        //public string DownLoadFromSharePath(string URL, string fileName)
+        //{
+        //    ////目标路径
+        //    //string targetPath = FTPInf;
+        //    ////var file = Directory.GetFiles(targetPath);
+        //    //string sourceFile = Path.Combine(URL);
+        //    //string destFile = Path.Combine(DownLoadTo, fileName);
+        //    ////不存在文件的话进行创建
+        //    //if (!Directory.Exists(DownLoadTo))
+        //    //    Directory.CreateDirectory(DownLoadTo);
+        //    ////将文件复制到指定位置
+        //    //try
+        //    //{
+        //    //    File.Copy(sourceFile, destFile, true);
+        //    //}
+        //    //catch
+        //    //{
+        //    //    MessageBox.Show("标签文件更新失败,不在指定维护路径" + URL + "中或已被占用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+        //    //}
+        //    //return destFile;
+        //}
 
         /// <summary>
         /// 删除文件

BIN
FileWatcher/tool/UMES.DLLService.dll


+ 49 - 17
FileWatcher/测试记录解析.cs

@@ -15,6 +15,8 @@ namespace FileWatcher
 
         DataHelper dh = new DataHelper();
 
+        ftpOperater ftp = new ftpOperater();
+
         public 测试记录解析()
         {
             InitializeComponent();
@@ -23,7 +25,8 @@ namespace FileWatcher
         private void Form1_Load(object sender, EventArgs e)
         {
             timer1.Interval = 1000 * 10;
-            timer1.Start();
+            OperateResult.AppendText("连接上服务器\n");
+            //timer1.Start();
         }
 
         public void DoLog(string Message)
@@ -68,50 +71,79 @@ namespace FileWatcher
                 //FileInfo[] file = Directory.GetFiles(path); //文件列表   
                 if (file.Length != 0 || dir.Length != 0) //当前目录文件或文件夹不为空                   
                 {
+                    string SN = "";
+                    string folderpath = "";
                     foreach (FileInfo f in file) //显示当前目录所有文件   
                     {
+                        folderpath = f.FullName.Substring(0, f.FullName.LastIndexOf(@"\"));
+                        SN = folderpath.Substring(folderpath.LastIndexOf(@"\") + 1);
                         if (f.FullName.Contains("SN_"))
                         {
-                          
-                            Console.WriteLine(f.FullName);
                             StreamReader sr = new StreamReader(f.FullName);
                             while (!sr.EndOfStream)
                             {
                                 string val = sr.ReadLine();
                                 string type = val.Split(':')[0].Trim();
                                 string value = val.Split(':')[1].Trim();
-                                dh.ExecuteSql("insert into windowsninfo(ws_id,ws_sncode,ws_type,ws_value)values(windowsninfo_seq.nextval,'" + f.Name + "','"+type+"','"+value+"')", "insert");
+                                dh.ExecuteSql("insert into windowsninfo(ws_id,ws_sncode,ws_type,ws_value,ws_indate)values(windowsninfo_seq.nextval,'" + SN + "','" + type + "','" + value + "',sysdate)", "insert");
                             }
                             sr.Close();
                         }
-                        //if (f.Attributes.ToString().IndexOf("Hidden") > -1 && f.Attributes.ToString().IndexOf("System") > -1)
-                        //{
+                        try
+                        {
+                            string ftppath = "/" + DateTime.Now.ToString("yyyy-MM-dd") + "/" + folderpath.Substring(folderpath.LastIndexOf(@"\") + 1) + "/";
+                            ftp.UpLoadFile(folderpath, f.Name, ftppath, BackUpFolderPath.Text);
+                        }
+                        catch (Exception ex)
+                        {
+                            Console.WriteLine(ex.Message);
+                        }
+                    }
+                    foreach (FileInfo f in file) //显示当前目录所有文件   
+                    {
+                        try
+                        {
+                            if (!Directory.Exists(BackUpFolderPath.Text + @"\" + SN + @"\"))
+                            {
+                                Directory.CreateDirectory(BackUpFolderPath.Text + @"\" + SN + @"\");
+                            }
+                            File.Move(f.FullName, BackUpFolderPath.Text + @"\" + SN + @"\" + f.Name);
+                        }
+                        catch (Exception ex)
+                        {
+                            Console.WriteLine(ex.Message);
+                        }
+                    }
+                    try
+                    {
+                        Directory.Delete(folderpath);
+                    }
+                    catch (Exception)
+                    {
 
-                        //}
-                        //else
-                        //{
-                        //    if (extName.ToLower().IndexOf(f.Extension.ToLower()) >= 0)
-                        //    {
-                        //        lst.Add(f);
-                        //    }
-                        //}
                     }
                     foreach (string d in dir)
                     {
-                        Console.WriteLine(d);
                         getdir(d, extName);//递归   
                     }
                 }
             }
             catch (Exception ex)
             {
-                throw ex;
+                Console.WriteLine(ex.Message);
             }
         }
 
         private void timer1_Tick(object sender, EventArgs e)
         {
-            getFile(FolderPath.Text, ".log");
+            try
+            {
+                getFile(FolderPath.Text, ".log");
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+            }
         }
 
         /// <summary>

+ 24 - 22
FileWatcher/测试记录解析DCW.cs

@@ -8,6 +8,7 @@ using System.Net;
 using System.Text;
 using System.Threading;
 using System.Windows.Forms;
+using UMES.DLLService;
 
 namespace FileWatcher
 {
@@ -80,29 +81,30 @@ namespace FileWatcher
                         if (filename.Substring(filename.LastIndexOf(".") + 1).ToUpper() == "TXT")
                         {
                             folderpath = f.FullName.Substring(0, f.FullName.LastIndexOf(@"\"));
-                            SN = f.Name.Split('.')[0];
-                            try
+                            SN = f.Name.Split('.')[0].ToUpper();
+                            if (SN.Length == 12)
                             {
-                                string ftppath = "/" + DateTime.Now.ToString("yyyy-MM-dd") + "/";
-                                ftp.UpLoadFile(folderpath, f.Name, ftppath, "");
-                                dh.ExecuteSql("insert into STEPTESTDETAIL (std_id,std_sn,std_makecode,std_indate,std_class)select STEPTESTDETAIL_seq.nextval,ms_sncode,ms_makecode,sysdate,'http://81.71.42.91:8099/ftp" + ftppath + f.Name + "' from makeserial where substr(ms_sncode,0,12)='" + SN + "'", "insert");
-                                OperateResult.AppendText(SN+"获取成功\n");
+                                try
+                                {
+                                    string ftppath = "/" + DateTime.Now.ToString("yyyy-MM-dd") + "/";
+                                    ftp.UpLoadFile(folderpath, f.Name, ftppath, "");
+                                    int dt = int.Parse(dh.ExecuteSql("insert into STEPTESTDETAIL (std_id,std_sn,std_makecode,std_indate,std_class)select STEPTESTDETAIL_seq.nextval,ms_sncode,ms_makecode,sysdate,'http://81.71.42.91:8099/ftp" + ftppath + f.Name + "' from makeserial where substr(ms_sncode,0,12)='" + SN + "'", "insert").ToString());
+                                    if (dt > 0)
+                                    {
+                                        OperateResult.AppendText("序列号:" + SN + "上传成功\n");
+                                    }
+                                    else
+                                    {
+                                        OperateResult.AppendText("序列号: " + SN + "前工段未扫描\n");
+                                        MessageBox.Show("序列号: " + SN + "前工段未扫描", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
+                                    }
+                                }
+                                catch (Exception ex)
+                                {
+                                    Console.WriteLine(ex.Message);
+                                }
+                                File.Delete(f.FullName);
                             }
-                            catch (Exception ex)
-                            {
-                                Console.WriteLine(ex.Message);
-                            }
-                        }
-                    }
-                    foreach (FileInfo f in file) //显示当前目录所有文件   
-                    {
-                        try
-                        {
-                            File.Delete(f.FullName);
-                        }
-                        catch (Exception ex)
-                        {
-                            Console.WriteLine(ex.Message);
                         }
                     }
                 }
@@ -179,7 +181,7 @@ namespace FileWatcher
             DialogResult result = folder.ShowDialog();
             if (result == DialogResult.OK)
             {
-               // BackUpFolderPath.Text = folder.SelectedPath;
+                // BackUpFolderPath.Text = folder.SelectedPath;
             }
         }