diff --git a/HexcalMC/Base/BaseFunction.cs b/HexcalMC/Base/BaseFunction.cs
new file mode 100644
index 0000000..17af288
--- /dev/null
+++ b/HexcalMC/Base/BaseFunction.cs
@@ -0,0 +1,2959 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+
+namespace HexcalMC.Base
+{
+ //==========================================================================================
+ //通用功能类
+ public class RichTextUnit
+ {
+ public static float m_Size = 16;
+ public static void SetFont(RichTextBox m_RichTextBox, Color m_Color, bool bBold = false, float Size = 16)
+ {
+ m_RichTextBox.SelectionColor = m_Color;
+ if (bBold)
+ m_RichTextBox.SelectionFont = new System.Drawing.Font("微软雅黑", Size, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
+ else
+ m_RichTextBox.SelectionFont = new System.Drawing.Font("微软雅黑", Size, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
+ }
+
+ public static void SetText(RichTextBox m_RichTextBox, string strText, Color m_Color, bool bBold = false, float Size = 16)
+ {
+ m_RichTextBox.Invoke(((EventHandler)delegate
+ {
+ RichTextUnit.SetFont(m_RichTextBox, m_Color, bBold, Size);
+ m_RichTextBox.SelectedText = strText;
+ }));
+ }
+
+ public static void SetXmlText(RichTextBox m_RichTextBox, string strText, float Size = 16)
+ {
+ m_RichTextBox.Invoke(((EventHandler)delegate
+ {
+ int iFirstInx = strText.IndexOf("");
+ int iSecondInx = strText.IndexOf("?>");
+
+ #region PARSE THROUGH TEXT DATA
+ for (int i = 0; i < strText.Length; i++)
+ {
+ if (i >= iFirstInx && i <= iSecondInx + 1)
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ }
+ else
+ {
+ switch (strText[i])
+ {
+ case '<':
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ if (strText[i + 1] == '/')
+ {
+ m_RichTextBox.SelectedText = strText[i + 1].ToString();
+ i++;
+ }
+ RichTextUnit.SetFont(m_RichTextBox, Color.DarkRed, false, Size);
+ }
+ break;
+ case '>':
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ RichTextUnit.SetFont(m_RichTextBox, Color.Black, false, Size);
+ }
+ break;
+ case '/':
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ }
+ break;
+ case '=':
+ {
+ if (strText[i + 1] == '"')
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Black, true, Size);
+ m_RichTextBox.SelectedText = "=" + '"'.ToString();
+ i++;
+ }
+ }
+ break;
+ case '"':
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ if (strText[i - 1] == '=')
+ RichTextUnit.SetFont(m_RichTextBox, Color.Black, true, Size);
+ else
+ RichTextUnit.SetFont(m_RichTextBox, Color.DarkRed, false, Size);
+ }
+ break;
+ case '!':
+ {
+ RichTextUnit.SetFont(m_RichTextBox, Color.Green, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ }
+ break;
+ case '\r':
+ {
+ if (strText[i + 1] == '\n')
+ {
+ m_RichTextBox.SelectedText = "\r\n";
+ i++;
+ }
+ }
+ break;
+ default:
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ break;
+ }
+ }
+ }
+ #endregion
+
+ m_RichTextBox.SelectedText = Environment.NewLine;
+ }));
+ }
+
+ public static void SetCNCText(RichTextBox m_RichTextBox, string strText, float Size = 16)
+ {
+ m_RichTextBox.Invoke(((EventHandler)delegate
+ {
+ #region PARSE THROUGH TEXT DATA
+ for (int i = 0; i < strText.Length; i++)
+ {
+ switch (strText[i])
+ {
+ case '%':
+ RichTextUnit.SetFont(m_RichTextBox, Color.Red, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ RichTextUnit.SetFont(m_RichTextBox, Color.DeepSkyBlue, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ break;
+ default:
+ RichTextUnit.SetFont(m_RichTextBox, Color.White, false, Size);
+ m_RichTextBox.SelectedText = strText[i].ToString();
+ break;
+ }
+ }
+ #endregion
+ }));
+ }
+ }
+ public class MyBase
+ {
+ #region 内存回收
+
+ [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
+ public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
+
+ ///
+ /// 释放内存
+ ///
+ public static void ClearMemory()
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+ {
+ SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
+ }
+ }
+
+ public static void ClearMemory_PCDMIS()
+ {
+ Process[] m_Process = Process.GetProcessesByName("PCDLRN");
+ for (int i = 0; i < m_Process.Length; i++)
+ {
+ if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+ {
+ SetProcessWorkingSetSize(m_Process[i].Handle, -1, -1);
+ }
+ }
+ }
+
+ #endregion
+
+ public static void KillSoftware(string strSoftwareName)
+ {
+ Process[] xc = Process.GetProcesses();
+ try
+ {
+ foreach (Process xc1 in xc)
+ {
+ if (xc1.ProcessName.ToLower() == strSoftwareName.ToLower())
+ {
+ xc1.Kill();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ MyBase.TraceWriteLine("Kill " + strSoftwareName + " Failed: " + ex.ToString());
+ }
+ }
+
+ #region 界面控件操作
+
+ ///
+ /// 根据指定容器和控件名字,获得控件
+ ///
+ /// 容器
+ /// 控件名字
+ /// 控件
+ public static object GetControlInstance(object obj, string strControlName, Form mainForm)
+ {
+ IEnumerator Controls = null; //所有控件
+ Control c = null; //当前控件
+ Object cResult = null; //查找结果
+ if (obj.GetType() == mainForm.GetType()) //窗体
+ {
+ Controls = mainForm.Controls.GetEnumerator();
+ }
+ else //控件
+ {
+ Controls = ((Control)obj).Controls.GetEnumerator();
+ }
+
+ while (Controls.MoveNext()) //遍历操作
+ {
+ c = (Control)Controls.Current; //当前控件
+ if (c.HasChildren) //当前控件是个容器
+ {
+ cResult = GetControlInstance(c, strControlName, mainForm); //递归查找
+ if (cResult == null) //当前容器中没有,跳出,继续查找
+ continue;
+ else //找到控件,返回
+ return cResult;
+ }
+ else if (c.Name == strControlName) //不是容器,同时找到控件,返回
+ {
+ return c;
+ }
+ }
+
+ return null; //控件不存在
+ }
+
+ public static object GetChildControl(object obj, string strControlName)
+ {
+ Control m_Ctrl = null; //当前控件
+ IEnumerator Controls = ((Control)obj).Controls.GetEnumerator();
+
+ while (Controls.MoveNext())
+ {
+ m_Ctrl = (Control)Controls.Current; //当前控件
+ if (m_Ctrl.Name == strControlName)
+ {
+ return m_Ctrl;
+ }
+ }
+
+ return null; //控件不存在
+ }
+
+ public static void AddDebugText(TextBox tb, string str, int length = 200)
+ {
+ try
+ {
+ TraceWriteLine(str);
+ string strTime = DateTime.Now.ToString("HH:mm:ss") + "--";
+ tb.Text += (strTime + str);
+ tb.Text += "\r\n";
+ tb.Select(tb.TextLength, 0);
+ tb.ScrollToCaret();
+
+ if (tb.Lines.Length > length)
+ {
+ tb.Clear();
+ }
+ }
+ finally
+ {
+ }
+ }
+
+ ///
+ /// 向RichTextBox控件中添加文本信息
+ ///
+ /// RichTextBox控件类
+ /// 要显示的文本信息内容
+ /// 文本显示的颜色
+ public static void AddDebugTextToRTB(RichTextBox RTB, string str, Color m_Color = new Color())
+ {
+ try
+ {
+ TraceWriteLine(str); //将文本信息同步到debug.txt文件中
+ RTB.BeginInvoke((EventHandler)delegate
+ {
+ Color SetColor = Color.Black;
+ if (m_Color == new Color())
+ {
+ if (str.ToUpper().Contains("ERROR") || str.ToUpper().Contains("错误") ||
+ str.ToUpper().Contains("出错") || str.ToUpper().Contains("EXCEPTION") ||
+ str.ToUpper().Contains("异常") || str.ToUpper().Contains("失败"))
+ {
+ SetColor = Color.Red;
+ }
+ else if (str.ToUpper().Contains("WARNING") || str.ToUpper().Contains("警告"))
+ {
+ SetColor = Color.DarkOrange;
+ }
+ }
+ else
+ {
+ SetColor = m_Color;
+ }
+
+ string strText = str + Environment.NewLine; //DateTime.Now.ToString("HH:mm:ss.fff") + "--" +
+ RTB.SelectionStart = RTB.TextLength;
+ if (string.IsNullOrEmpty(str))
+ RichTextUnit.SetText(RTB, " " + Environment.NewLine, SetColor, false, 14);
+ else
+ RichTextUnit.SetText(RTB, strText, SetColor, false, 14);
+
+ if (RTB.Lines.Length > 2000)
+ {
+ RTB.Select(0, RTB.TextLength / 2);
+ RTB.Cut();
+ }
+
+ RTB.ScrollToCaret();
+ });
+ }
+ catch
+ {
+ }
+ }
+
+ ///
+ /// 写debug文件,记录程序过程
+ ///
+ /// 要写入日志的内容
+ public static void TraceWriteLine(string str)
+ {
+ try
+ {
+ Trace.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "--" + str);
+ Trace.Unindent();
+ Trace.Flush();
+ }
+ catch
+ {
+ }
+ }
+
+
+ public static string InputBox(string Caption, string Hint, string DefaultTxt, string btn1 = "OK",
+ string btn2 = "Cancel", char Strstyle = '*', bool bShowData = false)
+ {
+ if (Strstyle == '\0')
+ Strstyle = '*';
+ Form InputForm = new Form();
+ InputForm.MinimizeBox = false;
+ InputForm.MaximizeBox = false;
+ InputForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ InputForm.StartPosition = FormStartPosition.CenterScreen;
+ InputForm.Width = 230;
+ InputForm.Height = 170;
+ InputForm.Text = Caption;
+ InputForm.Font = new System.Drawing.Font("宋体", 16F, System.Drawing.FontStyle.Regular,
+ System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
+
+ Label lbl = new Label();
+ lbl.Text = Hint;
+ lbl.Left = 10;
+ lbl.Top = 20;
+ lbl.Parent = InputForm;
+ lbl.AutoSize = true;
+ TextBox tb = new TextBox();
+ tb.Left = 30;
+ tb.Top = 45;
+ tb.Width = 165;
+ tb.Parent = InputForm;
+ tb.Text = DefaultTxt;
+ if (bShowData == false)
+ tb.PasswordChar = Strstyle;
+ tb.SelectAll();
+ Button btnok = new Button();
+ btnok.Left = 30;
+ btnok.Top = 80;
+ btnok.Height = 30;
+ btnok.Parent = InputForm;
+ btnok.Text = btn1;
+ InputForm.AcceptButton = btnok; //回车响应
+ btnok.DialogResult = DialogResult.OK;
+
+ Button btncancal = new Button();
+ btncancal.Left = 120;
+ btncancal.Top = 80;
+ btncancal.Height = 30;
+ btncancal.Parent = InputForm;
+ btncancal.Text = btn2;
+ btncancal.DialogResult = DialogResult.Cancel;
+ try
+ {
+ if (InputForm.ShowDialog() == DialogResult.OK)
+ {
+ return tb.Text;
+ }
+ else
+ {
+ return null;
+ }
+ }
+ finally
+ {
+ InputForm.Dispose();
+ }
+ }
+
+ ///
+ /// 操作提示框,0 = 取消; 1 = 第一个按钮; 2 = 第二个按钮
+ ///
+ /// 错误信息
+ /// 标题
+ /// 第一个按钮名字
+ /// 第二个按钮名字
+ /// 第三个按钮名字
+ /// 背景颜色,默认无色,1=红色
+ ///
+ public static int MessageBox(string strError, string Caption, string btnName1 = "YES", string btnName2 = "NO",
+ string btnName3 = "Cancel", int iColor = 0)
+ {
+ Form ErrorForm = new Form();
+ ErrorForm.MinimizeBox = false;
+ ErrorForm.MaximizeBox = false;
+ ErrorForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ ErrorForm.StartPosition = FormStartPosition.CenterScreen;
+ ErrorForm.Width = 480;
+ ErrorForm.Height = 300;
+ ErrorForm.Text = Caption;
+ ErrorForm.Font = new System.Drawing.Font("宋体", 16F, System.Drawing.FontStyle.Regular,
+ System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
+
+ TextBox tb = new TextBox();
+ tb.Parent = ErrorForm;
+ tb.Text = strError;
+ tb.Multiline = true;
+ tb.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ tb.Location = new System.Drawing.Point(20, 20);
+ tb.Size = new System.Drawing.Size(440, 170);
+ tb.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+ tb.Font = new Font("宋体", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
+ if (iColor == 1)
+ tb.BackColor = Color.Red;
+
+ Button btnYes = new Button();
+ btnYes.Location = new System.Drawing.Point(30, 210);
+ btnYes.Size = new System.Drawing.Size(100, 40);
+ btnYes.Parent = ErrorForm;
+ btnYes.Text = btnName1;
+
+ btnYes.DialogResult = DialogResult.Yes;
+ ErrorForm.AcceptButton = btnYes; //回车响应
+
+ Button btnNO = new Button();
+ btnNO.Location = new System.Drawing.Point(190, 210);
+ btnNO.Size = new System.Drawing.Size(100, 40);
+ btnNO.Parent = ErrorForm;
+ btnNO.Text = btnName2;
+ btnNO.DialogResult = DialogResult.No;
+ ErrorForm.AcceptButton = btnNO; //回车响应
+
+ Button btncancal = new Button();
+ btncancal.Location = new System.Drawing.Point(350, 210);
+ btncancal.Size = new System.Drawing.Size(100, 40);
+ btncancal.Parent = ErrorForm;
+ btncancal.Text = btnName3;
+ btncancal.DialogResult = DialogResult.Cancel;
+ ErrorForm.AcceptButton = btncancal; //回车响应
+ try
+ {
+ btnYes.Select();
+ switch (ErrorForm.ShowDialog())
+ {
+ case DialogResult.Yes: return 1;
+ case DialogResult.No: return 2;
+ default: return 0;
+ }
+ }
+ finally
+ {
+ ErrorForm.Dispose();
+ }
+ }
+
+ [DllImport("User32.dll")]
+ private static extern bool SetCursorPos(int x, int y);
+
+ static public void SetCursorPosXY(int dx, int dy)
+ {
+ SetCursorPos(dx, dy);
+ }
+
+ static public void SetCursorPosXY(Point point)
+ {
+ System.Windows.Forms.Cursor.Position = point;
+ }
+
+ #endregion
+
+ ///
+ /// CopyFiles 函数
+ ///
+ /// 源路径文件夹路径
+ /// 目标文件夹路径
+ /// 文件夹名称
+ ///
+ public static int CopyFiles(string strSourceFilePath, string strDesFilePath, string strRemak)
+ {
+ try
+ {
+ if (!Directory.Exists(strDesFilePath))
+ {
+ Directory.CreateDirectory(strDesFilePath);
+ }
+
+ DirectoryInfo sDir = new DirectoryInfo(strSourceFilePath);
+ FileInfo[] fileArray = sDir.GetFiles();
+ foreach (FileInfo file in fileArray)
+ {
+ file.CopyTo(strDesFilePath + "\\" + file.Name, true);
+ }
+
+ System.Windows.Forms.MessageBox.Show("传输" + strRemak + "文件夹中的所有文件成功! ", "提示", MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ return 1;
+ }
+ catch (Exception ex)
+ {
+ System.Windows.Forms.MessageBox.Show("传输" + strRemak + "文件夹中的文件错误!原因: " + ex.ToString(), "提示",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ return 0;
+ }
+ }
+ }
+
+ public class HardwareInfoBase
+ {
+ /// 获取指定驱动器的空间总大小(单位为B) ,只需输入代表驱动器的字母即可
+ public static long GetHardDiskSpace(string str_HardDiskName)
+ {
+ long totalSize = new long();
+ str_HardDiskName = str_HardDiskName + ":\\";
+ System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
+ foreach (System.IO.DriveInfo drive in drives)
+ {
+ if (drive.Name == str_HardDiskName)
+ {
+ totalSize = drive.TotalSize;
+ break;
+ }
+ }
+
+ return totalSize;
+ }
+
+ /// 获取指定驱动器的剩余空间总大小(单位为B) ,只需输入代表驱动器的字母即可
+ public static long GetHardDiskFreeSpace(string str_HardDiskName)
+ {
+ long freeSpace = new long();
+ str_HardDiskName = str_HardDiskName + ":\\";
+ System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
+ foreach (System.IO.DriveInfo drive in drives)
+ {
+ if (drive.Name == str_HardDiskName)
+ {
+ freeSpace = drive.TotalFreeSpace;
+ break;
+ }
+ }
+
+ return freeSpace;
+ }
+
+ /// 获取指定驱动器的剩余空间总大小(单位为K) ,只需输入代表驱动器的字母即可
+ public static long GetHardDiskFreeSpace_K(string str_HardDiskName)
+ {
+ return GetHardDiskFreeSpace(str_HardDiskName) / 1024;
+ }
+
+ /// 获取指定驱动器的剩余空间总大小(单位为M) ,只需输入代表驱动器的字母即可
+ public static long GetHardDiskFreeSpace_M(string str_HardDiskName)
+ {
+ return GetHardDiskFreeSpace_K(str_HardDiskName) / 1024;
+ }
+
+ /// 获取指定驱动器的剩余空间总大小(单位为G) ,只需输入代表驱动器的字母即可
+ public static long GetHardDiskFreeSpace_G(string str_HardDiskName)
+ {
+ return GetHardDiskFreeSpace_M(str_HardDiskName) / 1024;
+ }
+ }
+
+ //==================================================================================================FileIni
+ //Ini 文件操作类
+ public class FileIni
+ {
+ [DllImport("kernel32.dll")]
+ public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
+
+ [DllImport("kernel32.dll")]
+ public static extern bool CloseHandle(IntPtr hObject);
+
+ public const int OF_READWRITE = 2;
+ public const int OF_SHARE_DENY_NONE = 0x40;
+ public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);
+
+ //判断文件是否被占用 占用=true 未占用 = false
+ public static bool isFileOccupied(string path)
+ {
+ if (!File.Exists(path))
+ return true;
+ IntPtr vHandle = _lopen(path, OF_READWRITE | OF_SHARE_DENY_NONE);
+ if (vHandle == HFILE_ERROR)
+ return true;
+ CloseHandle(vHandle);
+ return false;
+ }
+
+
+ [DllImport("kernel32")]
+ private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal,
+ int size, string filePath);
+
+ [DllImport("kernel32")]
+ private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
+
+ [DllImport("kernel32")]
+ private static extern int GetPrivateProfileInt(string section, string key, int def, string filePath);
+
+ public static bool isFileExists(string path)
+ {
+ if (!(File.Exists(path)))
+ {
+ MessageBox.Show("文件:" + path + "不存在", "ini文件不存在");
+ return false;
+ }
+
+ return true;
+ }
+
+ //=====================//=====================//=====================Write data
+
+ #region 写INI参数
+
+ ///
+ /// 对ini文件进行写操作
+ ///
+ /// ini文件路径
+ /// 配置节
+ /// 键名
+ /// 要写入的string字符串
+ public static void WriteString(string path, string section, string key, string value)
+ {
+ // section=配置节,key=键名,value=键值,path=路径
+ WritePrivateProfileString(section, key, value, path);
+ }
+
+ public static void WriteInt(string path, string section, string key, int value = 0)
+ {
+ string strRead = ReadString(path, section, key);
+ string[] strArr = strRead.Split(new char[] { ';' });
+ string strNote = ";";
+ string strWrite;
+ if (strArr.Length > 1) //保留原有注释
+ {
+ for (int i = 1; i < strArr.Length; i++)
+ strNote += strArr[i];
+ strWrite = value.ToString() + strNote;
+ }
+ else
+ {
+ strWrite = value.ToString();
+ }
+
+ WritePrivateProfileString(section, key, strWrite, path);
+ }
+
+ public static void WriteDouble(string path, string section, string key, double value = 0)
+ {
+ string strRead = ReadString(path, section, key);
+ string[] strArr = strRead.Split(new char[] { ';' });
+ string strNote = ";";
+ string strWrite;
+ if (strArr.Length > 1) //保留原有注释
+ {
+ for (int i = 1; i < strArr.Length; i++)
+ strNote += strArr[i];
+ strWrite = value.ToString() + strNote;
+ }
+ else
+ {
+ strWrite = value.ToString();
+ }
+
+ WritePrivateProfileString(section, key, strWrite, path);
+ }
+
+ public static void WriteBool(string path, string section, string key, bool value = false)
+ {
+ string strValue = (value ? "1" : "0");
+ string strRead = ReadString(path, section, key);
+ string[] strArr = strRead.Split(new char[] { ';' });
+ string strNote = ";";
+ string strWrite;
+ if (strArr.Length > 1) //保留原有注释
+ {
+ for (int i = 1; i < strArr.Length; i++)
+ strNote += strArr[i];
+ strWrite = strValue + strNote;
+ }
+ else
+ {
+ strWrite = strValue;
+ }
+
+ WritePrivateProfileString(section, key, strWrite, path);
+ }
+
+ #endregion
+
+ //=====================//=====================//=====================Read data
+
+ #region 读INI参数
+
+ ///
+ /// 从ini配置文件中读取字符串
+ ///
+ /// ini文件路径
+ /// 配置节名称
+ /// 键名
+ /// 要读取的string类型内容
+ public static string ReadString(string path, string section, string key)
+ {
+ // 每次从ini中读取多少字节 // section=配置节,key=键名,temp=上面,path=路径
+ System.Text.StringBuilder temp = new System.Text.StringBuilder(255);
+ GetPrivateProfileString(section, key, "", temp, 255, path);
+ String str = temp.ToString();
+ string[] strArr = str.Split(new char[] { ';' });
+ string strRead = "";
+ if (strArr.Length > 0)
+ {
+ strRead = strArr[0];
+ }
+
+ return strRead;
+ }
+
+ ///
+ /// 从ini配置文件中读取Int类型
+ ///
+ /// ini文件路径
+ /// 配置节名称
+ /// 键名
+ /// 读不到时默认返回值:0
+ /// 要读取的Int类型数据
+ public static int ReadInt(string path, string section, string key, int defValue = 0)
+ {
+ return GetPrivateProfileInt(section, key, defValue, path);
+ }
+
+ public static double ReadDouble(string path, string section, string key, double defValue = 0)
+ {
+ System.Text.StringBuilder temp = new System.Text.StringBuilder(255);
+ GetPrivateProfileString(section, key, defValue.ToString(), temp, 255, path);
+ String str = temp.ToString();
+ string[] strArr = str.Split(new char[] { ';' });
+ double ReData;
+ if (strArr.Length > 0)
+ {
+ ReData = Convert.ToDouble(strArr[0]);
+ }
+ else
+ {
+ ReData = defValue;
+ }
+
+ return ReData;
+ }
+
+ public static bool ReadBool(string path, string section, string key, int defValue = 0)
+ {
+ int val = GetPrivateProfileInt(section, key, defValue, path);
+ if (val != 0)
+ return true;
+ else
+ return false;
+ }
+
+ #endregion
+ }
+
+
+ //==================================================================================================SoundBase
+ ///
+ /// 声音播放类
+ ///
+ public class SoundBase
+ {
+ //public static WMPLib.WindowsMediaPlayer WMPlayer = new WMPLib.WindowsMediaPlayer();
+ ////方法 1
+ //public static void OpenWinMediaPlayer(string FileName)
+ //{
+ // if (!System.IO.File.Exists(FileName))
+ // {
+ // MessageBox.Show("File does not exist!");
+ // return;
+ // }
+ // WMPlayer.URL = FileName;
+ //}
+
+ //public static void OpenWinMediaPlayer(WMPLib.WindowsMediaPlayer WinMediaPlayer, string FileName)
+ //{
+ // if (!System.IO.File.Exists(FileName))
+ // {
+ // MessageBox.Show("File does not exist!");
+ // return;
+ // }
+ // WinMediaPlayer.URL = FileName;
+ //}
+
+ //public static void OpenWinMediaPlayerDialogFile()
+ //{
+ // OpenFileDialog FileDialog = new OpenFileDialog();
+ // FileDialog.AddExtension = true;
+ // FileDialog.CheckFileExists = true;
+ // FileDialog.CheckPathExists = true;
+ // //the next sentence must be in single line
+ // FileDialog.Filter = "WAV文件(*.wav)|*.wav|MP3文件(*.mp3)|*.mp3|VCD文件(*.dat)|*.dat|Audio文件(*.avi)|*.avi|所有文件 (*.*)|*.*";
+ // FileDialog.DefaultExt = "*.mp3";
+ // if (FileDialog.ShowDialog() == DialogResult.OK)
+ // {
+ // WMPlayer.URL = FileDialog.FileName;
+ // }
+ //}
+
+ //public static void OpenWinMediaPlayerDialogFile(WMPLib.WindowsMediaPlayer WinMediaPlayer)
+ //{
+ // OpenFileDialog FileDialog = new OpenFileDialog();
+ // FileDialog.AddExtension = true;
+ // FileDialog.CheckFileExists = true;
+ // FileDialog.CheckPathExists = true;
+ // //the next sentence must be in single line
+ // FileDialog.Filter = "WAV文件(*.wav)|*.wav|MP3文件(*.mp3)|*.mp3|VCD文件(*.dat)|*.dat|Audio文件(*.avi)|*.avi|所有文件 (*.*)|*.*";
+ // FileDialog.DefaultExt = "*.mp3";
+ // if (FileDialog.ShowDialog() == DialogResult.OK)
+ // {
+ // WinMediaPlayer.URL = FileDialog.FileName;
+ // }
+ //}
+
+ //方法 2
+ public static void sndPlayerPlay(string FileName)
+ {
+ if (!System.IO.File.Exists(FileName))
+ {
+ MessageBox.Show("File does not exist!");
+ return;
+ }
+
+ System.Media.SoundPlayer sndPlayer = new System.Media.SoundPlayer(FileName);
+ sndPlayer.Load();
+ sndPlayer.Play();
+ }
+
+ //方法 3
+ public static void SpVoicePlay(string FileName)
+ {
+ //if (!System.IO.File.Exists(FileName))
+ //{
+ // MessageBox.Show("File does not exist!");
+ // 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();
+ }
+
+ //方法 4 (蜂鸣器--控制台扬声器)
+ public static void Beep(int frequency, int duration)
+ {
+ //振动的Hz频率; //持续的时间,单位“毫秒”。
+ Console.Beep(frequency, duration);
+ }
+ }
+
+
+ //==================================================================================================
+ ///
+ /// 数据格式化或校验检测
+ ///
+ class FormatCheckBase
+ {
+ ///
+ /// 检测是否为十六进制字符串,长度不够在前面添加0
+ ///
+ /// 输入字符串
+ /// 长度
+ /// 输出字符串
+ /// 检测结果
+ public static void FormatChecking16(string strInput, int length, out string strOutput, out Boolean Valid)
+ {
+ strOutput = "";
+ Valid = true;
+ byte temp;
+ if ((strInput.Length <= length) & (strInput.Length > 0))
+ {
+ for (int i = 0; i < strInput.Length; i++)
+ {
+ try
+ {
+ temp = Convert.ToByte(strInput[i].ToString(), 16);
+ }
+ catch
+ {
+ Valid = false;
+ strOutput = "";
+ break;
+ }
+
+ strOutput += strInput[i];
+ }
+
+ if (Valid & (strInput.Length < length))
+ {
+ for (int j = 0; j < length - strInput.Length; j++)
+ {
+ strOutput = "0" + strOutput;
+ }
+ }
+ }
+ else
+ {
+ Valid = false;
+ strOutput = "";
+ }
+ }
+
+ ///
+ /// 检测是否为十进制字符串,长度不够在前面添加0
+ ///
+ /// 输入字符串
+ /// 长度
+ /// 输出字符串
+ /// 检测结果
+ public static bool FormatChecking10(string strInput, int length, out string strOutput)
+ {
+ strOutput = "";
+ byte temp;
+ try
+ {
+ if ((strInput.Length <= length) & (strInput.Length > 0))
+ {
+ for (int i = 0; i < strInput.Length; i++)
+ {
+ try
+ {
+ temp = Convert.ToByte(strInput[i].ToString(), 10);
+ }
+ catch
+ {
+ strOutput = "";
+ return false;
+ }
+
+ strOutput += strInput[i];
+ }
+
+ if (strInput.Length < length)
+ {
+ for (int j = 0; j < length - strInput.Length; j++)
+ {
+ strOutput = "0" + strOutput;
+ }
+ }
+ }
+ else
+ {
+ strOutput = "";
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("格式转换错误:" + ex.Message);
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// 每隔n个字符插入一个字符
+ ///
+ /// 从右边开始插入
+ /// 源字符串
+ /// 间隔字符数
+ /// 待插入值
+ /// 待补充值,最后不足间隔字符数时,用此字符补齐;Supplement=""时,不补任何字符。
+ /// 返回新生成字符串
+ public static string InsertFormat(bool isRight, string input, int interval, string value, string Supplement)
+ {
+ if (!isRight) //从左边开始插入
+ {
+ for (int i = interval; i < input.Length; i += interval + 1)
+ {
+ input = input.Insert(i, value);
+ }
+
+ if (Supplement != "")
+ {
+ do
+ {
+ if ((input.Length + 1) % (interval + 1) != 0)
+ {
+ input = input + Supplement;
+ }
+ } while ((input.Length + 1) % (interval + 1) != 0);
+ }
+ }
+ else //从右边开始插入
+ {
+ for (int i = input.Length - interval; i > 0; i -= interval)
+ {
+ input = input.Insert(i, value);
+ }
+
+ if (Supplement != "")
+ {
+ do
+ {
+ if ((input.Length + 1) % (interval + 1) != 0)
+ {
+ input = Supplement + input;
+ }
+ } while ((input.Length + 1) % (interval + 1) != 0);
+ }
+ }
+
+ return input;
+ }
+
+ ///
+ /// BCC校验,返回校验后的字符串
+ ///
+ /// 待校验字符串
+ /// 返回结果
+ public static string GetBCC(string strCmd)
+ {
+ if (strCmd.Length >= 2)
+ {
+ byte[] Buffer = Encoding.Default.GetBytes(strCmd);
+ byte byteBCC = Buffer[0];
+ for (int i = 1; i < Buffer.Length; i++)
+ byteBCC ^= Buffer[i];
+ return Convert.ToChar(byteBCC).ToString();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ ///
+ /// BCC校验,返回校验后的数组
+ ///
+ /// 待校验数组
+ /// 返回结果
+ public static byte[] GetBCC(byte[] byteData)
+ {
+ byte[] byteWrite = new byte[byteData.Length + 1];
+ if (byteData.Length >= 2)
+ {
+ byteData.CopyTo(byteWrite, 0);
+ byte byteBCC = byteData[0];
+ for (int i = 1; i < byteData.Length; i++)
+ byteBCC ^= byteData[i];
+ byteWrite[byteWrite.Length - 1] = byteBCC;
+ return byteWrite;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ ///
+ /// CRC16校验函数
+ ///
+ public class CRC16Check
+ {
+ private const int CRC_LEN = 0;
+
+ // Table of CRC values for high-order byte
+
+ #region
+
+ static readonly byte[] _auchCRCHi = new byte[]
+ {
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
+ 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
+ 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
+ 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
+ 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
+ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
+ 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
+ };
+
+ #endregion
+
+ // Table of CRC values for low-order byte
+
+ #region
+
+ static readonly byte[] _auchCRCLo = new byte[]
+ {
+ 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
+ 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
+ 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
+ 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
+ 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
+ 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
+ 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
+ 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
+ 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
+ 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
+ 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
+ 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
+ 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
+ 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
+ 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
+ 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
+ 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
+ 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
+ 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
+ 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
+ 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
+ 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
+ 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
+ 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
+ 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
+ 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
+ };
+
+ #endregion
+
+ ///
+ /// 计算CRC16校验值 返回一个ushort类型的值,如果要返回Crc高字节和低字节,可重写CalculateCrc16函数为:
+ ///
+ /// 待校验数组
+ /// 输出高字节
+ /// 输出低字节
+ /// 输出校验值
+ public static ushort CalculateCrc16(byte[] buffer, out byte crcHi, out byte crcLo)
+ {
+ crcHi = 0xff; // high crc byte initialized
+ crcLo = 0xff; // low crc byte initialized
+
+ for (int i = 0; i < buffer.Length - CRC_LEN; i++)
+ {
+ int crcIndex = crcHi ^ buffer[i]; // calculate the crc lookup index
+
+ crcHi = (byte)(crcLo ^ _auchCRCHi[crcIndex]);
+ crcLo = _auchCRCLo[crcIndex];
+ }
+
+ return (ushort)(crcHi << 8 | crcLo);
+ }
+ }
+ }
+
+
+ //==================================================================================================ConvertBase
+ ///
+ /// 数据转换类
+ ///
+ class ConvertBase
+ {
+ #region 图像 <--> 数组
+
+ ///
+ /// 图像转换为Byte数组
+ ///
+ static public byte[] ImageToByteArray(Image ImageIn)
+ {
+ MemoryStream ms = new MemoryStream();
+ ImageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
+ return ms.ToArray();
+ }
+
+ ///
+ /// Byte数组转换为图像
+ ///
+ static public Image byteArrayToImage(byte[] byteArrayIn)
+ {
+ MemoryStream ms = new MemoryStream(byteArrayIn);
+ Image returnImage = Image.FromStream(ms);
+ return returnImage;
+ }
+
+ #endregion
+
+ #region 字符串 -> 字节数组
+
+ ///
+ /// 十六进制(hexadecimal)字符串转换为字节数组
+ ///
+ ///
+ ///
+ public static byte[] HexStringToBytes(string str)
+ {
+ str = str.Replace(" ", "");
+ byte[] buffer = new byte[str.Length / 2];
+ for (int i = 0; i < str.Length; i += 2)
+ {
+ buffer[i / 2] = (byte)Convert.ToByte(str.Substring(i, 2), 16);
+ }
+
+ return buffer;
+ }
+
+ ///
+ /// 十进制(Decimalism)字符串转换为字节数组
+ ///
+ ///
+ ///
+ public static byte[] DecimalStringToBytes(string str)
+ {
+ str = str.Replace(" ", "");
+ byte[] buffer = new byte[str.Length];
+ for (int i = 0; i < str.Length; i++)
+ {
+ buffer[i] = (byte)Convert.ToByte(str.Substring(i, 1), 10);
+ }
+
+ return buffer;
+ }
+
+ #endregion
+
+ #region DataGridView -> DataTable 和 DataSet
+
+ public static DataTable GetDataTableFromDataGridView(DataGridView dv)
+ {
+ DataTable dt = new DataTable();
+ DataColumn dc;
+ for (int i = 0; i < dv.Columns.Count; i++)
+ {
+ dc = new DataColumn();
+ dc.ColumnName = dv.Columns[i].HeaderText.ToString();
+ dt.Columns.Add(dc);
+ }
+
+ for (int j = 0; j < dv.Rows.Count - 1; j++)
+ {
+ DataRow dr = dt.NewRow();
+ for (int x = 0; x < dv.Columns.Count; x++)
+ {
+ dr[x] = dv.Rows[j].Cells[x].Value;
+ }
+
+ dt.Rows.Add(dr);
+ }
+
+ return dt;
+ }
+
+ public static DataSet GetDataSetFromDataGridView(DataGridView ucgrd)
+ {
+ DataSet ds = new DataSet();
+ DataTable dt = new DataTable();
+ for (int j = 0; j < ucgrd.Columns.Count; j++)
+ {
+ dt.Columns.Add(ucgrd.Columns[j].HeaderCell.Value.ToString());
+ }
+
+ for (int j = 0; j < ucgrd.Rows.Count; j++)
+ {
+ DataRow dr = dt.NewRow();
+ for (int i = 0; i < ucgrd.Columns.Count; i++)
+ {
+ if (ucgrd.Rows[j].Cells[i].Value != null)
+ {
+ dr[i] = ucgrd.Rows[j].Cells[i].Value.ToString();
+ }
+ else
+ {
+ dr[i] = "";
+ }
+ }
+
+ dt.Rows.Add(dr);
+ }
+
+ ds.Tables.Add(dt);
+ return ds;
+ }
+
+ #endregion
+
+ #region ListBox.Items, ComboBox.Items -> string[]
+
+ public static string[] GetStringsFromListBox(ListBox mListBox)
+ {
+ string[] strings = new string[mListBox.Items.Count];
+ for (int i = 0; i < mListBox.Items.Count; i++)
+ {
+ strings[i] = mListBox.Items[i].ToString();
+ }
+
+ return strings;
+ }
+
+ public static string[] GetStringsFromListBox(ComboBox mComboBox)
+ {
+ string[] strings = new string[mComboBox.Items.Count];
+ for (int i = 0; i < mComboBox.Items.Count; i++)
+ {
+ strings[i] = mComboBox.Items[i].ToString();
+ }
+
+ return strings;
+ }
+
+ public static void AddStringsToListView(ListView m_ListView, string[] strings)
+ {
+ m_ListView.Items.Clear();
+ for (int i = 0; i < strings.Length; i++)
+ {
+ m_ListView.Items.Add(strings[i]);
+ }
+ }
+
+ #endregion
+
+ ///
+ /// 从SYGOLE获取的数据转换函数
+ ///
+ public class Tool
+ {
+ //将十六进制的字符串转化为ushort
+ public static ushort HexString2Ushort(string s)
+ {
+ ushort value = 0;
+
+ for (int i = 0; i < s.Length; i++)
+ {
+ if (s[i] != ' ')
+ {
+ value = (ushort)(value * 16 + HexStringToHex(s, i));
+ }
+ }
+
+ return value;
+ }
+
+ //将字节数组形式的mac地址转化为对应的字符串
+ public static string MacToString(byte[] mac)
+ {
+ string MacString = "";
+
+ for (int i = 0; i < 6; i++)
+ {
+ MacString += ByteToHexString(mac[i]);
+ if (i < 5)
+ {
+ MacString += ":";
+ }
+ }
+
+ return MacString;
+ }
+
+ //将字符串形式的mac地址转化为对应的字节数组
+ public static byte[] StringToMac(string str)
+ {
+ string temp = "";
+
+ for (int i = 0; i < str.Length; i++)
+ {
+ if ((str[i] != ' ') && (str[i] != ':'))
+ {
+ temp += str[i];
+ }
+ }
+
+ return HexStringToByte(temp, 0, 6); //6字节长度
+ }
+
+ //判断字符串是否是十六进制字符串
+ public static bool ValidHexString(string str)
+ {
+ for (int i = 0; i < str.Length; i++)
+ {
+ if (!
+ (((str[i] >= '0') && (str[i] <= '9')) ||
+ ((str[i] >= 'a') && (str[i] <= 'f')) ||
+ ((str[i] >= 'A') && (str[i] <= 'F')))
+ )
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static string GetStringWithoutSpace(string str, int pos)
+ {
+ string temp = "";
+ for (int i = pos; i < str.Length; i++)
+ {
+ if ((str[i] != ' ') && (str[i] != ':'))
+ {
+ temp += str[i];
+ }
+ }
+
+ return temp;
+ }
+
+ //将单个十六进制字符(4 bits)转化为byte
+ private static byte HexStringToHex(string str, int pos)
+ {
+ byte value = 0;
+
+ if ((str[pos] >= '0') && (str[pos] <= '9'))
+ {
+ value = (byte)(str[pos] - '0');
+ }
+ else if ((str[pos] >= 'a') && (str[pos] <= 'f'))
+ {
+ value = (byte)(str[pos] - 'a' + 10);
+ }
+ else if ((str[pos] >= 'A') && (str[pos] <= 'F'))
+ {
+ value = (byte)(str[pos] - 'A' + 10);
+ }
+
+ return value;
+ }
+
+ //将字符串的pos位置开始,转化为数组,转化后数组的长度为cnt
+ public static byte[] HexStringToByte(string str, int pos, int cnt)
+ {
+ if ((!ValidHexString(str)) || ((str.Length - pos) >> 1 < cnt))
+ {
+ return null;
+ }
+
+ byte[] data = new byte[cnt];
+
+ for (int i = 0; i < cnt; i++)
+ {
+ data[i] = (byte)(HexStringToHex(str, 2 * i + pos) * 16 + HexStringToHex(str, 2 * i + pos + 1));
+ }
+
+ return data;
+ }
+
+ public static string bytes2String(byte[] data, int offset, int len)
+ {
+ string outString = "";
+
+ for (int i = offset; i < len + offset; i++)
+ {
+ outString += (char)data[i];
+ }
+
+ return outString;
+ }
+
+ //将字符串的pos位置开始,转化为数组,转化后数组的长度为cnt
+ public static byte[] HexStringToByte(string str, int pos)
+ {
+ string tempStr = GetStringWithoutSpace(str, pos);
+
+ return HexStringToByte(tempStr, 0, tempStr.Length >> 1);
+ }
+
+ public static byte HexStringToSingleByte(string str, int pos)
+ {
+ byte temp = 0;
+ int len = 2;
+ string tempStr = GetStringWithoutSpace(str, pos);
+
+ if (tempStr.Length == 0)
+ {
+ return 0;
+ }
+ else if (tempStr.Length < 2)
+ {
+ len = tempStr.Length;
+ }
+ else
+ {
+ len = 2;
+ }
+
+ for (int i = 0; i < len; i++)
+ {
+ temp = (byte)(temp * 16 + HexStringToHex(tempStr, i));
+ }
+
+ return temp;
+ }
+
+ //将字符串的pos位置开始,转化int
+ public static int HexStringToInt(string s, int pos)
+ {
+ string str = "";
+ int len = (s.Length - pos) > 8 ? 8 : s.Length - pos;
+ for (int i = pos; i < len; i++)
+ {
+ str += s[i];
+ }
+
+ for (int i = len; i < 8; i++)
+ {
+ str = "0" + str;
+ }
+
+ if (!ValidHexString(str))
+ {
+ return 0;
+ }
+
+ int result = 0;
+ byte[] data = HexStringToByte(str, 0, 4);
+
+ for (int i = 0; i < 4; i++)
+ {
+ result = (result << 8) + data[i];
+ }
+
+ return result;
+ }
+
+ //将字节类型的数据转化为十六进制字符串
+ public static string ByteToHexString(byte data)
+ {
+ string outString = "";
+
+ if (data < 16)
+ {
+ outString += "0";
+ }
+
+ outString += data.ToString("X");
+
+ return outString;
+ }
+
+ //将字节类型的数据转化为十六进制字符串
+ public static string ByteToHexString(byte[] data, int pos, int length, string space)
+ {
+ string outString = "";
+
+ for (int i = pos; i < pos + length; i++)
+ {
+ outString += ByteToHexString(data[i]);
+ if (i != pos + length - 1)
+ {
+ outString += space;
+ }
+ }
+
+ return outString;
+ }
+
+ //将ushort类型的数据转化为十六进制字符串
+ public static string ushortToHexString(ushort[] data, int pos, int length)
+ {
+ string outString = "";
+
+ for (int i = pos; i < pos + length; i++)
+ {
+ outString += ByteToHexString((byte)(data[i] >> 8));
+ outString += ByteToHexString((byte)(data[i] & 0xFF));
+ }
+
+ return outString;
+ }
+ }
+
+ //==========================================================================================
+ public class MyConvert
+ {
+ //string a = Convert.ToString(5, 2);
+ //string b = Convert.ToString(11, 8);
+ //string c = Convert.ToString(11, 16);
+ //int aa = Convert.ToInt32("101", 2);//二进制转换10进制
+ //int bb = Convert.ToInt32("13", 8); //八进制转换10进制
+ //int cc = Convert.ToInt32("b", 16); //十六进制转换10进制
+
+ #region C++转换程序(C#里面有完整的转换函数)
+
+ //十进制转二制
+ public static string DtoB(int d)
+ {
+ //Console.WriteLine(Convert.ToString(5,2))
+ string str = "";
+ //判断该数如果小于2,则直接输出
+ if (d < 2)
+ {
+ str = d.ToString();
+ }
+ else
+ {
+ int c;
+ int s = 0;
+ int n = d;
+ while (n >= 2)
+ {
+ s++;
+ n = n / 2;
+ }
+
+ int[] m = new int[s];
+ int i = 0;
+ do
+ {
+ c = d / 2;
+ m[i++] = d % 2;
+ d = c;
+ } while (c >= 2);
+
+ str = d.ToString();
+ for (int j = m.Length - 1; j >= 0; j--)
+ {
+ str += m[j].ToString();
+ }
+ }
+
+ return str;
+ }
+
+ //十进制转八进制
+ public static string DtoO(int d)
+ {
+ string o = "";
+ if (d < 8)
+ {
+ o = d.ToString();
+ }
+ else
+ {
+ int c;
+
+ int s = 0;
+ int n = d;
+ int temp = d;
+ while (n >= 8)
+ {
+ s++;
+ n = n / 8;
+ }
+
+ int[] m = new int[s];
+ int i = 0;
+ do
+ {
+ c = d / 8;
+ m[i++] = d % 8;
+ d = c;
+ } while (c >= 8);
+
+ o = d.ToString();
+ for (int j = m.Length - 1; j >= 0; j--)
+ {
+ o += m[j];
+ }
+ }
+
+ return o;
+ }
+
+ //十进制转十六进制
+ public static string DtoX(int d)
+ {
+ string x = "";
+ if (d < 16)
+ {
+ x = chang(d);
+ }
+ else
+ {
+ int c;
+ int s = 0;
+ int n = d;
+ int temp = d;
+ while (n >= 16)
+ {
+ s++;
+ n = n / 16;
+ }
+
+ string[] m = new string[s];
+ int i = 0;
+ do
+ {
+ c = d / 16;
+ m[i++] = chang(d % 16); //判断是否大于10,如果大于10,则转换为A~F的格式
+ d = c;
+ } while (c >= 16);
+
+ x = chang(d);
+ for (int j = m.Length - 1; j >= 0; j--)
+ {
+ x += m[j];
+ }
+ }
+
+ return x;
+ }
+
+ //判断是否为10~15之间的数,如果是则进行转换
+ public static string chang(int d)
+ {
+ string x = "";
+ switch (d)
+ {
+ case 10:
+ x = "A";
+ break;
+ case 11:
+ x = "B";
+ break;
+ case 12:
+ x = "C";
+ break;
+ case 13:
+ x = "D";
+ break;
+ case 14:
+ x = "E";
+ break;
+ case 15:
+ x = "F";
+ break;
+ default:
+ x = d.ToString();
+ break;
+ }
+
+ return x;
+ }
+
+ public static int XtoD(string instr)
+ {
+ int i = Convert.ToInt32("FF", 16); //十六进制转换10进制
+ int j = Convert.ToInt32("1100", 2);
+ int k = Convert.ToInt32("12", 8);
+ return i;
+ }
+
+ #endregion
+ }
+ }
+
+
+ //==================================================================================================TcpBase
+ ///
+ /// 网络通讯通用类函数库
+ ///
+ class TcpBase
+ {
+ ///
+ /// 用CMD命令测试网络连接状态
+ ///
+ /// IP地址或网址
+ /// Ping结果 连接;超时或其他结果表示未连接
+ public static string CmdPing(string strIp)
+ {
+ Process p = new Process();
+ p.StartInfo.FileName = "cmd.exe";
+ p.StartInfo.UseShellExecute = false;
+ p.StartInfo.RedirectStandardInput = true;
+ p.StartInfo.RedirectStandardOutput = true;
+ p.StartInfo.RedirectStandardError = true;
+ p.StartInfo.CreateNoWindow = true;
+ p.Start();
+ p.StandardInput.WriteLine("ping -n 1 " + strIp);
+ p.StandardInput.WriteLine("exit");
+
+ string strRst = p.StandardOutput.ReadToEnd();
+ string pingRst = "";
+ if (strRst.Contains("(0% loss)") || strRst.Contains("(0% 丢失)"))
+ pingRst = "连接";
+ else if (strRst.Contains("Request timed out") || strRst.Contains("请求超时"))
+ pingRst = "超时";
+ else if (strRst.Contains("Unknown host") || strRst.Contains("无法解析主机"))
+ pingRst = "无法解析主机";
+ else if (strRst.Contains("请求找不到主机"))
+ pingRst = "请求找不到主机";
+ else if (strRst.Contains("Destination host unreachable."))
+ pingRst = "无法到达目的主机";
+ else
+ pingRst = strRst;
+ p.Close();
+ return pingRst;
+ }
+ }
+
+
+ //==================================================================================================MyMath
+ ///
+ /// 数学函数库(算法)
+ ///
+ class MyMath
+ {
+ public static double GetMax(double[] Datas)
+ {
+ double Max = -9999;
+ try
+ {
+ if (Datas.Length == 1)
+ return Datas[0];
+ for (int i = 0; i < Datas.Length; i++)
+ {
+ Max = Math.Max(Datas[i], Max);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+
+ return Max;
+ }
+
+ public static double GetMin(double[] Datas)
+ {
+ double Min = 9999;
+ try
+ {
+ if (Datas.Length == 1)
+ return Datas[0];
+ for (int i = 0; i < Datas.Length; i++)
+ {
+ Min = Math.Min(Datas[i], Min);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+
+ return Min;
+ }
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址,从0开始
+ /// 返回整形数据或-1
+ public static int GetPlcData(byte[] byteData, int DataAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (byteData.Length < 10 + DataAddr * 2)
+ {
+ return -1;
+ }
+ else
+ {
+ int bitH = DataAddr * 2 + 9;
+ int bitL = DataAddr * 2 + 10;
+ return byteData[bitH] * 256 + byteData[bitL];
+ }
+ }
+ catch
+ {
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址
+ /// PLC读取起始地址
+ /// 返回整形数据或-1
+ public static int GetPlcData(byte[] byteData, int DataAddr, int startAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ //MessageBox.Show("错误:要读取的数据小于起始地址");
+ return -1;
+ }
+
+ if (byteData.Length < 9 + (DataAddr - startAddr) * 2)
+ {
+ return -1;
+ }
+ else
+ {
+ int bitH = (DataAddr - startAddr) * 2 + 9;
+ int bitL = (DataAddr - startAddr) * 2 + 10;
+ return byteData[bitH] * 256 + byteData[bitL];
+ }
+ }
+ catch
+ {
+ //MessageBox.Show("Catch错误:" + ex.Message);
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取字节的某一位
+ ///
+ /// 从0开始
+ ///
+ public static bool GetPlcBit(int data, int index)
+ {
+ switch (index)
+ {
+ case 0:
+ return (data & 0x0001) > 0;
+ case 1:
+ return (data & 0x0002) > 0;
+ case 2:
+ return (data & 0x0004) > 0;
+ case 3:
+ return (data & 0x0008) > 0;
+ case 4:
+ return (data & 0x0010) > 0;
+ case 5:
+ return (data & 0x0020) > 0;
+ case 6:
+ return (data & 0x0040) > 0;
+ case 7:
+ return (data & 0x0080) > 0;
+ case 8:
+ return (data & 0x0100) > 0;
+ case 9:
+ return (data & 0x0200) > 0;
+ case 10:
+ return (data & 0x0400) > 0;
+ case 11:
+ return (data & 0x0800) > 0;
+ case 12:
+ return (data & 0x1000) > 0;
+ case 13:
+ return (data & 0x2000) > 0;
+ case 14:
+ return (data & 0x4000) > 0;
+ case 15:
+ return (data & 0x8000) > 0;
+ default:
+ return false;
+ }
+ }
+
+ public static bool GetPlcBitH2Low(int data, int index)
+ {
+ switch (index)
+ {
+ case 0:
+ return (data & 0x0100) > 0;
+ case 1:
+ return (data & 0x0200) > 0;
+ case 2:
+ return (data & 0x0400) > 0;
+ case 3:
+ return (data & 0x0800) > 0;
+ case 4:
+ return (data & 0x1000) > 0;
+ case 5:
+ return (data & 0x2000) > 0;
+ case 6:
+ return (data & 0x4000) > 0;
+ case 7:
+ return (data & 0x8000) > 0;
+
+ case 8:
+ return (data & 0x0001) > 0;
+ case 9:
+ return (data & 0x0002) > 0;
+ case 10:
+ return (data & 0x0004) > 0;
+ case 11:
+ return (data & 0x0008) > 0;
+ case 12:
+ return (data & 0x0010) > 0;
+ case 13:
+ return (data & 0x0020) > 0;
+ case 14:
+ return (data & 0x0040) > 0;
+ case 15:
+ return (data & 0x0080) > 0;
+ default:
+ return false;
+ }
+ }
+
+ ///
+ /// 获取字节的某一位
+ ///
+ /// 从0开始
+ ///
+ public static bool GetPlcBit(byte[] byteData, int DataAddr, int index, int startAddr)
+ {
+ int Value = GetPlcData(byteData, DataAddr, startAddr);
+ bool bResult = GetPlcBit(Value, index);
+ return bResult;
+ }
+
+ public static bool GetPlcBitH2Low(byte[] byteData, int DataAddr, int index, int startAddr)
+ {
+ int Value = GetPlcData(byteData, DataAddr, startAddr);
+ bool bResult = GetPlcBitH2Low(Value, index);
+ return bResult;
+ }
+
+
+ ///
+ /// 获取单精度浮点数(float)数据
+ ///
+ /// PLC读取总数据
+ /// 获取数据的地址
+ /// PLC起始地址
+ /// 数据正反序
+ ///
+ public static float GetPlcSingle(byte[] byteData, int DataAddr, int startAddr, bool PositiveSequence = true)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ return -1;
+ }
+
+ if (byteData.Length < 9 + (DataAddr - startAddr) * 2)
+ {
+ return -1;
+ }
+ else
+ {
+ float Result = -1;
+ int startBit = (DataAddr - startAddr) * 2 + 9;
+
+ byte[] arrLength = new byte[4];
+ arrLength[0] = byteData[startBit + 0];
+ arrLength[1] = byteData[startBit + 1];
+ arrLength[2] = byteData[startBit + 2];
+ arrLength[3] = byteData[startBit + 3];
+
+ if (PositiveSequence)
+ {
+ Result = BitConverter.ToSingle(arrLength, 0);
+ }
+ else
+ {
+ Result = BitConverter.ToSingle(arrLength.Reverse().ToArray(), 0);
+ }
+
+ Result = Convert.ToSingle(Math.Round(Result, 3));
+ return Result;
+ }
+ }
+ catch
+ {
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取字符串(string)
+ ///
+ /// PLC读取总数据
+ /// 获取数据的地址
+ /// PLC起始地址
+ /// 读取的地址数量(单位16)
+ /// 数据正反序
+ /// 转换为字符串类型,2=二进制,10=十进制,16=十六进制,其他=char字符串
+ ///
+ public static string GetPlcString(byte[] byteData, int DataAddr, int startAddr, int DataNum,
+ bool PositiveSequence = true, int strType = 0)
+ {
+ string Result = "";
+ try
+ {
+ if (byteData == null)
+ {
+ return Result;
+ }
+
+ if (startAddr > DataAddr + DataNum)
+ {
+ return Result;
+ }
+
+ if (byteData.Length < 9 + (DataAddr - startAddr) * 2)
+ {
+ return Result;
+ }
+ else
+ {
+ int startBit = (DataAddr - startAddr) * 2 + 9;
+ byte[] arrLength = new byte[DataNum * 2];
+ for (int i = 0; i < DataNum * 2; i++)
+ {
+ arrLength[i] = byteData[startBit + i];
+ }
+
+ if (!PositiveSequence)
+ {
+ arrLength = (byte[])arrLength.Reverse();
+ }
+
+ switch (strType)
+ {
+ case 2:
+ foreach (byte b in arrLength)
+ {
+ Result += ConvertBase.MyConvert.DtoB(b);
+ }
+
+ break;
+ case 10:
+ foreach (byte b in arrLength)
+ {
+ Result += b.ToString();
+ }
+
+ break;
+ case 16:
+ foreach (byte b in arrLength)
+ {
+ Result += b.ToString("X2");
+ }
+
+ break;
+
+ default:
+ foreach (byte b in arrLength)
+ {
+ Result += Convert.ToChar(b).ToString();
+ }
+
+ break;
+ }
+
+ return Result.Trim();
+ }
+ }
+ catch
+ {
+ return Result;
+ }
+ }
+
+
+ //======================================================================
+ ///
+ /// 字节数组(byte 8位)转化为ushort(16位)数组
+ ///
+ public static ushort[] GetushortsFromValue(byte[] Value)
+ {
+ ushort[] rtnValues;
+ byte[] bytes = Value;
+ int Length = bytes.Length / 2;
+ if (bytes.Length % 2 == 0)
+ {
+ rtnValues = new ushort[Length];
+ for (int i = 0; i < bytes.Length; i += 2)
+ {
+ rtnValues[i / 2] = BitConverter.ToUInt16(bytes, i);
+ }
+ }
+ else
+ {
+ rtnValues = new ushort[bytes.Length / 2 + 1];
+ for (int i = 0; i < bytes.Length - 1; i += 2)
+ {
+ rtnValues[i / 2] = BitConverter.ToUInt16(bytes, i);
+ }
+
+ rtnValues[bytes.Length / 2] = bytes[bytes.Length - 1];
+ }
+
+ return rtnValues;
+ }
+
+ ///
+ /// 字符串(string)转化为ushort(16位)数组
+ ///
+ public static ushort[] GetushortsFromValue(string Value)
+ {
+ byte[] bytes = System.Text.Encoding.Default.GetBytes(Value);
+ ushort[] ushorts = GetushortsFromValue(bytes);
+ return ushorts;
+ }
+
+ ///
+ /// 单精度小数(float 32位)转化为ushort(16位)数组
+ ///
+ public static ushort[] GetushortsFromValue(float Value)
+ {
+ byte[] bytes = BitConverter.GetBytes(Value);
+ ushort[] ushorts = GetushortsFromValue(bytes);
+ return ushorts;
+ }
+
+ ///
+ /// 双精度小数(double 64位)转化为ushort(16位)数组
+ ///
+ public static ushort[] GetushortsFromValue(double Value)
+ {
+ byte[] bytes = BitConverter.GetBytes(Value);
+ ushort[] ushorts = GetushortsFromValue(bytes);
+ return ushorts;
+ }
+
+
+ //======================================================================
+ ///
+ /// 字节数组(byte 8位)转化为short(16位)数组
+ ///
+ public static short[] GetshortsFromValue(byte[] Value)
+ {
+ short[] rtnValues;
+ byte[] bytes = Value;
+ int Length = bytes.Length / 2;
+ if (bytes.Length % 2 == 0)
+ {
+ rtnValues = new short[Length];
+ for (int i = 0; i < bytes.Length; i += 2)
+ {
+ rtnValues[i / 2] = BitConverter.ToInt16(bytes, i);
+ }
+ }
+ else
+ {
+ rtnValues = new short[bytes.Length / 2 + 1];
+ for (int i = 0; i < bytes.Length - 1; i += 2)
+ {
+ rtnValues[i / 2] = BitConverter.ToInt16(bytes, i);
+ }
+
+ rtnValues[bytes.Length / 2] = bytes[bytes.Length - 1];
+ }
+
+ return rtnValues;
+ }
+
+ ///
+ /// 字符串(string)转化为short(16位)数组
+ ///
+ public static short[] GetshortsFromValue(string Value)
+ {
+ byte[] bytes = System.Text.Encoding.Default.GetBytes(Value);
+ short[] shorts = GetshortsFromValue(bytes);
+ return shorts;
+ }
+
+ ///
+ /// 整形(int 32位)转化为short(16位)数组
+ ///
+ public static short[] GetshortsFromValue(int Value)
+ {
+ byte[] bytes = BitConverter.GetBytes(Value);
+ short[] shorts = GetshortsFromValue(bytes);
+ return shorts;
+ }
+
+ ///
+ /// 单精度小数(float 32位)转化为short(16位)数组
+ ///
+ public static short[] GetshortsFromValue(float Value)
+ {
+ byte[] bytes = BitConverter.GetBytes(Value);
+ short[] shorts = GetshortsFromValue(bytes);
+ return shorts;
+ }
+
+ ///
+ /// 双精度小数(double 64位)转化为ushort(16位)数组
+ ///
+ public static short[] GetshortsFromValue(double Value)
+ {
+ byte[] bytes = BitConverter.GetBytes(Value);
+ short[] shorts = GetshortsFromValue(bytes);
+ return shorts;
+ }
+ }
+
+ class CodeDfn
+ {
+ public const string BlankSpace = " ";
+ public const string strEnter = "\r\n";
+ }
+
+ class PlcMath
+ {
+ #region S7协议数据处理(以字节为基础)
+
+ public static bool GetS7BoolBit(byte data, int index)
+ {
+ switch (index)
+ {
+ case 0: return (data & 0x01) > 0;
+ case 1: return (data & 0x02) > 0;
+ case 2: return (data & 0x04) > 0;
+ case 3: return (data & 0x08) > 0;
+ case 4: return (data & 0x10) > 0;
+ case 5: return (data & 0x20) > 0;
+ case 6: return (data & 0x40) > 0;
+ case 7: return (data & 0x80) > 0;
+ default: return false;
+ }
+ }
+
+ public static bool GetS7BoolData(byte[] byteData, int DataAddr, int startAddr, int index)
+ {
+ byte data = GetS7ByteData(byteData, DataAddr, startAddr);
+ return GetS7BoolBit(data, index);
+ }
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址
+ /// PLC读取起始地址
+ /// 返回整形数据或-1
+ public static byte GetS7ByteData(byte[] byteData, int DataAddr, int startAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return 0;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ MessageBox.Show("错误:获取S7字节数据, 要读取的数据小于起始地址");
+ return 0;
+ }
+
+ if (byteData.Length < (DataAddr - startAddr))
+ {
+ MessageBox.Show("错误:获取S7字节数据, 要读取的偏移地址超出数组长度,偏移=" + (DataAddr - startAddr) + ", 数组长度=" +
+ byteData.Length);
+ return 0;
+ }
+ else
+ {
+ int bit = DataAddr - startAddr;
+ return byteData[bit];
+ }
+ }
+ catch
+ {
+ //MessageBox.Show("Catch错误:" + ex.Message);
+ return 0;
+ }
+ }
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址
+ /// PLC读取起始地址
+ /// 返回整形数据或-1
+ public static byte GetS7ByteData(byte[] byteData, int DataAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return 0;
+ }
+
+ if (byteData.Length < byteData.Length)
+ {
+ MessageBox.Show("获取S7字节数据,地址超出数组长度!", "警告");
+ return 0;
+ }
+
+ return byteData[DataAddr];
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("Catch错误:获取S7字节数据" + ex.Message);
+ return 0;
+ }
+ }
+
+ public static int GetS7WordData(byte[] byteData, int DataAddr, int startAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ //MessageBox.Show("错误:要读取的数据小于起始地址");
+ return -1;
+ }
+
+ if (byteData.Length < (DataAddr - startAddr) * 2)
+ {
+ return -1;
+ }
+ else
+ {
+ //int bitH = (DataAddr - startAddr) * 2;
+ //int bitL = (DataAddr - startAddr) * 2 + 1;
+ int bitH = (DataAddr - startAddr);
+ int bitL = (DataAddr - startAddr) + 1;
+ return byteData[bitH] * 256 + byteData[bitL];
+ }
+ }
+ catch
+ {
+ //MessageBox.Show("Catch错误:" + ex.Message);
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取字符串(string)
+ ///
+ /// PLC读取总数据
+ /// 获取数据的地址
+ /// PLC起始地址
+ /// 读取的地址数量(单位16)
+ /// 数据正反序
+ /// 转换为字符串类型,2=二进制,10=十进制,16=十六进制,其他=char字符串
+ ///
+ public static string GetS7StringData(byte[] byteData, int DataAddr, int startAddr, int DataNum, int strType = 0,
+ bool PositiveSequence = true)
+ {
+ string Result = "";
+ try
+ {
+ if (byteData == null)
+ {
+ return Result;
+ }
+
+ if (startAddr > DataAddr + DataNum)
+ {
+ return Result;
+ }
+
+ if (byteData.Length < (DataAddr - startAddr))
+ {
+ return Result;
+ }
+ else
+ {
+ int startBit = (DataAddr - startAddr);
+ byte[] arrLength = new byte[DataNum];
+ for (int i = 0; i < DataNum; i++)
+ {
+ arrLength[i] = byteData[startBit + i];
+ }
+
+ if (!PositiveSequence)
+ {
+ arrLength = (byte[])arrLength.Reverse();
+ }
+
+ switch (strType)
+ {
+ case 2:
+ foreach (byte b in arrLength)
+ {
+ Result += ConvertBase.MyConvert.DtoB(b);
+ }
+
+ break;
+ case 10:
+ foreach (byte b in arrLength)
+ {
+ Result += b.ToString();
+ }
+
+ break;
+ case 16:
+ foreach (byte b in arrLength)
+ {
+ Result += b.ToString("X2");
+ }
+
+ break;
+ default:
+ foreach (byte b in arrLength)
+ {
+ if (b >= 32)
+ Result += Convert.ToChar(b).ToString();
+ }
+
+ break;
+ }
+
+ return Result.Trim();
+ }
+ }
+ catch
+ {
+ return Result;
+ }
+ }
+
+ #endregion
+
+
+ #region ModbusTCP/FinsTCP协议数据处理(以字为基础)
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址,从0开始
+ /// 返回整形数据或-1
+ public static int GetPlcData(byte[] byteData, int DataAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (byteData.Length < DataAddr * 2)
+ {
+ return -1;
+ }
+ else
+ {
+ int bitH = DataAddr * 2;
+ int bitL = DataAddr * 2 + 1;
+ return byteData[bitH] * 256 + byteData[bitL];
+ }
+ }
+ catch
+ {
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址
+ /// PLC读取起始地址
+ /// 返回整形数据或-1
+ public static byte GetPlcByteData(byte[] byteData, int DataAddr, int startAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return 0;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ //MessageBox.Show("错误:要读取的数据小于起始地址");
+ return 0;
+ }
+
+ //if (byteData.Length < (DataAddr - startAddr) * 2)
+ if (byteData.Length < (DataAddr - startAddr))
+ {
+ return 0;
+ }
+ else
+ {
+ int bit = DataAddr - startAddr;
+ return byteData[bit];
+ }
+ }
+ catch
+ {
+ //MessageBox.Show("Catch错误:" + ex.Message);
+ return 0;
+ }
+ }
+
+ ///
+ /// 获取PLC读取地址数据(从起始地址偏移)
+ ///
+ /// 数据数组
+ /// PLC读取地址
+ /// PLC读取起始地址
+ /// 返回整形数据或-1
+ public static int GetPlcData(byte[] byteData, int DataAddr, int startAddr)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ //MessageBox.Show("错误:要读取的数据小于起始地址");
+ return -1;
+ }
+
+ if (byteData.Length < (DataAddr - startAddr) * 2)
+ {
+ return -1;
+ }
+ else
+ {
+ int bitH = (DataAddr - startAddr) * 2;
+ int bitL = (DataAddr - startAddr) * 2 + 1;
+ return byteData[bitH] * 256 + byteData[bitL];
+ }
+ }
+ catch
+ {
+ //MessageBox.Show("Catch错误:" + ex.Message);
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取字节的某一位
+ ///
+ /// 从0开始
+ ///
+ public static bool GetPlcBit(int data, int index)
+ {
+ switch (index)
+ {
+ case 0:
+ return (data & 0x0001) > 0;
+ case 1:
+ return (data & 0x0002) > 0;
+ case 2:
+ return (data & 0x0004) > 0;
+ case 3:
+ return (data & 0x0008) > 0;
+ case 4:
+ return (data & 0x0010) > 0;
+ case 5:
+ return (data & 0x0020) > 0;
+ case 6:
+ return (data & 0x0040) > 0;
+ case 7:
+ return (data & 0x0080) > 0;
+ case 8:
+ return (data & 0x0100) > 0;
+ case 9:
+ return (data & 0x0200) > 0;
+ case 10:
+ return (data & 0x0400) > 0;
+ case 11:
+ return (data & 0x0800) > 0;
+ case 12:
+ return (data & 0x1000) > 0;
+ case 13:
+ return (data & 0x2000) > 0;
+ case 14:
+ return (data & 0x4000) > 0;
+ case 15:
+ return (data & 0x8000) > 0;
+ default:
+ return false;
+ }
+ }
+
+ public static bool GetPlcBitH2Low(int data, int index)
+ {
+ switch (index)
+ {
+ case 0:
+ return (data & 0x0100) > 0;
+ case 1:
+ return (data & 0x0200) > 0;
+ case 2:
+ return (data & 0x0400) > 0;
+ case 3:
+ return (data & 0x0800) > 0;
+ case 4:
+ return (data & 0x1000) > 0;
+ case 5:
+ return (data & 0x2000) > 0;
+ case 6:
+ return (data & 0x4000) > 0;
+ case 7:
+ return (data & 0x8000) > 0;
+
+ case 8:
+ return (data & 0x0001) > 0;
+ case 9:
+ return (data & 0x0002) > 0;
+ case 10:
+ return (data & 0x0004) > 0;
+ case 11:
+ return (data & 0x0008) > 0;
+ case 12:
+ return (data & 0x0010) > 0;
+ case 13:
+ return (data & 0x0020) > 0;
+ case 14:
+ return (data & 0x0040) > 0;
+ case 15:
+ return (data & 0x0080) > 0;
+ default:
+ return false;
+ }
+ }
+
+ ///
+ /// 获取字节的某一位
+ ///
+ /// 从0开始
+ ///
+ public static bool GetPlcBit(byte[] byteData, int DataAddr, int index, int startAddr)
+ {
+ int Value = GetPlcData(byteData, DataAddr, startAddr);
+ bool bResult = GetPlcBit(Value, index);
+ return bResult;
+ }
+
+ public static bool GetPlcBitH2Low(byte[] byteData, int DataAddr, int index, int startAddr)
+ {
+ int Value = GetPlcData(byteData, DataAddr, startAddr);
+ bool bResult = GetPlcBitH2Low(Value, index);
+ return bResult;
+ }
+
+ ///
+ /// 获取单精度浮点数(float)数据
+ ///
+ /// PLC读取总数据
+ /// 获取数据的地址
+ /// PLC起始地址
+ /// 数据正反序
+ ///
+ public static float GetPlcSingle(byte[] byteData, int DataAddr, int startAddr, bool PositiveSequence)
+ {
+ try
+ {
+ if (byteData == null)
+ {
+ return -1;
+ }
+
+ if (startAddr > DataAddr)
+ {
+ return -1;
+ }
+
+ if (byteData.Length < (DataAddr - startAddr))
+ {
+ return -1;
+ }
+ else
+ {
+ float Result = -1;
+ int startBit = (DataAddr - startAddr);
+
+ byte[] arrLength = new byte[4];
+ arrLength[0] = byteData[startBit + 0];
+ arrLength[1] = byteData[startBit + 1];
+ arrLength[2] = byteData[startBit + 2];
+ arrLength[3] = byteData[startBit + 3];
+
+ if (PositiveSequence)
+ {
+ Result = BitConverter.ToSingle(arrLength, 0);
+ }
+ else
+ {
+ Result = BitConverter.ToSingle(arrLength.Reverse().ToArray(), 0);
+ }
+
+ Result = Convert.ToSingle(Math.Round(Result, 3));
+ return Result;
+ }
+ }
+ catch
+ {
+ return -1;
+ }
+ }
+
+ ///
+ /// 获取字符串(string)
+ ///
+ /// PLC读取总数据
+ /// 获取数据的地址
+ /// PLC起始地址
+ /// 读取的地址数量(单位16)
+ /// 数据正反序
+ /// 转换为字符串类型,2=二进制,10=十进制,16=十六进制,其他=char字符串
+ ///
+ public static string GetPlcString(byte[] byteData, int DataAddr, int startAddr, int DataNum, int strType = 0,
+ bool PositiveSequence = true)
+ {
+ string Result = "";
+ try
+ {
+ if (byteData == null)
+ {
+ return Result;
+ }
+
+ if (startAddr > DataAddr + DataNum)
+ {
+ return Result;
+ }
+
+ if (byteData.Length < (DataAddr - startAddr) * 2)
+ {
+ return Result;
+ }
+ else
+ {
+ int startBit = (DataAddr - startAddr) * 2;
+ byte[] arrLength = new byte[DataNum * 2];
+ for (int i = 0; i < DataNum * 2; i++)
+ {
+ arrLength[i] = byteData[startBit + i];
+ }
+
+ if (!PositiveSequence)
+ {
+ arrLength = (byte[])arrLength.Reverse();
+ }
+
+ switch (strType)
+ {
+ case 2:
+ foreach (byte b in arrLength)
+ {
+ Result += ConvertBase.MyConvert.DtoB(b);
+ }
+
+ break;
+ case 10:
+ foreach (byte b in arrLength)
+ {
+ Result += b.ToString();
+ }
+
+ break;
+ case 16:
+ foreach (byte b in arrLength)
+ {
+ Result += b.ToString("X2");
+ }
+
+ break;
+ default:
+ foreach (byte b in arrLength)
+ {
+ if (b >= 32)
+ Result += Convert.ToChar(b).ToString();
+ }
+
+ break;
+ }
+
+ return Result.Trim();
+ }
+ }
+ catch
+ {
+ return Result;
+ }
+ }
+
+ #endregion
+ }
+
+ public class IPAddressValidator
+ {
+ public static bool IsIPAddressValid(string ipAddress)
+ {
+ string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
+ return Regex.IsMatch(ipAddress, pattern);
+ }
+ }
+}
\ No newline at end of file
diff --git a/HexcalMC/Base/DebugDfn.cs b/HexcalMC/Base/DebugDfn.cs
new file mode 100644
index 0000000..88ea8e1
--- /dev/null
+++ b/HexcalMC/Base/DebugDfn.cs
@@ -0,0 +1,129 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HexcalMC.Base
+{
+ public class DebugDfn
+ {
+ public static string strDebugFile = Application.StartupPath + "\\File\\Debug.txt";
+ public static string strDebugSavePath = Application.StartupPath + "\\File\\DebugFiles";
+ public static string strDebugFileTemp = Application.StartupPath + "\\File\\DebugTemp.txt"; //临时存储,用于菜单查看
+ static string strStartTime = ""; //程序启动时间
+ static string strEndTime = ""; //程序关闭时间
+
+ public static RichTextBox textBox_Msg;
+
+
+ //=================================================================
+ public static void StartDebugObj()
+ {
+ System.IO.TextWriter log = new System.IO.StreamWriter(DebugDfn.strDebugFile);
+ TextWriterTraceListener logger = new TextWriterTraceListener(log);
+ Trace.Listeners.Add(logger);
+ strStartTime = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");
+ }
+
+ public static void SaveDebugFile()
+ {
+ AddLog("软件关闭!");
+ strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss");
+ string CopyFileName = strDebugSavePath + "\\DebugFiles\\" + "Debug(" + strStartTime + " To " +
+ strEndTime + ")" + ".txt";
+ if (File.Exists(strDebugFile))
+ File.Copy(strDebugFile, CopyFileName, true);
+ }
+
+ //=================================================================
+
+ #region 信息显示
+
+ public static void AddLog(string str)
+ {
+ MyBase.TraceWriteLine(str);
+ }
+
+ public static void AddLogText(string str, Color m_Color = new Color())
+ {
+ MyBase.TraceWriteLine(str);
+ try
+ {
+ textBox_Msg.BeginInvoke((EventHandler)delegate
+ {
+ Color SetColor = Color.White;
+ if (m_Color == new Color())
+ {
+ if (str.ToUpper().Contains("ERROR") || str.ToUpper().Contains("错误") ||
+ str.ToUpper().Contains("出错") || str.ToUpper().Contains("EXCEPTION") ||
+ str.ToUpper().Contains("异常") || str.ToUpper().Contains("失败"))
+ {
+ SetColor = Color.Red;
+ }
+ else if (str.ToUpper().Contains("WARNING") || str.ToUpper().Contains("警告"))
+ {
+ SetColor = Color.DarkOrange;
+ }
+ }
+ else
+ {
+ SetColor = m_Color;
+ }
+
+ string strText = DateTime.Now.ToString("HH:mm:ss.ff") + "--" + str + Environment.NewLine;
+ textBox_Msg.SelectionStart = textBox_Msg.TextLength;
+ if (string.IsNullOrEmpty(str))
+ SetText(textBox_Msg, str, SetColor, false, 16);
+ else
+ SetText(textBox_Msg, strText, SetColor, false, 16);
+ if (textBox_Msg.Lines.Length > 800)
+ {
+ textBox_Msg.Select(0, textBox_Msg.TextLength / 2);
+ textBox_Msg.Cut();
+ }
+
+ textBox_Msg.ScrollToCaret();
+ });
+ }
+ catch
+ {
+ }
+ }
+
+ public static void SetText(RichTextBox m_RichTextBox, string strText, Color m_Color, bool bBold = false,
+ float Size = 16)
+ {
+ m_RichTextBox.Invoke(((EventHandler)delegate
+ {
+ SetFont(m_RichTextBox, m_Color, bBold, Size);
+ m_RichTextBox.SelectedText = strText;
+ }));
+ }
+
+ public static void SetFont(RichTextBox m_RichTextBox, Color m_Color, bool bBold = false, float Size = 16)
+ {
+ m_RichTextBox.SelectionColor = m_Color;
+ if (bBold)
+ m_RichTextBox.SelectionFont = new System.Drawing.Font("Segoe UI", Size, System.Drawing.FontStyle.Bold,
+ System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
+ else
+ m_RichTextBox.SelectionFont = new System.Drawing.Font("Segoe UI", Size,
+ System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
+ }
+
+ public static void SetErrorColor(Color InColor)
+ {
+ if (textBox_Msg != null)
+ {
+ textBox_Msg.BeginInvoke((EventHandler)delegate { textBox_Msg.BackColor = InColor; });
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/HexcalMC/Hexcal/TcpIpServer.cs b/HexcalMC/Hexcal/TcpIpServer.cs
new file mode 100644
index 0000000..befcb7f
--- /dev/null
+++ b/HexcalMC/Hexcal/TcpIpServer.cs
@@ -0,0 +1,371 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Sockets;
+using System.Net;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HexcalMC.Hexcal
+{
+ public class TcpIpServer
+ {
+ ///
+ /// 使用模式,默认=1,接收任意数据显示;2=前两个字节为数据长度
+ ///
+ public int UseMode = 1;
+
+ string strServerIP = "127.0.0.1"; //服务器的IP地址
+ string strServerPort = "8080"; //端口号
+ public enum EnumTcpIpServer : int
+ {
+ StartListen = 1,
+ ClientConnect = 2,
+ SocketException = 8,
+ ConnectException = 9,
+ Exception = -1
+ }
+
+ #region 510,增加时钟,判断是否有断掉的连接。
+
+ System.Windows.Forms.Timer ServerTimer = new System.Windows.Forms.Timer();
+
+ private void ServerTimerLoop(object sender, EventArgs e)
+ {
+ ServerTimer.Interval = 20000; //监听timer的间隔
+ if (DictSocket != null)
+ {
+ if (DictSocket.Count != 0)
+ {
+ DictSocket.Values.ToArray();
+ for (int i = DictSocket.Values.ToArray().Length - 1; i >= 0; i--)
+ {
+ if (DictSocket.Values.ToArray()[i].Poll(10, SelectMode.SelectRead)) //10毫秒,检查套接字状态, SelectMode 参数指定要监视的套接字的类别。
+ {
+ // DictSocket.Remove(DictSocket.Keys.ToArray()[i]);
+
+ RaisedStatus(EnumTcpIpServer.ConnectException,
+ "连接已断开:" + DictSocket.Keys.ToArray()[i]); //刷新界面显示,触发一个连接异常状态枚举,并将消息传递为异常的状态
+ RemoveSocketClient(DictSocket.Keys.ToArray()[i]);
+ }
+ }
+ }
+ }
+ }
+
+ #endregion
+
+
+ Thread m_WatchThread = null; // 负责监听客户端连接请求的线程;
+ Socket m_WatchSocket = null;
+ Dictionary DictThread = new Dictionary();
+ Dictionary DictSocket = new Dictionary();
+ bool bStartListen = false;
+
+ public string[] SocketNames
+ {
+ get { return (string[])DictSocket.Keys.ToArray(); }
+ }
+
+ //=========================================================================
+ public TcpIpServer(string ServerIP, string ServerPort)
+ {
+ strServerIP = ServerIP;
+ strServerPort = ServerPort;
+ }
+
+ public bool StartListen()
+ {
+ try
+ {
+ ServerTimer.Tick += new EventHandler(ServerTimerLoop); //510,增加时钟,判断是否有断掉的连接。
+ ServerTimer.Start();
+
+ m_WatchSocket =
+ new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建负责监听的套接字,注意其中的参数;
+ IPAddress m_IpAddr = IPAddress.Parse(strServerIP); //获得文本框中的IP对象;
+ IPEndPoint m_EndPoint = new IPEndPoint(m_IpAddr, int.Parse(strServerPort)); //创建包含ip和端口号的网络节点对象;
+ try
+ {
+ m_WatchSocket.Bind(m_EndPoint); // 将负责监听的套接字绑定到唯一的ip和端口上;
+ }
+ catch (SocketException se)
+ {
+ MessageBox.Show("异常:" + se.Message);
+ return false;
+ }
+
+ bStartListen = true;
+ m_WatchSocket.Listen(10); // 设置监听队列的长度
+ m_WatchThread = new Thread(WatchThread); // 创建负责监听的线程
+ m_WatchThread.IsBackground = true;
+ m_WatchThread.Start();
+ RaisedStatus(EnumTcpIpServer.StartListen, "服务器启动监听成功!IP=" + strServerIP + ", Port=" + strServerPort);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("启动服务器监听失败:" + ex.Message);
+ return false;
+ }
+ }
+
+ public void StopListen()
+ {
+ try
+ {
+ bStartListen = false;
+ m_WatchSocket.Close();
+ m_WatchSocket.Dispose();
+ m_WatchSocket = null;
+
+ DictThread.Clear();
+ DictSocket.Clear();
+ }
+ catch
+ {
+ }
+ }
+
+ public bool ConnectStatus
+ {
+ get
+ {
+ if (m_WatchSocket == null)
+ return false;
+ return m_WatchSocket.Connected && m_WatchThread != null;
+ }
+ }
+
+ public bool WatchStatus
+ {
+ get { return bStartListen; }
+ }
+
+ //监听线程
+ void WatchThread()
+ {
+ try
+ {
+ while (bStartListen) // 持续不断的监听客户端的连接请求;
+ {
+ // 开始监听客户端连接请求,Accept方法会阻断当前的线程;
+ Socket sokClient = m_WatchSocket.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的套接字;
+
+
+ #region 510,在新建连接时,判断以前的连接是否正常存在。
+
+ if (DictSocket != null)
+ {
+ if (DictSocket.Count != 0)
+ {
+ DictSocket.Values.ToArray();
+ for (int i = DictSocket.Values.ToArray().Length - 1; i >= 0; i--)
+ {
+ if (DictSocket.Values.ToArray()[i].Poll(10, SelectMode.SelectRead))
+ {
+ //DictSocket.Remove(DictSocket.Keys.ToArray()[i]);
+ RemoveSocketClient(DictSocket.Keys.ToArray()[i]);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+
+ DictSocket.Add(sokClient.RemoteEndPoint.ToString(), sokClient); // 将与客户端连接的套接字对象添加到集合中;
+ RaisedStatus(EnumTcpIpServer.ClientConnect,
+ "客户端连接成功!RemoteEndPoint=" + sokClient.RemoteEndPoint.ToString());
+
+ Thread thread = new Thread(ReceiveThread);
+ thread.IsBackground = true;
+ thread.Start(sokClient);
+
+ DictThread.Add(sokClient.RemoteEndPoint.ToString(), thread); // 将新建的线程 添加 到线程的集合中去。
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ //接收线程
+ void ReceiveThread(object sokObj)
+ {
+ Socket sokClient = sokObj as Socket;
+ while (bStartListen)
+ {
+ // 定义一个2M的缓存区;
+ byte[] arrMsgRec = new byte[sokClient.Available];
+ // 将接受到的数据存入到输入 arrMsgRec中;
+ int length = -1;
+ try
+ {
+ length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
+ }
+ catch (SocketException se)
+ {
+ RaisedStatus(EnumTcpIpServer.SocketException, "异常:SocketException=" + se.Message);
+ RemoveSocketClient(sokClient.RemoteEndPoint.ToString());
+ return;
+ }
+ catch (Exception ex)
+ {
+ RaisedStatus(EnumTcpIpServer.ConnectException, "异常:Exception=" + ex.Message);
+ RemoveSocketClient(sokClient.RemoteEndPoint.ToString());
+ return;
+ }
+
+ try
+ {
+ if (UseMode == 1)
+ {
+ if (length > 0)
+ {
+ // TcpIpDfn.SongLiang_arrMsgRec = arrMsgRec; //510
+ string strData = System.Text.Encoding.Default.GetString(arrMsgRec); // 将接受到的字节数据转化成字符串;
+ //strData = strData.Substring(0, length);
+ //RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "<0>"));
+ RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "."));
+ }
+ }
+ else if (UseMode == 2)
+ {
+ if (length > 0 && arrMsgRec.Length > 2)
+ {
+ // TcpIpDfn.SongLiang_arrMsgRec = arrMsgRec; //510
+ string strData =
+ System.Text.Encoding.Default.GetString(arrMsgRec, 2,
+ arrMsgRec.Length - 2); // 将接受到的字节数据转化成字符串;
+
+ RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ RaisedStatus(EnumTcpIpServer.Exception, "获取Socket数据异常:ex=" + ex.Message);
+ }
+ }
+ }
+
+ //删除客户端对象
+ void RemoveSocketClient(string strRemoteEndPoint)
+ {
+ // 从通信套接字集合中 删除被中断连接的通信套接字;
+ DictSocket.Remove(strRemoteEndPoint);
+
+ // 从通信线程集合中 删除被中断连接的通信线程对象;
+ DictThread.Remove(strRemoteEndPoint);
+ }
+
+ //发送消息
+ public void SendMessage(string strSocketKey, string strMsg)
+ {
+ byte[] arrMsg = System.Text.Encoding.Default.GetBytes(strMsg);
+ DictSocket[strSocketKey].Send(arrMsg);
+ }
+
+ public void SendMessage(string strSocketKey, byte[] arrMsg)
+ {
+ DictSocket[strSocketKey].Send(arrMsg);
+ }
+
+ /// 发送数据函数(字符串, 自动添加长度(byte格式))
+ public string SendMessage2(string strSocketKey, string strMsg)
+ {
+ try
+ {
+ if (DictSocket[strSocketKey].Connected)
+ {
+ byte[] arrLength = new byte[2];
+ arrLength = BitConverter.GetBytes(Convert.ToInt16(strMsg.Length));
+ byte[] WriteBuffer = Encoding.Default.GetBytes(strMsg);
+ WriteBuffer = arrLength.Concat(WriteBuffer).ToArray();
+
+ DictSocket[strSocketKey].Send(WriteBuffer);
+ return "";
+ }
+
+ return "NotConnect";
+ }
+ catch (Exception ex)
+ {
+ return "error:" + ex.Message;
+ }
+ }
+
+ public void SendMessageToAllClients(string strMsg)
+ {
+ byte[] arrMsg = System.Text.Encoding.Default.GetBytes(strMsg);
+ foreach (Socket soc in DictSocket.Values)
+ {
+ soc.Send(arrMsg);
+ }
+ }
+
+ public void SendMessageToAllClients(byte[] arrMsg)
+ {
+ foreach (Socket soc in DictSocket.Values)
+ {
+ soc.Send(arrMsg);
+ }
+ }
+
+ public delegate void EventHandler_RaisedStatus(EnumTcpIpServer Type, string Msg);
+
+ public event EventHandler_RaisedStatus OnRaisedStatus;
+
+ // 异步或同步触发自定义事件,并在目标控件是 Windows Forms 控件的情况下添加到目标控件的消息队列中。它主要的目的是使得自定义事件处理程序在UI线程上执行,以避免线程上的卡顿或UI更新问题。
+ private void RaisedStatus(EnumTcpIpServer ReturnType, string Msg)
+ {
+ try
+ {
+ if (OnRaisedStatus != null)
+ {
+ if (OnRaisedStatus.Target is System.Windows.Forms.Control)
+ {
+ Control targetForm = OnRaisedStatus.Target as System.Windows.Forms.Control;
+ targetForm.BeginInvoke(OnRaisedStatus, new object[] { ReturnType, Msg });
+ }
+ else
+ {
+ OnRaisedStatus(ReturnType, Msg);
+ }
+ }
+ }
+ catch (Exception)
+ {
+ }
+ }
+
+ public delegate void EventHandler_RaisedMessage(string ClientIP, string Msg);
+
+ public event EventHandler_RaisedMessage OnRaisedMessage;
+
+ private void RaisedMessage(string ClientIP, string Msg)
+ {
+ try
+ {
+ if (OnRaisedMessage != null)
+ {
+ if (OnRaisedMessage.Target is System.Windows.Forms.Control)
+ {
+ Control targetForm = OnRaisedMessage.Target as System.Windows.Forms.Control;
+ targetForm.BeginInvoke(OnRaisedMessage, new object[] { ClientIP, Msg });
+ }
+ else
+ {
+ OnRaisedMessage(ClientIP, Msg);
+ }
+ }
+ }
+ catch (Exception)
+ {
+ }
+ }
+ }
+}
diff --git a/HexcalMC/HexcalMC.csproj b/HexcalMC/HexcalMC.csproj
index a8f9058..881d56e 100644
--- a/HexcalMC/HexcalMC.csproj
+++ b/HexcalMC/HexcalMC.csproj
@@ -1,5 +1,5 @@
-
+
Debug
x86
@@ -10,12 +10,13 @@
Properties
HexcalMC
ACS_Motion
- v2.0
+ v4.6.2
512
SAK
SAK
SAK
SAK
+
x86
@@ -26,6 +27,7 @@
DEBUG;TRACE
prompt
4
+ false
x86
@@ -35,6 +37,7 @@
TRACE
prompt
4
+ false
true
@@ -44,6 +47,7 @@
x64
prompt
MinimumRecommendedRules.ruleset
+ false
bin\x64\Release\
@@ -53,15 +57,35 @@
x64
prompt
MinimumRecommendedRules.ruleset
+ false
bin\Debug\ACS.SPiiPlusNET.dll
+
+ packages\ScottPlot.4.1.68\lib\net462\ScottPlot.dll
+
+
+ packages\ScottPlot.WinForms.4.1.68\lib\net461\ScottPlot.WinForms.dll
+
+
+ packages\System.Drawing.Common.4.7.2\lib\net461\System.Drawing.Common.dll
+
+
+
+ packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
+
+
+ packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
+
+
+ packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll
+
@@ -69,8 +93,12 @@
+
+
+
+
Form
@@ -103,6 +131,8 @@
Resources.resx
True
+
+
SettingsSingleFileGenerator
Settings.Designer.cs
@@ -140,6 +170,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACt5tMNidzBKYTbviZ92LoOedi5AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAzO/jAbfp2C6J3MGShNu+h3zYujF52LkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACS3sYvgtq+anrYuquB2r22ftm7z4DZvKuL3MJWzvDkBM7w5AEAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAbtSzA3nXuWh82Lqnedi5rI7dxGaB2r3Hfdi734DZvbuf4sx4jt3DNn7Z
+ uxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB01bYieNe4nXrYudR52LmsmODJIoPavqJ72Lrpedi5/H3Y
+ u9Z92LqEfdi6TYjbwCaX4MgIl+DIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIfbwHp+2bvQedi55XnYuawAAAAAf9m8XXzY
+ urR52Ln/edi5/3nYuf982LrZgtm9mJfgyCCX4MgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIbbvweG278aftm733vYufh52Lnledi5rAAA
+ AACN3MITiNvAZ3rYueh52Ln/edi5/3nYuft62Ln0ftm744Tavo6N3cNDld/HCgAAAAAAAAAAAAAAAAAA
+ AAAAAAAA2cuMB9fIhRXTwnUw08J1MNPCdTDTwnUw08J1MNPCdTDTwnUwssiKQI/PonCC0aXzgdCl/oLQ
+ pOmGz6O608J1MLzLkDWp0J5tktKoyYDQpf+A0KX/gNCl/4DQpf+B0aX8hNGn1IrSqKeRz59yoLhlKKC4
+ ZQUAAAAAAAAAAAAAAADXyIYT18mHNNXFfW7Tw3h308J2etPCdXvTwnV708J1e9LBc3vFv3GNnrxvwZK/
+ dvuRv3b/lMB58ZvBfdLTwnV708J1e8bFgJSuy5LDk8J+/5HAeP+Rv3b/kb92/5G/dv+Rv3b/kr5085e7
+ bMylsFBarKg5CwAAAAAAAAAAAAAAANbGfyrXx4Js3tGbw9fIhezUxHr608J1/9PCdf/TwnX/0L5s/8qy
+ Tv+7lwv/upYI/7qWCP+8mxb/w6Y1/9PCdf/TwnX/08J1/9HAcP/Coyv/vJkQ/7qWCP+6lgj/upYI/7qW
+ CP+6lgj/upYI7bqWCJ66lggUAAAAAAAAAAAAAAAA08N4KtTDeG7YyojW5dmwWeHUo3TZyom71MR6/dPC
+ df/Jsk7/wKIn/7qWCP+6lgj/upYI/72bFv/DpjX/08J1/9PCdf/TwnX/0sFz/824X/+/nyD/upYK/7qW
+ CP+6lgj/upYI/7qWCP+6lgjtupYInrqWCBQAAAAAAAAAAAAAAADTwnUq08J2cdXFfe3g1KJu4NSiTtrL
+ jljay42RzMN84sKtQ/e8mhX/upYI/7qWCP+7lwn/vZsW/8OmNf/Twnb/08J2/9PCdf/SwXX/0b9u/8Sp
+ OP++nBn/upYI/7uXCf+7lwn/u5cJ/7qWCO26lgieupYIFAAAAAAAAAAAAAAAANPCdSrTwnVz08J2/9rL
+ jaXd0JlL2Nu2DdjVqC67yY3Ls7FS8rGeIf+3mRH/upYJ/7qWCP+9mxb/w6Y1/9PCdv/Twnb/08J2/9PC
+ df/TwnX/yrNS/8KkLP+6lgr/u5cJ/7uXCf+7lwn/upYI7bqWCJ66lggUAAAAAAAAAAAAAAAA08J1KtPC
+ dXPTwnb/1sZ/99/SnYje374cuunaHonbwdiE0an6j8KB/6qnOf+5lwv/upYI/72bFv/DpjX/08J2/9PC
+ dv/Twnb/08J2/9PCdv/SwHH/yK9I/7yaE/+7lwn/u5cJ/7uXCf+6lgjtupYInrqWCBQAAAAAAAAAAAAA
+ AADTwnUq08J1c9PCdv/Twnb+18iGw8/Sn4mZ4MmNftm773vWtv591LD/gNCk/5O9dP+nqT3/t6Al/8Om
+ Nf/Twnb/08J2/9PCdv/Twnb/08J2/9LBdP/OuWD/xqs+/7qWCP+6lgj/u5cJ/7qWCO26lgieupYIFAAA
+ AAAAAAAAAAAAANPCdSrTwnVz08J2/9PCdf/UxHvnyMmLzovZudB72Ln5edi5/3nYuf952Ln/gs6g/4/B
+ fv+fuGb7s7Ra9NTDeP7Twnb/08J1/9PCdv/Twnb/08J1/9G+bf/Mtlj/vZsV/7qXCv+6lgj/upYI7bqW
+ CJ66lggUAAAAAAAAAAAAAAAA08J1KtPCdXPTwnb/08J1/9G/bv/Dv3L/iM2d/nvWtv952Ln/eti6/3rY
+ uv952Ln/eta3/4XRp/WdxYjf1cV73NPDd+zTwnX408J1/9PCdf/TwnX/08J1/9C+a//Coyv/u5gO/7qW
+ CP+6lgjtupYInrqWCBQAAAAAAAAAAAAAAADTwnUq08J1c9PCdv/TwnX/y7RT/7ynN/+ir07/ftKr/3nY
+ uf962Lr/eti6/3rYuv962Lr/edi55XnYuazWxoEp1MR8idPDeM/TwnX908J1/9PCdf/TwnX/0sBy/865
+ YP++nRr/u5cJ/7qWCO26lgieupYIFAAAAAAAAAAAAAAAANPCdSrTwnVz08J1/8+7Zf/EqTn/upoS/7Wb
+ Fv+Lxov/ftOs/3nYuf962Lr/eti6/3rYuv952Lnledi5rNbGgQjUxHwa1MR7O9XFfm3VxX3f08J399PC
+ df/SwXX/0sBx/8WpOf++nRr/upYI7bqWCJ66lggUAAAAAAAAAAAAAAAA08J1KtPCdHPTwnT/yLBK/8Ch
+ Jf+6lgn/upYJ/52zWv+HypT/edi4/3rYuv962Lr/eti6/3nYueV52LmsAAAAAAAAAADWxoEN1cV+KNTE
+ fHPUw3qp08J41dPCdvfTwnX/y7RV/8KkLf+6lwvtupYInrqWCBQAAAAAAAAAAAAAAADTwnUq0sF0c9G/
+ b//CpC3/vJoT/7qWCP+6lgj/sKAo/5K+dv981bL/edi5/3nYuf962Lr/edi55XnYuawAAAAAAAAAAAAA
+ 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
+ f//wAH///AB///+Af///wH///+B////4f/8=
+
+
+
\ No newline at end of file
diff --git a/HexcalMC/Motion/Motion.Designer.cs b/HexcalMC/Motion/Motion.Designer.cs
new file mode 100644
index 0000000..e8bea21
--- /dev/null
+++ b/HexcalMC/Motion/Motion.Designer.cs
@@ -0,0 +1,2305 @@
+namespace HexcalMC
+{
+ partial class Motion
+ {
+ ///
+ /// 필수 디자이너 변수입니다.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 사용 중인 모든 리소스를 정리합니다.
+ ///
+ /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form 디자이너에서 생성한 코드
+
+ ///
+ /// 디자이너 지원에 필요한 메서드입니다.
+ /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Motion));
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.txtPort = new System.Windows.Forms.TextBox();
+ this.txtIP = new System.Windows.Forms.TextBox();
+ this.btnClose = new System.Windows.Forms.Button();
+ this.btnOpen = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.rdoTCP = new System.Windows.Forms.RadioButton();
+ this.rdoSimu = new System.Windows.Forms.RadioButton();
+ this.tmrMonitor = new System.Windows.Forms.Timer(this.components);
+ this.grpMotionTest = new System.Windows.Forms.GroupBox();
+ this.btnHallAll = new System.Windows.Forms.Button();
+ this.btnHalt = new System.Windows.Forms.Button();
+ this.grpMst = new System.Windows.Forms.GroupBox();
+ this.label16 = new System.Windows.Forms.Label();
+ this.label15 = new System.Windows.Forms.Label();
+ this.label14 = new System.Windows.Forms.Label();
+ this.lblEnable = new System.Windows.Forms.Label();
+ this.lblInPos = new System.Windows.Forms.Label();
+ this.lblAcc = new System.Windows.Forms.Label();
+ this.lblMoving = new System.Windows.Forms.Label();
+ this.label13 = new System.Windows.Forms.Label();
+ this.grpPositions = new System.Windows.Forms.GroupBox();
+ this.btnSetZero = new System.Windows.Forms.Button();
+ this.txtFVEL = new System.Windows.Forms.TextBox();
+ this.txtPE = new System.Windows.Forms.TextBox();
+ this.txtFPOS = new System.Windows.Forms.TextBox();
+ this.label43 = new System.Windows.Forms.Label();
+ this.txtRPOS = new System.Windows.Forms.TextBox();
+ this.label12 = new System.Windows.Forms.Label();
+ this.label11 = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.btnDisableAll = new System.Windows.Forms.Button();
+ this.btnDisable = new System.Windows.Forms.Button();
+ this.cboAxisNo = new System.Windows.Forms.ComboBox();
+ this.btnEnable = new System.Windows.Forms.Button();
+ this.grpJog = new System.Windows.Forms.GroupBox();
+ this.btnJogPos = new System.Windows.Forms.Button();
+ this.btnJogNeg = new System.Windows.Forms.Button();
+ this.txtJogVel = new System.Windows.Forms.TextBox();
+ this.chkUseVel = new System.Windows.Forms.CheckBox();
+ this.grpProfile = new System.Windows.Forms.GroupBox();
+ this.txtJerk = new System.Windows.Forms.TextBox();
+ this.txtKdec = new System.Windows.Forms.TextBox();
+ this.txtDec = new System.Windows.Forms.TextBox();
+ this.txtAcc = new System.Windows.Forms.TextBox();
+ this.txtVel = new System.Windows.Forms.TextBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.grpPTP = new System.Windows.Forms.GroupBox();
+ this.btnPTP_R_Pos = new System.Windows.Forms.Button();
+ this.btnPTP_R_Neg = new System.Windows.Forms.Button();
+ this.btnPTP = new System.Windows.Forms.Button();
+ this.txtPTP_Pos = new System.Windows.Forms.TextBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.grpSafety = new System.Windows.Forms.GroupBox();
+ this.lblEMG = new System.Windows.Forms.Label();
+ this.lblRL7 = new System.Windows.Forms.Label();
+ this.lblRL3 = new System.Windows.Forms.Label();
+ this.lblLL7 = new System.Windows.Forms.Label();
+ this.lblLL3 = new System.Windows.Forms.Label();
+ this.lblRL6 = new System.Windows.Forms.Label();
+ this.lblRL2 = new System.Windows.Forms.Label();
+ this.lblLL6 = new System.Windows.Forms.Label();
+ this.lblRL5 = new System.Windows.Forms.Label();
+ this.lblLL2 = new System.Windows.Forms.Label();
+ this.lblLL5 = new System.Windows.Forms.Label();
+ this.lblRL1 = new System.Windows.Forms.Label();
+ this.lblRL4 = new System.Windows.Forms.Label();
+ this.lblLL1 = new System.Windows.Forms.Label();
+ this.lblLL4 = new System.Windows.Forms.Label();
+ this.lblRL0 = new System.Windows.Forms.Label();
+ this.lblLL0 = new System.Windows.Forms.Label();
+ this.label18 = new System.Windows.Forms.Label();
+ this.label36 = new System.Windows.Forms.Label();
+ this.label27 = new System.Windows.Forms.Label();
+ this.label35 = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.label34 = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.label33 = new System.Windows.Forms.Label();
+ this.label24 = new System.Windows.Forms.Label();
+ this.label20 = new System.Windows.Forms.Label();
+ this.label19 = new System.Windows.Forms.Label();
+ this.label17 = new System.Windows.Forms.Label();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.lblPRG_Status = new System.Windows.Forms.Label();
+ this.lblPRG_Status_LED = new System.Windows.Forms.Label();
+ this.btnStopBuffer = new System.Windows.Forms.Button();
+ this.btnRunBuffer = new System.Windows.Forms.Button();
+ this.txtLabelName = new System.Windows.Forms.TextBox();
+ this.cboBufferNo = new System.Windows.Forms.ComboBox();
+ this.label22 = new System.Windows.Forms.Label();
+ this.label32 = new System.Windows.Forms.Label();
+ this.label21 = new System.Windows.Forms.Label();
+ this.label28 = new System.Windows.Forms.Label();
+ this.grpIO = new System.Windows.Forms.GroupBox();
+ this.btnSW7 = new System.Windows.Forms.Button();
+ this.btnSW6 = new System.Windows.Forms.Button();
+ this.btnSW5 = new System.Windows.Forms.Button();
+ this.btnSW4 = new System.Windows.Forms.Button();
+ this.btnSW3 = new System.Windows.Forms.Button();
+ this.btnSW2 = new System.Windows.Forms.Button();
+ this.btnSW0 = new System.Windows.Forms.Button();
+ this.btnSW1 = new System.Windows.Forms.Button();
+ this.label29 = new System.Windows.Forms.Label();
+ this.label23 = new System.Windows.Forms.Label();
+ this.label42 = new System.Windows.Forms.Label();
+ this.lblOUT7 = new System.Windows.Forms.Label();
+ this.lblIN7 = new System.Windows.Forms.Label();
+ this.label41 = new System.Windows.Forms.Label();
+ this.lblOUT3 = new System.Windows.Forms.Label();
+ this.lblIN3 = new System.Windows.Forms.Label();
+ this.label40 = new System.Windows.Forms.Label();
+ this.label39 = new System.Windows.Forms.Label();
+ this.label38 = new System.Windows.Forms.Label();
+ this.lblOUT6 = new System.Windows.Forms.Label();
+ this.lblIN6 = new System.Windows.Forms.Label();
+ this.label37 = new System.Windows.Forms.Label();
+ this.lblOUT2 = new System.Windows.Forms.Label();
+ this.lblIN2 = new System.Windows.Forms.Label();
+ this.lblOUT5 = new System.Windows.Forms.Label();
+ this.lblIN5 = new System.Windows.Forms.Label();
+ this.label31 = new System.Windows.Forms.Label();
+ this.label30 = new System.Windows.Forms.Label();
+ this.lblOUT1 = new System.Windows.Forms.Label();
+ this.lblIN1 = new System.Windows.Forms.Label();
+ this.lblOUT0 = new System.Windows.Forms.Label();
+ this.lblOUT4 = new System.Windows.Forms.Label();
+ this.lblIN0 = new System.Windows.Forms.Label();
+ this.lblIN4 = new System.Windows.Forms.Label();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.lstLog = new System.Windows.Forms.ListBox();
+ this.btnEventProgramEnd = new System.Windows.Forms.Button();
+ this.btnEventMotionEnd = new System.Windows.Forms.Button();
+ this.rtxtTerminal = new System.Windows.Forms.RichTextBox();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.btnSend = new System.Windows.Forms.Button();
+ this.txtCommand = new System.Windows.Forms.TextBox();
+ this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.groupBox9 = new System.Windows.Forms.GroupBox();
+ this.label56 = new System.Windows.Forms.Label();
+ this.label55 = new System.Windows.Forms.Label();
+ this.label54 = new System.Windows.Forms.Label();
+ this.label53 = new System.Windows.Forms.Label();
+ this.label52 = new System.Windows.Forms.Label();
+ this.label51 = new System.Windows.Forms.Label();
+ this.label50 = new System.Windows.Forms.Label();
+ this.label49 = new System.Windows.Forms.Label();
+ this.label47 = new System.Windows.Forms.Label();
+ this.groupBox8 = new System.Windows.Forms.GroupBox();
+ this.button8 = new System.Windows.Forms.Button();
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.textBox3 = new System.Windows.Forms.TextBox();
+ this.textBox2 = new System.Windows.Forms.TextBox();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.label46 = new System.Windows.Forms.Label();
+ this.label45 = new System.Windows.Forms.Label();
+ this.label44 = new System.Windows.Forms.Label();
+ this.groupBox7 = new System.Windows.Forms.GroupBox();
+ this.button7 = new System.Windows.Forms.Button();
+ this.button6 = new System.Windows.Forms.Button();
+ this.button5 = new System.Windows.Forms.Button();
+ this.button4 = new System.Windows.Forms.Button();
+ this.groupBox6 = new System.Windows.Forms.GroupBox();
+ this.button3 = new System.Windows.Forms.Button();
+ this.button2 = new System.Windows.Forms.Button();
+ this.button1 = new System.Windows.Forms.Button();
+ this.groupBox10 = new System.Windows.Forms.GroupBox();
+ this.label48 = new System.Windows.Forms.Label();
+ this.textBox4 = new System.Windows.Forms.TextBox();
+ this.button10 = new System.Windows.Forms.Button();
+ this.button9 = new System.Windows.Forms.Button();
+ this.checkBox4 = new System.Windows.Forms.CheckBox();
+ this.checkBox3 = new System.Windows.Forms.CheckBox();
+ this.checkBox2 = new System.Windows.Forms.CheckBox();
+ this.groupBox1.SuspendLayout();
+ this.grpMotionTest.SuspendLayout();
+ this.grpMst.SuspendLayout();
+ this.grpPositions.SuspendLayout();
+ this.grpJog.SuspendLayout();
+ this.grpProfile.SuspendLayout();
+ this.grpPTP.SuspendLayout();
+ this.grpSafety.SuspendLayout();
+ this.groupBox2.SuspendLayout();
+ this.grpIO.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ this.groupBox4.SuspendLayout();
+ this.groupBox5.SuspendLayout();
+ this.groupBox9.SuspendLayout();
+ this.groupBox8.SuspendLayout();
+ this.groupBox7.SuspendLayout();
+ this.groupBox6.SuspendLayout();
+ this.groupBox10.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.txtPort);
+ this.groupBox1.Controls.Add(this.txtIP);
+ this.groupBox1.Controls.Add(this.btnClose);
+ this.groupBox1.Controls.Add(this.btnOpen);
+ this.groupBox1.Controls.Add(this.label2);
+ this.groupBox1.Controls.Add(this.label1);
+ this.groupBox1.Controls.Add(this.rdoTCP);
+ this.groupBox1.Controls.Add(this.rdoSimu);
+ this.groupBox1.Location = new System.Drawing.Point(12, 12);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(273, 94);
+ this.groupBox1.TabIndex = 0;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "通讯设置";
+ //
+ // txtPort
+ //
+ this.txtPort.Location = new System.Drawing.Point(171, 40);
+ this.txtPort.Name = "txtPort";
+ this.txtPort.Size = new System.Drawing.Size(91, 21);
+ this.txtPort.TabIndex = 15;
+ this.txtPort.Text = "701";
+ //
+ // txtIP
+ //
+ this.txtIP.Location = new System.Drawing.Point(171, 17);
+ this.txtIP.Name = "txtIP";
+ this.txtIP.Size = new System.Drawing.Size(91, 21);
+ this.txtIP.TabIndex = 16;
+ this.txtIP.Text = "10.0.0.100";
+ //
+ // btnClose
+ //
+ this.btnClose.Location = new System.Drawing.Point(181, 65);
+ this.btnClose.Name = "btnClose";
+ this.btnClose.Size = new System.Drawing.Size(81, 23);
+ this.btnClose.TabIndex = 14;
+ this.btnClose.Text = "断开";
+ this.btnClose.UseVisualStyleBackColor = true;
+ this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+ //
+ // btnOpen
+ //
+ this.btnOpen.Location = new System.Drawing.Point(94, 65);
+ this.btnOpen.Name = "btnOpen";
+ this.btnOpen.Size = new System.Drawing.Size(81, 23);
+ this.btnOpen.TabIndex = 13;
+ this.btnOpen.Text = "连接";
+ this.btnOpen.UseVisualStyleBackColor = true;
+ this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(102, 44);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(29, 12);
+ this.label2.TabIndex = 11;
+ this.label2.Text = "端口";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(102, 21);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(71, 12);
+ this.label1.TabIndex = 12;
+ this.label1.Text = "目标设备 IP";
+ //
+ // rdoTCP
+ //
+ this.rdoTCP.AutoSize = true;
+ this.rdoTCP.Location = new System.Drawing.Point(6, 19);
+ this.rdoTCP.Name = "rdoTCP";
+ this.rdoTCP.Size = new System.Drawing.Size(41, 16);
+ this.rdoTCP.TabIndex = 10;
+ this.rdoTCP.TabStop = true;
+ this.rdoTCP.Text = "TCP";
+ this.rdoTCP.UseVisualStyleBackColor = true;
+ this.rdoTCP.CheckedChanged += new System.EventHandler(this.rdoTCP_CheckedChanged);
+ //
+ // rdoSimu
+ //
+ this.rdoSimu.AutoSize = true;
+ this.rdoSimu.Location = new System.Drawing.Point(6, 42);
+ this.rdoSimu.Name = "rdoSimu";
+ this.rdoSimu.Size = new System.Drawing.Size(59, 16);
+ this.rdoSimu.TabIndex = 9;
+ this.rdoSimu.TabStop = true;
+ this.rdoSimu.Text = "模拟器";
+ this.rdoSimu.UseVisualStyleBackColor = true;
+ this.rdoSimu.CheckedChanged += new System.EventHandler(this.rdoSimu_CheckedChanged);
+ //
+ // tmrMonitor
+ //
+ this.tmrMonitor.Interval = 50;
+ this.tmrMonitor.Tick += new System.EventHandler(this.tmrMonitor_Tick);
+ //
+ // grpMotionTest
+ //
+ this.grpMotionTest.Controls.Add(this.btnHallAll);
+ this.grpMotionTest.Controls.Add(this.btnHalt);
+ this.grpMotionTest.Controls.Add(this.grpMst);
+ this.grpMotionTest.Controls.Add(this.grpPositions);
+ this.grpMotionTest.Controls.Add(this.btnDisableAll);
+ this.grpMotionTest.Controls.Add(this.btnDisable);
+ this.grpMotionTest.Controls.Add(this.cboAxisNo);
+ this.grpMotionTest.Controls.Add(this.btnEnable);
+ this.grpMotionTest.Controls.Add(this.grpJog);
+ this.grpMotionTest.Controls.Add(this.grpProfile);
+ this.grpMotionTest.Controls.Add(this.grpPTP);
+ this.grpMotionTest.Controls.Add(this.label9);
+ this.grpMotionTest.Location = new System.Drawing.Point(12, 112);
+ this.grpMotionTest.Name = "grpMotionTest";
+ this.grpMotionTest.Size = new System.Drawing.Size(570, 375);
+ this.grpMotionTest.TabIndex = 1;
+ this.grpMotionTest.TabStop = false;
+ this.grpMotionTest.Text = "运动测试";
+ //
+ // btnHallAll
+ //
+ this.btnHallAll.Location = new System.Drawing.Point(439, 257);
+ this.btnHallAll.Name = "btnHallAll";
+ this.btnHallAll.Size = new System.Drawing.Size(120, 47);
+ this.btnHallAll.TabIndex = 10;
+ this.btnHallAll.Text = "停止全部";
+ this.btnHallAll.UseVisualStyleBackColor = true;
+ this.btnHallAll.Click += new System.EventHandler(this.btnHallAll_Click);
+ //
+ // btnHalt
+ //
+ this.btnHalt.Location = new System.Drawing.Point(439, 206);
+ this.btnHalt.Name = "btnHalt";
+ this.btnHalt.Size = new System.Drawing.Size(120, 47);
+ this.btnHalt.TabIndex = 10;
+ this.btnHalt.Text = "停止";
+ this.btnHalt.UseVisualStyleBackColor = true;
+ this.btnHalt.Click += new System.EventHandler(this.btnHalt_Click);
+ //
+ // grpMst
+ //
+ this.grpMst.Controls.Add(this.label16);
+ this.grpMst.Controls.Add(this.label15);
+ this.grpMst.Controls.Add(this.label14);
+ this.grpMst.Controls.Add(this.lblEnable);
+ this.grpMst.Controls.Add(this.lblInPos);
+ this.grpMst.Controls.Add(this.lblAcc);
+ this.grpMst.Controls.Add(this.lblMoving);
+ this.grpMst.Controls.Add(this.label13);
+ this.grpMst.Location = new System.Drawing.Point(279, 198);
+ this.grpMst.Name = "grpMst";
+ this.grpMst.Size = new System.Drawing.Size(154, 107);
+ this.grpMst.TabIndex = 9;
+ this.grpMst.TabStop = false;
+ this.grpMst.Text = "电机状态 (MST)";
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.Location = new System.Drawing.Point(9, 82);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(29, 12);
+ this.label16.TabIndex = 5;
+ this.label16.Text = "使能";
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(9, 61);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(29, 12);
+ this.label15.TabIndex = 5;
+ this.label15.Text = "就位";
+ //
+ // label14
+ //
+ this.label14.AutoSize = true;
+ this.label14.Location = new System.Drawing.Point(9, 40);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(41, 12);
+ this.label14.TabIndex = 5;
+ this.label14.Text = "加速中";
+ //
+ // lblEnable
+ //
+ this.lblEnable.Image = ((System.Drawing.Image)(resources.GetObject("lblEnable.Image")));
+ this.lblEnable.Location = new System.Drawing.Point(120, 80);
+ this.lblEnable.Name = "lblEnable";
+ this.lblEnable.Size = new System.Drawing.Size(19, 17);
+ this.lblEnable.TabIndex = 5;
+ //
+ // lblInPos
+ //
+ this.lblInPos.Image = ((System.Drawing.Image)(resources.GetObject("lblInPos.Image")));
+ this.lblInPos.Location = new System.Drawing.Point(120, 59);
+ this.lblInPos.Name = "lblInPos";
+ this.lblInPos.Size = new System.Drawing.Size(19, 17);
+ this.lblInPos.TabIndex = 5;
+ //
+ // lblAcc
+ //
+ this.lblAcc.Image = ((System.Drawing.Image)(resources.GetObject("lblAcc.Image")));
+ this.lblAcc.Location = new System.Drawing.Point(120, 38);
+ this.lblAcc.Name = "lblAcc";
+ this.lblAcc.Size = new System.Drawing.Size(19, 17);
+ this.lblAcc.TabIndex = 5;
+ //
+ // lblMoving
+ //
+ this.lblMoving.Image = ((System.Drawing.Image)(resources.GetObject("lblMoving.Image")));
+ this.lblMoving.Location = new System.Drawing.Point(120, 17);
+ this.lblMoving.Name = "lblMoving";
+ this.lblMoving.Size = new System.Drawing.Size(19, 17);
+ this.lblMoving.TabIndex = 5;
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Location = new System.Drawing.Point(9, 19);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(41, 12);
+ this.label13.TabIndex = 5;
+ this.label13.Text = "运动中";
+ //
+ // grpPositions
+ //
+ this.grpPositions.Controls.Add(this.btnSetZero);
+ this.grpPositions.Controls.Add(this.txtFVEL);
+ this.grpPositions.Controls.Add(this.txtPE);
+ this.grpPositions.Controls.Add(this.txtFPOS);
+ this.grpPositions.Controls.Add(this.label43);
+ this.grpPositions.Controls.Add(this.txtRPOS);
+ this.grpPositions.Controls.Add(this.label12);
+ this.grpPositions.Controls.Add(this.label11);
+ this.grpPositions.Controls.Add(this.label10);
+ this.grpPositions.Location = new System.Drawing.Point(279, 51);
+ this.grpPositions.Name = "grpPositions";
+ this.grpPositions.Size = new System.Drawing.Size(280, 141);
+ this.grpPositions.TabIndex = 8;
+ this.grpPositions.TabStop = false;
+ this.grpPositions.Text = "位置";
+ //
+ // btnSetZero
+ //
+ this.btnSetZero.Location = new System.Drawing.Point(88, 111);
+ this.btnSetZero.Name = "btnSetZero";
+ this.btnSetZero.Size = new System.Drawing.Size(186, 23);
+ this.btnSetZero.TabIndex = 7;
+ this.btnSetZero.Text = "设置零位";
+ this.btnSetZero.UseVisualStyleBackColor = true;
+ this.btnSetZero.Click += new System.EventHandler(this.btnSetZero_Click);
+ //
+ // txtFVEL
+ //
+ this.txtFVEL.Location = new System.Drawing.Point(165, 64);
+ this.txtFVEL.Name = "txtFVEL";
+ this.txtFVEL.ReadOnly = true;
+ this.txtFVEL.Size = new System.Drawing.Size(107, 21);
+ this.txtFVEL.TabIndex = 6;
+ this.txtFVEL.Text = "0.000";
+ this.txtFVEL.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ //
+ // txtPE
+ //
+ this.txtPE.Location = new System.Drawing.Point(165, 86);
+ this.txtPE.Name = "txtPE";
+ this.txtPE.ReadOnly = true;
+ this.txtPE.Size = new System.Drawing.Size(107, 21);
+ this.txtPE.TabIndex = 6;
+ this.txtPE.Text = "0.000";
+ this.txtPE.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ //
+ // txtFPOS
+ //
+ this.txtFPOS.Location = new System.Drawing.Point(165, 42);
+ this.txtFPOS.Name = "txtFPOS";
+ this.txtFPOS.ReadOnly = true;
+ this.txtFPOS.Size = new System.Drawing.Size(107, 21);
+ this.txtFPOS.TabIndex = 6;
+ this.txtFPOS.Text = "0.000";
+ this.txtFPOS.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ //
+ // label43
+ //
+ this.label43.AutoSize = true;
+ this.label43.Location = new System.Drawing.Point(6, 68);
+ this.label43.Name = "label43";
+ this.label43.Size = new System.Drawing.Size(95, 12);
+ this.label43.TabIndex = 5;
+ this.label43.Text = "实际速度 (FVEL)";
+ //
+ // txtRPOS
+ //
+ this.txtRPOS.Location = new System.Drawing.Point(165, 19);
+ this.txtRPOS.Name = "txtRPOS";
+ this.txtRPOS.ReadOnly = true;
+ this.txtRPOS.Size = new System.Drawing.Size(107, 21);
+ this.txtRPOS.TabIndex = 6;
+ this.txtRPOS.Text = "0.000";
+ this.txtRPOS.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(6, 90);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(83, 12);
+ this.label12.TabIndex = 5;
+ this.label12.Text = "位置误差 (PE)";
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(6, 46);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(95, 12);
+ this.label11.TabIndex = 5;
+ this.label11.Text = "反馈位置 (FPOS)";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(6, 23);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(95, 12);
+ this.label10.TabIndex = 5;
+ this.label10.Text = "参考位置 (RPOS)";
+ //
+ // btnDisableAll
+ //
+ this.btnDisableAll.Location = new System.Drawing.Point(484, 19);
+ this.btnDisableAll.Name = "btnDisableAll";
+ this.btnDisableAll.Size = new System.Drawing.Size(75, 23);
+ this.btnDisableAll.TabIndex = 7;
+ this.btnDisableAll.Text = "取消全部";
+ this.btnDisableAll.UseVisualStyleBackColor = true;
+ this.btnDisableAll.Click += new System.EventHandler(this.btnDisableAll_Click);
+ //
+ // btnDisable
+ //
+ this.btnDisable.Location = new System.Drawing.Point(403, 19);
+ this.btnDisable.Name = "btnDisable";
+ this.btnDisable.Size = new System.Drawing.Size(75, 23);
+ this.btnDisable.TabIndex = 7;
+ this.btnDisable.Text = "单轴取消";
+ this.btnDisable.UseVisualStyleBackColor = true;
+ this.btnDisable.Click += new System.EventHandler(this.btnDisable_Click);
+ //
+ // cboAxisNo
+ //
+ this.cboAxisNo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboAxisNo.FormattingEnabled = true;
+ this.cboAxisNo.Location = new System.Drawing.Point(115, 20);
+ this.cboAxisNo.Name = "cboAxisNo";
+ this.cboAxisNo.Size = new System.Drawing.Size(60, 20);
+ this.cboAxisNo.TabIndex = 0;
+ this.cboAxisNo.SelectedIndexChanged += new System.EventHandler(this.cboAxisNo_SelectedIndexChanged);
+ //
+ // btnEnable
+ //
+ this.btnEnable.Location = new System.Drawing.Point(322, 18);
+ this.btnEnable.Name = "btnEnable";
+ this.btnEnable.Size = new System.Drawing.Size(75, 23);
+ this.btnEnable.TabIndex = 7;
+ this.btnEnable.Text = "单轴使能";
+ this.btnEnable.UseVisualStyleBackColor = true;
+ this.btnEnable.Click += new System.EventHandler(this.btnEnable_Click);
+ //
+ // grpJog
+ //
+ this.grpJog.Controls.Add(this.btnJogPos);
+ this.grpJog.Controls.Add(this.btnJogNeg);
+ this.grpJog.Controls.Add(this.txtJogVel);
+ this.grpJog.Controls.Add(this.chkUseVel);
+ this.grpJog.Location = new System.Drawing.Point(8, 311);
+ this.grpJog.Name = "grpJog";
+ this.grpJog.Size = new System.Drawing.Size(425, 53);
+ this.grpJog.TabIndex = 0;
+ this.grpJog.TabStop = false;
+ this.grpJog.Text = "Jog";
+ //
+ // btnJogPos
+ //
+ this.btnJogPos.Location = new System.Drawing.Point(316, 17);
+ this.btnJogPos.Name = "btnJogPos";
+ this.btnJogPos.Size = new System.Drawing.Size(94, 23);
+ this.btnJogPos.TabIndex = 8;
+ this.btnJogPos.Text = "正向 >>";
+ this.btnJogPos.UseVisualStyleBackColor = true;
+ this.btnJogPos.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnJogPos_MouseDown);
+ this.btnJogPos.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnJog_MouseUp);
+ //
+ // btnJogNeg
+ //
+ this.btnJogNeg.Location = new System.Drawing.Point(214, 17);
+ this.btnJogNeg.Name = "btnJogNeg";
+ this.btnJogNeg.Size = new System.Drawing.Size(94, 23);
+ this.btnJogNeg.TabIndex = 8;
+ this.btnJogNeg.Text = "<< 负向";
+ this.btnJogNeg.UseVisualStyleBackColor = true;
+ this.btnJogNeg.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnJogNeg_MouseDown);
+ this.btnJogNeg.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnJog_MouseUp);
+ //
+ // txtJogVel
+ //
+ this.txtJogVel.Location = new System.Drawing.Point(114, 19);
+ this.txtJogVel.Name = "txtJogVel";
+ this.txtJogVel.Size = new System.Drawing.Size(94, 21);
+ this.txtJogVel.TabIndex = 1;
+ this.txtJogVel.Text = "0";
+ this.txtJogVel.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ //
+ // chkUseVel
+ //
+ this.chkUseVel.AutoSize = true;
+ this.chkUseVel.Location = new System.Drawing.Point(13, 21);
+ this.chkUseVel.Name = "chkUseVel";
+ this.chkUseVel.Size = new System.Drawing.Size(72, 16);
+ this.chkUseVel.TabIndex = 0;
+ this.chkUseVel.Text = "使用速度";
+ this.chkUseVel.UseVisualStyleBackColor = true;
+ //
+ // grpProfile
+ //
+ this.grpProfile.Controls.Add(this.txtJerk);
+ this.grpProfile.Controls.Add(this.txtKdec);
+ this.grpProfile.Controls.Add(this.txtDec);
+ this.grpProfile.Controls.Add(this.txtAcc);
+ this.grpProfile.Controls.Add(this.txtVel);
+ this.grpProfile.Controls.Add(this.label7);
+ this.grpProfile.Controls.Add(this.label6);
+ this.grpProfile.Controls.Add(this.label5);
+ this.grpProfile.Controls.Add(this.label4);
+ this.grpProfile.Controls.Add(this.label3);
+ this.grpProfile.Location = new System.Drawing.Point(8, 51);
+ this.grpProfile.Name = "grpProfile";
+ this.grpProfile.Size = new System.Drawing.Size(265, 141);
+ this.grpProfile.TabIndex = 0;
+ this.grpProfile.TabStop = false;
+ this.grpProfile.Text = "运动配置";
+ //
+ // txtJerk
+ //
+ this.txtJerk.Location = new System.Drawing.Point(153, 111);
+ this.txtJerk.Name = "txtJerk";
+ this.txtJerk.Size = new System.Drawing.Size(101, 21);
+ this.txtJerk.TabIndex = 4;
+ this.txtJerk.Text = "0";
+ this.txtJerk.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.txtJerk.Enter += new System.EventHandler(this.TextBoxes_Enter);
+ this.txtJerk.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress);
+ this.txtJerk.Leave += new System.EventHandler(this.TextBoxes_Leave);
+ //
+ // txtKdec
+ //
+ this.txtKdec.Location = new System.Drawing.Point(153, 88);
+ this.txtKdec.Name = "txtKdec";
+ this.txtKdec.Size = new System.Drawing.Size(101, 21);
+ this.txtKdec.TabIndex = 3;
+ this.txtKdec.Text = "0";
+ this.txtKdec.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.txtKdec.Enter += new System.EventHandler(this.TextBoxes_Enter);
+ this.txtKdec.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress);
+ this.txtKdec.Leave += new System.EventHandler(this.TextBoxes_Leave);
+ //
+ // txtDec
+ //
+ this.txtDec.Location = new System.Drawing.Point(153, 65);
+ this.txtDec.Name = "txtDec";
+ this.txtDec.Size = new System.Drawing.Size(101, 21);
+ this.txtDec.TabIndex = 2;
+ this.txtDec.Text = "0";
+ this.txtDec.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.txtDec.Enter += new System.EventHandler(this.TextBoxes_Enter);
+ this.txtDec.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress);
+ this.txtDec.Leave += new System.EventHandler(this.TextBoxes_Leave);
+ //
+ // txtAcc
+ //
+ this.txtAcc.Location = new System.Drawing.Point(153, 42);
+ this.txtAcc.Name = "txtAcc";
+ this.txtAcc.Size = new System.Drawing.Size(101, 21);
+ this.txtAcc.TabIndex = 1;
+ this.txtAcc.Text = "0";
+ this.txtAcc.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.txtAcc.Enter += new System.EventHandler(this.TextBoxes_Enter);
+ this.txtAcc.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress);
+ this.txtAcc.Leave += new System.EventHandler(this.TextBoxes_Leave);
+ //
+ // txtVel
+ //
+ this.txtVel.Location = new System.Drawing.Point(153, 19);
+ this.txtVel.Name = "txtVel";
+ this.txtVel.Size = new System.Drawing.Size(101, 21);
+ this.txtVel.TabIndex = 0;
+ this.txtVel.Text = "0";
+ this.txtVel.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.txtVel.Enter += new System.EventHandler(this.TextBoxes_Enter);
+ this.txtVel.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress);
+ this.txtVel.Leave += new System.EventHandler(this.TextBoxes_Leave);
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(6, 115);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(71, 12);
+ this.label7.TabIndex = 5;
+ this.label7.Text = "抖动 (JERK)";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(6, 92);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(95, 12);
+ this.label6.TabIndex = 5;
+ this.label6.Text = "杀死减速 (KDEC)";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(6, 69);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(65, 12);
+ this.label5.TabIndex = 5;
+ this.label5.Text = "减速 (DEC)";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(6, 46);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(77, 12);
+ this.label4.TabIndex = 5;
+ this.label4.Text = "加速度 (ACC)";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(6, 23);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(65, 12);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "速度 (VEL)";
+ //
+ // grpPTP
+ //
+ this.grpPTP.Controls.Add(this.btnPTP_R_Pos);
+ this.grpPTP.Controls.Add(this.btnPTP_R_Neg);
+ this.grpPTP.Controls.Add(this.btnPTP);
+ this.grpPTP.Controls.Add(this.txtPTP_Pos);
+ this.grpPTP.Controls.Add(this.label8);
+ this.grpPTP.Location = new System.Drawing.Point(8, 198);
+ this.grpPTP.Name = "grpPTP";
+ this.grpPTP.Size = new System.Drawing.Size(265, 107);
+ this.grpPTP.TabIndex = 0;
+ this.grpPTP.TabStop = false;
+ this.grpPTP.Text = "点到点 (PTP)";
+ //
+ // btnPTP_R_Pos
+ //
+ this.btnPTP_R_Pos.Location = new System.Drawing.Point(135, 76);
+ this.btnPTP_R_Pos.Name = "btnPTP_R_Pos";
+ this.btnPTP_R_Pos.Size = new System.Drawing.Size(119, 23);
+ this.btnPTP_R_Pos.TabIndex = 7;
+ this.btnPTP_R_Pos.Text = "相对位置 (+)";
+ this.btnPTP_R_Pos.UseVisualStyleBackColor = true;
+ this.btnPTP_R_Pos.Click += new System.EventHandler(this.btnPTP_R_Pos_Click);
+ //
+ // btnPTP_R_Neg
+ //
+ this.btnPTP_R_Neg.Location = new System.Drawing.Point(8, 76);
+ this.btnPTP_R_Neg.Name = "btnPTP_R_Neg";
+ this.btnPTP_R_Neg.Size = new System.Drawing.Size(119, 23);
+ this.btnPTP_R_Neg.TabIndex = 7;
+ this.btnPTP_R_Neg.Text = "相对位置 (-)";
+ this.btnPTP_R_Neg.UseVisualStyleBackColor = true;
+ this.btnPTP_R_Neg.Click += new System.EventHandler(this.btnPTP_R_Neg_Click);
+ //
+ // btnPTP
+ //
+ this.btnPTP.Location = new System.Drawing.Point(8, 47);
+ this.btnPTP.Name = "btnPTP";
+ this.btnPTP.Size = new System.Drawing.Size(246, 23);
+ this.btnPTP.TabIndex = 7;
+ this.btnPTP.Text = "移动到绝对位置";
+ this.btnPTP.UseVisualStyleBackColor = true;
+ this.btnPTP.Click += new System.EventHandler(this.btnPTP_Click);
+ //
+ // txtPTP_Pos
+ //
+ this.txtPTP_Pos.Location = new System.Drawing.Point(153, 21);
+ this.txtPTP_Pos.Name = "txtPTP_Pos";
+ this.txtPTP_Pos.Size = new System.Drawing.Size(101, 21);
+ this.txtPTP_Pos.TabIndex = 6;
+ this.txtPTP_Pos.Text = "0";
+ this.txtPTP_Pos.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(8, 24);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(65, 12);
+ this.label8.TabIndex = 5;
+ this.label8.Text = "位置 &&距离";
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(13, 24);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(29, 12);
+ this.label9.TabIndex = 5;
+ this.label9.Text = "轴号";
+ //
+ // grpSafety
+ //
+ this.grpSafety.Controls.Add(this.lblEMG);
+ this.grpSafety.Controls.Add(this.lblRL7);
+ this.grpSafety.Controls.Add(this.lblRL3);
+ this.grpSafety.Controls.Add(this.lblLL7);
+ this.grpSafety.Controls.Add(this.lblLL3);
+ this.grpSafety.Controls.Add(this.lblRL6);
+ this.grpSafety.Controls.Add(this.lblRL2);
+ this.grpSafety.Controls.Add(this.lblLL6);
+ this.grpSafety.Controls.Add(this.lblRL5);
+ this.grpSafety.Controls.Add(this.lblLL2);
+ this.grpSafety.Controls.Add(this.lblLL5);
+ this.grpSafety.Controls.Add(this.lblRL1);
+ this.grpSafety.Controls.Add(this.lblRL4);
+ this.grpSafety.Controls.Add(this.lblLL1);
+ this.grpSafety.Controls.Add(this.lblLL4);
+ this.grpSafety.Controls.Add(this.lblRL0);
+ this.grpSafety.Controls.Add(this.lblLL0);
+ this.grpSafety.Controls.Add(this.label18);
+ this.grpSafety.Controls.Add(this.label36);
+ this.grpSafety.Controls.Add(this.label27);
+ this.grpSafety.Controls.Add(this.label35);
+ this.grpSafety.Controls.Add(this.label26);
+ this.grpSafety.Controls.Add(this.label34);
+ this.grpSafety.Controls.Add(this.label25);
+ this.grpSafety.Controls.Add(this.label33);
+ this.grpSafety.Controls.Add(this.label24);
+ this.grpSafety.Controls.Add(this.label20);
+ this.grpSafety.Controls.Add(this.label19);
+ this.grpSafety.Controls.Add(this.label17);
+ this.grpSafety.Location = new System.Drawing.Point(291, 12);
+ this.grpSafety.Name = "grpSafety";
+ this.grpSafety.Size = new System.Drawing.Size(292, 94);
+ this.grpSafety.TabIndex = 2;
+ this.grpSafety.TabStop = false;
+ this.grpSafety.Text = "安全限位";
+ //
+ // lblEMG
+ //
+ this.lblEMG.Image = ((System.Drawing.Image)(resources.GetObject("lblEMG.Image")));
+ this.lblEMG.Location = new System.Drawing.Point(260, 46);
+ this.lblEMG.Name = "lblEMG";
+ this.lblEMG.Size = new System.Drawing.Size(19, 17);
+ this.lblEMG.TabIndex = 5;
+ //
+ // lblRL7
+ //
+ this.lblRL7.Image = ((System.Drawing.Image)(resources.GetObject("lblRL7.Image")));
+ this.lblRL7.Location = new System.Drawing.Point(230, 67);
+ this.lblRL7.Name = "lblRL7";
+ this.lblRL7.Size = new System.Drawing.Size(19, 17);
+ this.lblRL7.TabIndex = 5;
+ this.lblRL7.Tag = "17";
+ //
+ // lblRL3
+ //
+ this.lblRL3.Image = ((System.Drawing.Image)(resources.GetObject("lblRL3.Image")));
+ this.lblRL3.Location = new System.Drawing.Point(142, 67);
+ this.lblRL3.Name = "lblRL3";
+ this.lblRL3.Size = new System.Drawing.Size(19, 17);
+ this.lblRL3.TabIndex = 5;
+ this.lblRL3.Tag = "13";
+ //
+ // lblLL7
+ //
+ this.lblLL7.Image = ((System.Drawing.Image)(resources.GetObject("lblLL7.Image")));
+ this.lblLL7.Location = new System.Drawing.Point(230, 46);
+ this.lblLL7.Name = "lblLL7";
+ this.lblLL7.Size = new System.Drawing.Size(19, 17);
+ this.lblLL7.TabIndex = 5;
+ this.lblLL7.Tag = "7";
+ //
+ // lblLL3
+ //
+ this.lblLL3.Image = ((System.Drawing.Image)(resources.GetObject("lblLL3.Image")));
+ this.lblLL3.Location = new System.Drawing.Point(142, 46);
+ this.lblLL3.Name = "lblLL3";
+ this.lblLL3.Size = new System.Drawing.Size(19, 17);
+ this.lblLL3.TabIndex = 5;
+ this.lblLL3.Tag = "3";
+ //
+ // lblRL6
+ //
+ this.lblRL6.Image = ((System.Drawing.Image)(resources.GetObject("lblRL6.Image")));
+ this.lblRL6.Location = new System.Drawing.Point(208, 67);
+ this.lblRL6.Name = "lblRL6";
+ this.lblRL6.Size = new System.Drawing.Size(19, 17);
+ this.lblRL6.TabIndex = 5;
+ this.lblRL6.Tag = "16";
+ //
+ // lblRL2
+ //
+ this.lblRL2.Image = ((System.Drawing.Image)(resources.GetObject("lblRL2.Image")));
+ this.lblRL2.Location = new System.Drawing.Point(120, 67);
+ this.lblRL2.Name = "lblRL2";
+ this.lblRL2.Size = new System.Drawing.Size(19, 17);
+ this.lblRL2.TabIndex = 5;
+ this.lblRL2.Tag = "12";
+ //
+ // lblLL6
+ //
+ this.lblLL6.Image = ((System.Drawing.Image)(resources.GetObject("lblLL6.Image")));
+ this.lblLL6.Location = new System.Drawing.Point(208, 46);
+ this.lblLL6.Name = "lblLL6";
+ this.lblLL6.Size = new System.Drawing.Size(19, 17);
+ this.lblLL6.TabIndex = 5;
+ this.lblLL6.Tag = "6";
+ //
+ // lblRL5
+ //
+ this.lblRL5.Image = ((System.Drawing.Image)(resources.GetObject("lblRL5.Image")));
+ this.lblRL5.Location = new System.Drawing.Point(186, 67);
+ this.lblRL5.Name = "lblRL5";
+ this.lblRL5.Size = new System.Drawing.Size(19, 17);
+ this.lblRL5.TabIndex = 5;
+ this.lblRL5.Tag = "15";
+ //
+ // lblLL2
+ //
+ this.lblLL2.Image = ((System.Drawing.Image)(resources.GetObject("lblLL2.Image")));
+ this.lblLL2.Location = new System.Drawing.Point(120, 46);
+ this.lblLL2.Name = "lblLL2";
+ this.lblLL2.Size = new System.Drawing.Size(19, 17);
+ this.lblLL2.TabIndex = 5;
+ this.lblLL2.Tag = "2";
+ //
+ // lblLL5
+ //
+ this.lblLL5.Image = ((System.Drawing.Image)(resources.GetObject("lblLL5.Image")));
+ this.lblLL5.Location = new System.Drawing.Point(186, 46);
+ this.lblLL5.Name = "lblLL5";
+ this.lblLL5.Size = new System.Drawing.Size(19, 17);
+ this.lblLL5.TabIndex = 5;
+ this.lblLL5.Tag = "5";
+ //
+ // lblRL1
+ //
+ this.lblRL1.Image = ((System.Drawing.Image)(resources.GetObject("lblRL1.Image")));
+ this.lblRL1.Location = new System.Drawing.Point(98, 67);
+ this.lblRL1.Name = "lblRL1";
+ this.lblRL1.Size = new System.Drawing.Size(19, 17);
+ this.lblRL1.TabIndex = 5;
+ this.lblRL1.Tag = "11";
+ //
+ // lblRL4
+ //
+ this.lblRL4.Image = ((System.Drawing.Image)(resources.GetObject("lblRL4.Image")));
+ this.lblRL4.Location = new System.Drawing.Point(164, 67);
+ this.lblRL4.Name = "lblRL4";
+ this.lblRL4.Size = new System.Drawing.Size(19, 17);
+ this.lblRL4.TabIndex = 5;
+ this.lblRL4.Tag = "14";
+ //
+ // lblLL1
+ //
+ this.lblLL1.Image = ((System.Drawing.Image)(resources.GetObject("lblLL1.Image")));
+ this.lblLL1.Location = new System.Drawing.Point(98, 46);
+ this.lblLL1.Name = "lblLL1";
+ this.lblLL1.Size = new System.Drawing.Size(19, 17);
+ this.lblLL1.TabIndex = 5;
+ this.lblLL1.Tag = "1";
+ //
+ // lblLL4
+ //
+ this.lblLL4.Image = ((System.Drawing.Image)(resources.GetObject("lblLL4.Image")));
+ this.lblLL4.Location = new System.Drawing.Point(164, 46);
+ this.lblLL4.Name = "lblLL4";
+ this.lblLL4.Size = new System.Drawing.Size(19, 17);
+ this.lblLL4.TabIndex = 5;
+ this.lblLL4.Tag = "4";
+ //
+ // lblRL0
+ //
+ this.lblRL0.Image = ((System.Drawing.Image)(resources.GetObject("lblRL0.Image")));
+ this.lblRL0.Location = new System.Drawing.Point(76, 67);
+ this.lblRL0.Name = "lblRL0";
+ this.lblRL0.Size = new System.Drawing.Size(19, 17);
+ this.lblRL0.TabIndex = 5;
+ this.lblRL0.Tag = "10";
+ //
+ // lblLL0
+ //
+ this.lblLL0.Image = ((System.Drawing.Image)(resources.GetObject("lblLL0.Image")));
+ this.lblLL0.Location = new System.Drawing.Point(76, 46);
+ this.lblLL0.Name = "lblLL0";
+ this.lblLL0.Size = new System.Drawing.Size(19, 17);
+ this.lblLL0.TabIndex = 5;
+ this.lblLL0.Tag = "0";
+ //
+ // label18
+ //
+ this.label18.AutoSize = true;
+ this.label18.Location = new System.Drawing.Point(7, 72);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(41, 12);
+ this.label18.TabIndex = 5;
+ this.label18.Text = "右限位";
+ //
+ // label36
+ //
+ this.label36.AutoSize = true;
+ this.label36.Location = new System.Drawing.Point(234, 24);
+ this.label36.Name = "label36";
+ this.label36.Size = new System.Drawing.Size(11, 12);
+ this.label36.TabIndex = 5;
+ this.label36.Text = "7";
+ //
+ // label27
+ //
+ this.label27.Location = new System.Drawing.Point(248, 15);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(43, 26);
+ this.label27.TabIndex = 5;
+ this.label27.Text = "急停";
+ this.label27.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // label35
+ //
+ this.label35.AutoSize = true;
+ this.label35.Location = new System.Drawing.Point(212, 24);
+ this.label35.Name = "label35";
+ this.label35.Size = new System.Drawing.Size(11, 12);
+ this.label35.TabIndex = 5;
+ this.label35.Text = "6";
+ //
+ // label26
+ //
+ this.label26.AutoSize = true;
+ this.label26.Location = new System.Drawing.Point(146, 24);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(11, 12);
+ this.label26.TabIndex = 5;
+ this.label26.Text = "3";
+ //
+ // label34
+ //
+ this.label34.AutoSize = true;
+ this.label34.Location = new System.Drawing.Point(190, 24);
+ this.label34.Name = "label34";
+ this.label34.Size = new System.Drawing.Size(11, 12);
+ this.label34.TabIndex = 5;
+ this.label34.Text = "5";
+ //
+ // label25
+ //
+ this.label25.AutoSize = true;
+ this.label25.Location = new System.Drawing.Point(124, 24);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(11, 12);
+ this.label25.TabIndex = 5;
+ this.label25.Text = "2";
+ //
+ // label33
+ //
+ this.label33.AutoSize = true;
+ this.label33.Location = new System.Drawing.Point(168, 24);
+ this.label33.Name = "label33";
+ this.label33.Size = new System.Drawing.Size(11, 12);
+ this.label33.TabIndex = 5;
+ this.label33.Text = "4";
+ //
+ // label24
+ //
+ this.label24.AutoSize = true;
+ this.label24.Location = new System.Drawing.Point(102, 24);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(11, 12);
+ this.label24.TabIndex = 5;
+ this.label24.Text = "1";
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.Location = new System.Drawing.Point(80, 24);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(11, 12);
+ this.label20.TabIndex = 5;
+ this.label20.Text = "0";
+ //
+ // label19
+ //
+ this.label19.AutoSize = true;
+ this.label19.Location = new System.Drawing.Point(6, 24);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(29, 12);
+ this.label19.TabIndex = 5;
+ this.label19.Text = "轴号";
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Location = new System.Drawing.Point(7, 48);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(41, 12);
+ this.label17.TabIndex = 5;
+ this.label17.Text = "左限位";
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.lblPRG_Status);
+ this.groupBox2.Controls.Add(this.lblPRG_Status_LED);
+ this.groupBox2.Controls.Add(this.btnStopBuffer);
+ this.groupBox2.Controls.Add(this.btnRunBuffer);
+ this.groupBox2.Controls.Add(this.txtLabelName);
+ this.groupBox2.Controls.Add(this.cboBufferNo);
+ this.groupBox2.Controls.Add(this.label22);
+ this.groupBox2.Controls.Add(this.label32);
+ this.groupBox2.Controls.Add(this.label21);
+ this.groupBox2.Location = new System.Drawing.Point(589, 6);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(314, 100);
+ this.groupBox2.TabIndex = 3;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Buffer 程序";
+ //
+ // lblPRG_Status
+ //
+ this.lblPRG_Status.AutoSize = true;
+ this.lblPRG_Status.Location = new System.Drawing.Point(100, 53);
+ this.lblPRG_Status.Name = "lblPRG_Status";
+ this.lblPRG_Status.Size = new System.Drawing.Size(29, 12);
+ this.lblPRG_Status.TabIndex = 11;
+ this.lblPRG_Status.Text = "停止";
+ //
+ // lblPRG_Status_LED
+ //
+ this.lblPRG_Status_LED.Image = ((System.Drawing.Image)(resources.GetObject("lblPRG_Status_LED.Image")));
+ this.lblPRG_Status_LED.Location = new System.Drawing.Point(75, 51);
+ this.lblPRG_Status_LED.Name = "lblPRG_Status_LED";
+ this.lblPRG_Status_LED.Size = new System.Drawing.Size(19, 17);
+ this.lblPRG_Status_LED.TabIndex = 10;
+ this.lblPRG_Status_LED.Tag = "17";
+ //
+ // btnStopBuffer
+ //
+ this.btnStopBuffer.Location = new System.Drawing.Point(240, 67);
+ this.btnStopBuffer.Name = "btnStopBuffer";
+ this.btnStopBuffer.Size = new System.Drawing.Size(66, 23);
+ this.btnStopBuffer.TabIndex = 8;
+ this.btnStopBuffer.Text = "停止";
+ this.btnStopBuffer.UseVisualStyleBackColor = true;
+ this.btnStopBuffer.Click += new System.EventHandler(this.btnStopBuffer_Click);
+ //
+ // btnRunBuffer
+ //
+ this.btnRunBuffer.Location = new System.Drawing.Point(166, 67);
+ this.btnRunBuffer.Name = "btnRunBuffer";
+ this.btnRunBuffer.Size = new System.Drawing.Size(66, 23);
+ this.btnRunBuffer.TabIndex = 8;
+ this.btnRunBuffer.Text = "启动";
+ this.btnRunBuffer.UseVisualStyleBackColor = true;
+ this.btnRunBuffer.Click += new System.EventHandler(this.btnRunBuffer_Click);
+ //
+ // txtLabelName
+ //
+ this.txtLabelName.Location = new System.Drawing.Point(206, 20);
+ this.txtLabelName.Name = "txtLabelName";
+ this.txtLabelName.Size = new System.Drawing.Size(100, 21);
+ this.txtLabelName.TabIndex = 7;
+ //
+ // cboBufferNo
+ //
+ this.cboBufferNo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cboBufferNo.FormattingEnabled = true;
+ this.cboBufferNo.Location = new System.Drawing.Point(77, 22);
+ this.cboBufferNo.Name = "cboBufferNo";
+ this.cboBufferNo.Size = new System.Drawing.Size(72, 20);
+ this.cboBufferNo.TabIndex = 6;
+ //
+ // label22
+ //
+ this.label22.AutoSize = true;
+ this.label22.Location = new System.Drawing.Point(164, 25);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(35, 12);
+ this.label22.TabIndex = 5;
+ this.label22.Text = "Label";
+ //
+ // label32
+ //
+ this.label32.AutoSize = true;
+ this.label32.Location = new System.Drawing.Point(10, 53);
+ this.label32.Name = "label32";
+ this.label32.Size = new System.Drawing.Size(29, 12);
+ this.label32.TabIndex = 5;
+ this.label32.Text = "状态";
+ //
+ // label21
+ //
+ this.label21.AutoSize = true;
+ this.label21.Location = new System.Drawing.Point(10, 26);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(65, 12);
+ this.label21.TabIndex = 5;
+ this.label21.Text = "Buffer No.";
+ //
+ // label28
+ //
+ this.label28.AutoSize = true;
+ this.label28.Location = new System.Drawing.Point(5, 28);
+ this.label28.Name = "label28";
+ this.label28.Size = new System.Drawing.Size(47, 12);
+ this.label28.TabIndex = 5;
+ this.label28.Text = "Bit No.";
+ //
+ // grpIO
+ //
+ this.grpIO.Controls.Add(this.btnSW7);
+ this.grpIO.Controls.Add(this.btnSW6);
+ this.grpIO.Controls.Add(this.btnSW5);
+ this.grpIO.Controls.Add(this.btnSW4);
+ this.grpIO.Controls.Add(this.btnSW3);
+ this.grpIO.Controls.Add(this.btnSW2);
+ this.grpIO.Controls.Add(this.btnSW0);
+ this.grpIO.Controls.Add(this.btnSW1);
+ this.grpIO.Controls.Add(this.label29);
+ this.grpIO.Controls.Add(this.label23);
+ this.grpIO.Controls.Add(this.label42);
+ this.grpIO.Controls.Add(this.lblOUT7);
+ this.grpIO.Controls.Add(this.lblIN7);
+ this.grpIO.Controls.Add(this.label41);
+ this.grpIO.Controls.Add(this.lblOUT3);
+ this.grpIO.Controls.Add(this.lblIN3);
+ this.grpIO.Controls.Add(this.label40);
+ this.grpIO.Controls.Add(this.label39);
+ this.grpIO.Controls.Add(this.label38);
+ this.grpIO.Controls.Add(this.lblOUT6);
+ this.grpIO.Controls.Add(this.lblIN6);
+ this.grpIO.Controls.Add(this.label37);
+ this.grpIO.Controls.Add(this.lblOUT2);
+ this.grpIO.Controls.Add(this.lblIN2);
+ this.grpIO.Controls.Add(this.lblOUT5);
+ this.grpIO.Controls.Add(this.lblIN5);
+ this.grpIO.Controls.Add(this.label31);
+ this.grpIO.Controls.Add(this.label30);
+ this.grpIO.Controls.Add(this.label28);
+ this.grpIO.Controls.Add(this.lblOUT1);
+ this.grpIO.Controls.Add(this.lblIN1);
+ this.grpIO.Controls.Add(this.lblOUT0);
+ this.grpIO.Controls.Add(this.lblOUT4);
+ this.grpIO.Controls.Add(this.lblIN0);
+ this.grpIO.Controls.Add(this.lblIN4);
+ this.grpIO.Location = new System.Drawing.Point(589, 112);
+ this.grpIO.Name = "grpIO";
+ this.grpIO.Size = new System.Drawing.Size(314, 132);
+ this.grpIO.TabIndex = 4;
+ this.grpIO.TabStop = false;
+ this.grpIO.Text = "通用 I/O";
+ //
+ // btnSW7
+ //
+ this.btnSW7.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW7.Location = new System.Drawing.Point(274, 97);
+ this.btnSW7.Name = "btnSW7";
+ this.btnSW7.Size = new System.Drawing.Size(33, 25);
+ this.btnSW7.TabIndex = 7;
+ this.btnSW7.Text = "OFF";
+ this.btnSW7.UseVisualStyleBackColor = true;
+ this.btnSW7.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW6
+ //
+ this.btnSW6.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW6.Location = new System.Drawing.Point(242, 97);
+ this.btnSW6.Name = "btnSW6";
+ this.btnSW6.Size = new System.Drawing.Size(33, 25);
+ this.btnSW6.TabIndex = 6;
+ this.btnSW6.Text = "OFF";
+ this.btnSW6.UseVisualStyleBackColor = true;
+ this.btnSW6.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW5
+ //
+ this.btnSW5.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW5.Location = new System.Drawing.Point(210, 97);
+ this.btnSW5.Name = "btnSW5";
+ this.btnSW5.Size = new System.Drawing.Size(33, 25);
+ this.btnSW5.TabIndex = 5;
+ this.btnSW5.Text = "OFF";
+ this.btnSW5.UseVisualStyleBackColor = true;
+ this.btnSW5.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW4
+ //
+ this.btnSW4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW4.Location = new System.Drawing.Point(178, 97);
+ this.btnSW4.Name = "btnSW4";
+ this.btnSW4.Size = new System.Drawing.Size(33, 25);
+ this.btnSW4.TabIndex = 4;
+ this.btnSW4.Text = "OFF";
+ this.btnSW4.UseVisualStyleBackColor = true;
+ this.btnSW4.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW3
+ //
+ this.btnSW3.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW3.Location = new System.Drawing.Point(146, 97);
+ this.btnSW3.Name = "btnSW3";
+ this.btnSW3.Size = new System.Drawing.Size(33, 25);
+ this.btnSW3.TabIndex = 3;
+ this.btnSW3.Text = "OFF";
+ this.btnSW3.UseVisualStyleBackColor = true;
+ this.btnSW3.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW2
+ //
+ this.btnSW2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW2.Location = new System.Drawing.Point(114, 97);
+ this.btnSW2.Name = "btnSW2";
+ this.btnSW2.Size = new System.Drawing.Size(33, 25);
+ this.btnSW2.TabIndex = 2;
+ this.btnSW2.Text = "OFF";
+ this.btnSW2.UseVisualStyleBackColor = true;
+ this.btnSW2.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW0
+ //
+ this.btnSW0.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW0.Location = new System.Drawing.Point(50, 97);
+ this.btnSW0.Name = "btnSW0";
+ this.btnSW0.Size = new System.Drawing.Size(33, 25);
+ this.btnSW0.TabIndex = 0;
+ this.btnSW0.Text = "OFF";
+ this.btnSW0.UseVisualStyleBackColor = true;
+ this.btnSW0.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // btnSW1
+ //
+ this.btnSW1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F);
+ this.btnSW1.Location = new System.Drawing.Point(82, 97);
+ this.btnSW1.Name = "btnSW1";
+ this.btnSW1.Size = new System.Drawing.Size(33, 25);
+ this.btnSW1.TabIndex = 1;
+ this.btnSW1.Text = "OFF";
+ this.btnSW1.UseVisualStyleBackColor = true;
+ this.btnSW1.Click += new System.EventHandler(this.btnSW_Click);
+ //
+ // label29
+ //
+ this.label29.AutoSize = true;
+ this.label29.Location = new System.Drawing.Point(5, 74);
+ this.label29.Name = "label29";
+ this.label29.Size = new System.Drawing.Size(29, 12);
+ this.label29.TabIndex = 5;
+ this.label29.Text = "输出";
+ //
+ // label23
+ //
+ this.label23.AutoSize = true;
+ this.label23.Location = new System.Drawing.Point(5, 51);
+ this.label23.Name = "label23";
+ this.label23.Size = new System.Drawing.Size(29, 12);
+ this.label23.TabIndex = 5;
+ this.label23.Text = "输入";
+ //
+ // label42
+ //
+ this.label42.AutoSize = true;
+ this.label42.Location = new System.Drawing.Point(285, 28);
+ this.label42.Name = "label42";
+ this.label42.Size = new System.Drawing.Size(11, 12);
+ this.label42.TabIndex = 5;
+ this.label42.Text = "7";
+ //
+ // lblOUT7
+ //
+ this.lblOUT7.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT7.Image")));
+ this.lblOUT7.Location = new System.Drawing.Point(281, 72);
+ this.lblOUT7.Name = "lblOUT7";
+ this.lblOUT7.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT7.TabIndex = 5;
+ this.lblOUT7.Tag = "7";
+ //
+ // lblIN7
+ //
+ this.lblIN7.Image = ((System.Drawing.Image)(resources.GetObject("lblIN7.Image")));
+ this.lblIN7.Location = new System.Drawing.Point(281, 49);
+ this.lblIN7.Name = "lblIN7";
+ this.lblIN7.Size = new System.Drawing.Size(19, 17);
+ this.lblIN7.TabIndex = 5;
+ this.lblIN7.Tag = "7";
+ //
+ // label41
+ //
+ this.label41.AutoSize = true;
+ this.label41.Location = new System.Drawing.Point(253, 28);
+ this.label41.Name = "label41";
+ this.label41.Size = new System.Drawing.Size(11, 12);
+ this.label41.TabIndex = 5;
+ this.label41.Text = "6";
+ //
+ // lblOUT3
+ //
+ this.lblOUT3.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT3.Image")));
+ this.lblOUT3.Location = new System.Drawing.Point(153, 72);
+ this.lblOUT3.Name = "lblOUT3";
+ this.lblOUT3.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT3.TabIndex = 5;
+ this.lblOUT3.Tag = "3";
+ //
+ // lblIN3
+ //
+ this.lblIN3.Image = ((System.Drawing.Image)(resources.GetObject("lblIN3.Image")));
+ this.lblIN3.Location = new System.Drawing.Point(153, 49);
+ this.lblIN3.Name = "lblIN3";
+ this.lblIN3.Size = new System.Drawing.Size(19, 17);
+ this.lblIN3.TabIndex = 5;
+ this.lblIN3.Tag = "3";
+ //
+ // label40
+ //
+ this.label40.AutoSize = true;
+ this.label40.Location = new System.Drawing.Point(221, 28);
+ this.label40.Name = "label40";
+ this.label40.Size = new System.Drawing.Size(11, 12);
+ this.label40.TabIndex = 5;
+ this.label40.Text = "5";
+ //
+ // label39
+ //
+ this.label39.AutoSize = true;
+ this.label39.Location = new System.Drawing.Point(189, 28);
+ this.label39.Name = "label39";
+ this.label39.Size = new System.Drawing.Size(11, 12);
+ this.label39.TabIndex = 5;
+ this.label39.Text = "4";
+ //
+ // label38
+ //
+ this.label38.AutoSize = true;
+ this.label38.Location = new System.Drawing.Point(157, 28);
+ this.label38.Name = "label38";
+ this.label38.Size = new System.Drawing.Size(11, 12);
+ this.label38.TabIndex = 5;
+ this.label38.Text = "3";
+ //
+ // lblOUT6
+ //
+ this.lblOUT6.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT6.Image")));
+ this.lblOUT6.Location = new System.Drawing.Point(249, 72);
+ this.lblOUT6.Name = "lblOUT6";
+ this.lblOUT6.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT6.TabIndex = 5;
+ this.lblOUT6.Tag = "6";
+ //
+ // lblIN6
+ //
+ this.lblIN6.Image = ((System.Drawing.Image)(resources.GetObject("lblIN6.Image")));
+ this.lblIN6.Location = new System.Drawing.Point(249, 49);
+ this.lblIN6.Name = "lblIN6";
+ this.lblIN6.Size = new System.Drawing.Size(19, 17);
+ this.lblIN6.TabIndex = 5;
+ this.lblIN6.Tag = "6";
+ //
+ // label37
+ //
+ this.label37.AutoSize = true;
+ this.label37.Location = new System.Drawing.Point(125, 28);
+ this.label37.Name = "label37";
+ this.label37.Size = new System.Drawing.Size(11, 12);
+ this.label37.TabIndex = 5;
+ this.label37.Text = "2";
+ //
+ // lblOUT2
+ //
+ this.lblOUT2.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT2.Image")));
+ this.lblOUT2.Location = new System.Drawing.Point(121, 72);
+ this.lblOUT2.Name = "lblOUT2";
+ this.lblOUT2.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT2.TabIndex = 5;
+ this.lblOUT2.Tag = "2";
+ //
+ // lblIN2
+ //
+ this.lblIN2.Image = ((System.Drawing.Image)(resources.GetObject("lblIN2.Image")));
+ this.lblIN2.Location = new System.Drawing.Point(121, 49);
+ this.lblIN2.Name = "lblIN2";
+ this.lblIN2.Size = new System.Drawing.Size(19, 17);
+ this.lblIN2.TabIndex = 5;
+ this.lblIN2.Tag = "2";
+ //
+ // lblOUT5
+ //
+ this.lblOUT5.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT5.Image")));
+ this.lblOUT5.Location = new System.Drawing.Point(217, 72);
+ this.lblOUT5.Name = "lblOUT5";
+ this.lblOUT5.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT5.TabIndex = 5;
+ this.lblOUT5.Tag = "5";
+ //
+ // lblIN5
+ //
+ this.lblIN5.Image = ((System.Drawing.Image)(resources.GetObject("lblIN5.Image")));
+ this.lblIN5.Location = new System.Drawing.Point(217, 49);
+ this.lblIN5.Name = "lblIN5";
+ this.lblIN5.Size = new System.Drawing.Size(19, 17);
+ this.lblIN5.TabIndex = 5;
+ this.lblIN5.Tag = "5";
+ //
+ // label31
+ //
+ this.label31.AutoSize = true;
+ this.label31.Location = new System.Drawing.Point(93, 28);
+ this.label31.Name = "label31";
+ this.label31.Size = new System.Drawing.Size(11, 12);
+ this.label31.TabIndex = 5;
+ this.label31.Text = "1";
+ //
+ // label30
+ //
+ this.label30.AutoSize = true;
+ this.label30.Location = new System.Drawing.Point(61, 28);
+ this.label30.Name = "label30";
+ this.label30.Size = new System.Drawing.Size(11, 12);
+ this.label30.TabIndex = 5;
+ this.label30.Text = "0";
+ //
+ // lblOUT1
+ //
+ this.lblOUT1.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT1.Image")));
+ this.lblOUT1.Location = new System.Drawing.Point(89, 72);
+ this.lblOUT1.Name = "lblOUT1";
+ this.lblOUT1.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT1.TabIndex = 5;
+ this.lblOUT1.Tag = "1";
+ //
+ // lblIN1
+ //
+ this.lblIN1.Image = ((System.Drawing.Image)(resources.GetObject("lblIN1.Image")));
+ this.lblIN1.Location = new System.Drawing.Point(89, 49);
+ this.lblIN1.Name = "lblIN1";
+ this.lblIN1.Size = new System.Drawing.Size(19, 17);
+ this.lblIN1.TabIndex = 5;
+ this.lblIN1.Tag = "1";
+ //
+ // lblOUT0
+ //
+ this.lblOUT0.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT0.Image")));
+ this.lblOUT0.Location = new System.Drawing.Point(57, 72);
+ this.lblOUT0.Name = "lblOUT0";
+ this.lblOUT0.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT0.TabIndex = 5;
+ this.lblOUT0.Tag = "0";
+ //
+ // lblOUT4
+ //
+ this.lblOUT4.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT4.Image")));
+ this.lblOUT4.Location = new System.Drawing.Point(185, 72);
+ this.lblOUT4.Name = "lblOUT4";
+ this.lblOUT4.Size = new System.Drawing.Size(19, 17);
+ this.lblOUT4.TabIndex = 5;
+ this.lblOUT4.Tag = "4";
+ //
+ // lblIN0
+ //
+ this.lblIN0.Image = ((System.Drawing.Image)(resources.GetObject("lblIN0.Image")));
+ this.lblIN0.Location = new System.Drawing.Point(57, 49);
+ this.lblIN0.Name = "lblIN0";
+ this.lblIN0.Size = new System.Drawing.Size(19, 17);
+ this.lblIN0.TabIndex = 5;
+ this.lblIN0.Tag = "0";
+ //
+ // lblIN4
+ //
+ this.lblIN4.Image = ((System.Drawing.Image)(resources.GetObject("lblIN4.Image")));
+ this.lblIN4.Location = new System.Drawing.Point(185, 49);
+ this.lblIN4.Name = "lblIN4";
+ this.lblIN4.Size = new System.Drawing.Size(19, 17);
+ this.lblIN4.TabIndex = 5;
+ this.lblIN4.Tag = "4";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.lstLog);
+ this.groupBox3.Controls.Add(this.btnEventProgramEnd);
+ this.groupBox3.Controls.Add(this.btnEventMotionEnd);
+ this.groupBox3.Location = new System.Drawing.Point(589, 250);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(314, 235);
+ this.groupBox3.TabIndex = 5;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "事件回调";
+ //
+ // lstLog
+ //
+ this.lstLog.FormattingEnabled = true;
+ this.lstLog.ItemHeight = 12;
+ this.lstLog.Location = new System.Drawing.Point(7, 50);
+ this.lstLog.Name = "lstLog";
+ this.lstLog.Size = new System.Drawing.Size(299, 172);
+ this.lstLog.TabIndex = 1;
+ //
+ // btnEventProgramEnd
+ //
+ this.btnEventProgramEnd.Location = new System.Drawing.Point(159, 17);
+ this.btnEventProgramEnd.Name = "btnEventProgramEnd";
+ this.btnEventProgramEnd.Size = new System.Drawing.Size(148, 23);
+ this.btnEventProgramEnd.TabIndex = 0;
+ this.btnEventProgramEnd.Text = "程序结束";
+ this.btnEventProgramEnd.UseVisualStyleBackColor = true;
+ this.btnEventProgramEnd.Click += new System.EventHandler(this.btnEventProgramEnd_Click);
+ //
+ // btnEventMotionEnd
+ //
+ this.btnEventMotionEnd.Location = new System.Drawing.Point(7, 17);
+ this.btnEventMotionEnd.Name = "btnEventMotionEnd";
+ this.btnEventMotionEnd.Size = new System.Drawing.Size(148, 23);
+ this.btnEventMotionEnd.TabIndex = 0;
+ this.btnEventMotionEnd.Text = "运动结束";
+ this.btnEventMotionEnd.UseVisualStyleBackColor = true;
+ this.btnEventMotionEnd.Click += new System.EventHandler(this.btnEventMotionEnd_Click);
+ //
+ // rtxtTerminal
+ //
+ this.rtxtTerminal.Location = new System.Drawing.Point(9, 47);
+ this.rtxtTerminal.Name = "rtxtTerminal";
+ this.rtxtTerminal.Size = new System.Drawing.Size(875, 162);
+ this.rtxtTerminal.TabIndex = 6;
+ this.rtxtTerminal.Text = "";
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.btnSend);
+ this.groupBox4.Controls.Add(this.txtCommand);
+ this.groupBox4.Controls.Add(this.rtxtTerminal);
+ this.groupBox4.Location = new System.Drawing.Point(11, 493);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(892, 220);
+ this.groupBox4.TabIndex = 7;
+ this.groupBox4.TabStop = false;
+ this.groupBox4.Text = "命令行通讯";
+ //
+ // btnSend
+ //
+ this.btnSend.Location = new System.Drawing.Point(784, 20);
+ this.btnSend.Name = "btnSend";
+ this.btnSend.Size = new System.Drawing.Size(100, 23);
+ this.btnSend.TabIndex = 8;
+ this.btnSend.Text = "发送";
+ this.btnSend.UseVisualStyleBackColor = true;
+ this.btnSend.Click += new System.EventHandler(this.btnSend_Click);
+ //
+ // txtCommand
+ //
+ this.txtCommand.Location = new System.Drawing.Point(9, 20);
+ this.txtCommand.Name = "txtCommand";
+ this.txtCommand.Size = new System.Drawing.Size(769, 21);
+ this.txtCommand.TabIndex = 7;
+ this.txtCommand.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtCommand_KeyPress);
+ //
+ // groupBox5
+ //
+ this.groupBox5.Controls.Add(this.groupBox9);
+ this.groupBox5.Controls.Add(this.groupBox8);
+ this.groupBox5.Controls.Add(this.groupBox7);
+ this.groupBox5.Controls.Add(this.groupBox6);
+ this.groupBox5.Location = new System.Drawing.Point(919, 12);
+ this.groupBox5.Name = "groupBox5";
+ this.groupBox5.Size = new System.Drawing.Size(298, 592);
+ this.groupBox5.TabIndex = 8;
+ this.groupBox5.TabStop = false;
+ this.groupBox5.Text = "XYZ轴运动";
+ //
+ // groupBox9
+ //
+ this.groupBox9.Controls.Add(this.label56);
+ this.groupBox9.Controls.Add(this.label55);
+ this.groupBox9.Controls.Add(this.label54);
+ this.groupBox9.Controls.Add(this.label53);
+ this.groupBox9.Controls.Add(this.label52);
+ this.groupBox9.Controls.Add(this.label51);
+ this.groupBox9.Controls.Add(this.label50);
+ this.groupBox9.Controls.Add(this.label49);
+ this.groupBox9.Controls.Add(this.label47);
+ this.groupBox9.Location = new System.Drawing.Point(6, 447);
+ this.groupBox9.Name = "groupBox9";
+ this.groupBox9.Size = new System.Drawing.Size(279, 139);
+ this.groupBox9.TabIndex = 3;
+ this.groupBox9.TabStop = false;
+ this.groupBox9.Text = "当前实际位置/规划位置(mm)";
+ //
+ // label56
+ //
+ this.label56.AutoSize = true;
+ this.label56.Location = new System.Drawing.Point(197, 95);
+ this.label56.Name = "label56";
+ this.label56.Size = new System.Drawing.Size(11, 12);
+ this.label56.TabIndex = 8;
+ this.label56.Text = "0";
+ //
+ // label55
+ //
+ this.label55.AutoSize = true;
+ this.label55.Location = new System.Drawing.Point(197, 65);
+ this.label55.Name = "label55";
+ this.label55.Size = new System.Drawing.Size(11, 12);
+ this.label55.TabIndex = 7;
+ this.label55.Text = "0";
+ //
+ // label54
+ //
+ this.label54.AutoSize = true;
+ this.label54.Location = new System.Drawing.Point(197, 34);
+ this.label54.Name = "label54";
+ this.label54.Size = new System.Drawing.Size(11, 12);
+ this.label54.TabIndex = 6;
+ this.label54.Text = "0";
+ //
+ // label53
+ //
+ this.label53.AutoSize = true;
+ this.label53.Location = new System.Drawing.Point(127, 95);
+ this.label53.Name = "label53";
+ this.label53.Size = new System.Drawing.Size(11, 12);
+ this.label53.TabIndex = 5;
+ this.label53.Text = "0";
+ //
+ // label52
+ //
+ this.label52.AutoSize = true;
+ this.label52.Location = new System.Drawing.Point(127, 65);
+ this.label52.Name = "label52";
+ this.label52.Size = new System.Drawing.Size(11, 12);
+ this.label52.TabIndex = 4;
+ this.label52.Text = "0";
+ //
+ // label51
+ //
+ this.label51.AutoSize = true;
+ this.label51.Location = new System.Drawing.Point(127, 34);
+ this.label51.Name = "label51";
+ this.label51.Size = new System.Drawing.Size(11, 12);
+ this.label51.TabIndex = 3;
+ this.label51.Text = "0";
+ //
+ // label50
+ //
+ this.label50.AutoSize = true;
+ this.label50.Location = new System.Drawing.Point(50, 95);
+ this.label50.Name = "label50";
+ this.label50.Size = new System.Drawing.Size(17, 12);
+ this.label50.TabIndex = 2;
+ this.label50.Text = "Z:";
+ //
+ // label49
+ //
+ this.label49.AutoSize = true;
+ this.label49.Location = new System.Drawing.Point(50, 65);
+ this.label49.Name = "label49";
+ this.label49.Size = new System.Drawing.Size(17, 12);
+ this.label49.TabIndex = 1;
+ this.label49.Text = "Y:";
+ //
+ // label47
+ //
+ this.label47.AutoSize = true;
+ this.label47.Location = new System.Drawing.Point(50, 34);
+ this.label47.Name = "label47";
+ this.label47.Size = new System.Drawing.Size(17, 12);
+ this.label47.TabIndex = 0;
+ this.label47.Text = "X:";
+ //
+ // groupBox8
+ //
+ this.groupBox8.Controls.Add(this.button8);
+ this.groupBox8.Controls.Add(this.checkBox1);
+ this.groupBox8.Controls.Add(this.textBox3);
+ this.groupBox8.Controls.Add(this.textBox2);
+ this.groupBox8.Controls.Add(this.textBox1);
+ this.groupBox8.Controls.Add(this.label46);
+ this.groupBox8.Controls.Add(this.label45);
+ this.groupBox8.Controls.Add(this.label44);
+ this.groupBox8.Location = new System.Drawing.Point(6, 268);
+ this.groupBox8.Name = "groupBox8";
+ this.groupBox8.Size = new System.Drawing.Size(283, 163);
+ this.groupBox8.TabIndex = 2;
+ this.groupBox8.TabStop = false;
+ this.groupBox8.Text = "定位";
+ //
+ // button8
+ //
+ this.button8.Location = new System.Drawing.Point(129, 122);
+ this.button8.Name = "button8";
+ this.button8.Size = new System.Drawing.Size(120, 37);
+ this.button8.TabIndex = 7;
+ this.button8.Text = "移动到目标位置";
+ this.button8.UseVisualStyleBackColor = true;
+ //
+ // checkBox1
+ //
+ this.checkBox1.AutoSize = true;
+ this.checkBox1.Location = new System.Drawing.Point(39, 133);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(48, 16);
+ this.checkBox1.TabIndex = 6;
+ this.checkBox1.Text = "等待";
+ this.checkBox1.UseVisualStyleBackColor = true;
+ //
+ // textBox3
+ //
+ this.textBox3.Location = new System.Drawing.Point(149, 54);
+ this.textBox3.Name = "textBox3";
+ this.textBox3.Size = new System.Drawing.Size(100, 21);
+ this.textBox3.TabIndex = 5;
+ //
+ // textBox2
+ //
+ this.textBox2.Location = new System.Drawing.Point(149, 87);
+ this.textBox2.Name = "textBox2";
+ this.textBox2.Size = new System.Drawing.Size(100, 21);
+ this.textBox2.TabIndex = 4;
+ //
+ // textBox1
+ //
+ this.textBox1.Location = new System.Drawing.Point(149, 21);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(100, 21);
+ this.textBox1.TabIndex = 3;
+ //
+ // label46
+ //
+ this.label46.AutoSize = true;
+ this.label46.Location = new System.Drawing.Point(39, 90);
+ this.label46.Name = "label46";
+ this.label46.Size = new System.Drawing.Size(59, 12);
+ this.label46.TabIndex = 2;
+ this.label46.Text = "Z位置(mm)";
+ //
+ // label45
+ //
+ this.label45.AutoSize = true;
+ this.label45.Location = new System.Drawing.Point(39, 57);
+ this.label45.Name = "label45";
+ this.label45.Size = new System.Drawing.Size(59, 12);
+ this.label45.TabIndex = 1;
+ this.label45.Text = "Y位置(mm)";
+ //
+ // label44
+ //
+ this.label44.AutoSize = true;
+ this.label44.Location = new System.Drawing.Point(39, 24);
+ this.label44.Name = "label44";
+ this.label44.Size = new System.Drawing.Size(59, 12);
+ this.label44.TabIndex = 0;
+ this.label44.Text = "X位置(mm)";
+ //
+ // groupBox7
+ //
+ this.groupBox7.Controls.Add(this.button7);
+ this.groupBox7.Controls.Add(this.button6);
+ this.groupBox7.Controls.Add(this.button5);
+ this.groupBox7.Controls.Add(this.button4);
+ this.groupBox7.Location = new System.Drawing.Point(6, 100);
+ this.groupBox7.Name = "groupBox7";
+ this.groupBox7.Size = new System.Drawing.Size(283, 160);
+ this.groupBox7.TabIndex = 1;
+ this.groupBox7.TabStop = false;
+ this.groupBox7.Text = "Jog";
+ //
+ // button7
+ //
+ this.button7.Location = new System.Drawing.Point(104, 107);
+ this.button7.Name = "button7";
+ this.button7.Size = new System.Drawing.Size(75, 35);
+ this.button7.TabIndex = 3;
+ this.button7.Text = "Y后退";
+ this.button7.UseVisualStyleBackColor = true;
+ //
+ // button6
+ //
+ this.button6.Location = new System.Drawing.Point(198, 61);
+ this.button6.Name = "button6";
+ this.button6.Size = new System.Drawing.Size(75, 35);
+ this.button6.TabIndex = 2;
+ this.button6.Text = "X右移";
+ this.button6.UseVisualStyleBackColor = true;
+ //
+ // button5
+ //
+ this.button5.Location = new System.Drawing.Point(10, 61);
+ this.button5.Name = "button5";
+ this.button5.Size = new System.Drawing.Size(75, 35);
+ this.button5.TabIndex = 1;
+ this.button5.Text = "X左移";
+ this.button5.UseVisualStyleBackColor = true;
+ //
+ // button4
+ //
+ this.button4.Location = new System.Drawing.Point(104, 12);
+ this.button4.Name = "button4";
+ this.button4.Size = new System.Drawing.Size(75, 35);
+ this.button4.TabIndex = 0;
+ this.button4.Text = "Y前进";
+ this.button4.UseVisualStyleBackColor = true;
+ //
+ // groupBox6
+ //
+ this.groupBox6.Controls.Add(this.button3);
+ this.groupBox6.Controls.Add(this.button2);
+ this.groupBox6.Controls.Add(this.button1);
+ this.groupBox6.Location = new System.Drawing.Point(6, 24);
+ this.groupBox6.Name = "groupBox6";
+ this.groupBox6.Size = new System.Drawing.Size(283, 70);
+ this.groupBox6.TabIndex = 0;
+ this.groupBox6.TabStop = false;
+ this.groupBox6.Text = "动作";
+ //
+ // button3
+ //
+ this.button3.Location = new System.Drawing.Point(198, 24);
+ this.button3.Name = "button3";
+ this.button3.Size = new System.Drawing.Size(75, 30);
+ this.button3.TabIndex = 2;
+ this.button3.Text = "回原点";
+ this.button3.UseVisualStyleBackColor = true;
+ //
+ // button2
+ //
+ this.button2.Location = new System.Drawing.Point(104, 24);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(75, 30);
+ this.button2.TabIndex = 1;
+ this.button2.Text = "停止";
+ this.button2.UseVisualStyleBackColor = true;
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(10, 24);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(75, 30);
+ this.button1.TabIndex = 0;
+ this.button1.Text = "开始";
+ this.button1.UseVisualStyleBackColor = true;
+ //
+ // groupBox10
+ //
+ this.groupBox10.Controls.Add(this.label48);
+ this.groupBox10.Controls.Add(this.textBox4);
+ this.groupBox10.Controls.Add(this.button10);
+ this.groupBox10.Controls.Add(this.button9);
+ this.groupBox10.Controls.Add(this.checkBox4);
+ this.groupBox10.Controls.Add(this.checkBox3);
+ this.groupBox10.Controls.Add(this.checkBox2);
+ this.groupBox10.Location = new System.Drawing.Point(919, 610);
+ this.groupBox10.Name = "groupBox10";
+ this.groupBox10.Size = new System.Drawing.Size(295, 103);
+ this.groupBox10.TabIndex = 9;
+ this.groupBox10.TabStop = false;
+ this.groupBox10.Text = "XYZ循环";
+ //
+ // label48
+ //
+ this.label48.AutoSize = true;
+ this.label48.Location = new System.Drawing.Point(220, 65);
+ this.label48.Name = "label48";
+ this.label48.Size = new System.Drawing.Size(17, 12);
+ this.label48.TabIndex = 7;
+ this.label48.Text = "次";
+ //
+ // textBox4
+ //
+ this.textBox4.Location = new System.Drawing.Point(179, 61);
+ this.textBox4.Name = "textBox4";
+ this.textBox4.Size = new System.Drawing.Size(35, 21);
+ this.textBox4.TabIndex = 5;
+ //
+ // button10
+ //
+ this.button10.Location = new System.Drawing.Point(94, 60);
+ this.button10.Name = "button10";
+ this.button10.Size = new System.Drawing.Size(60, 23);
+ this.button10.TabIndex = 4;
+ this.button10.Text = "停止";
+ this.button10.UseVisualStyleBackColor = true;
+ //
+ // button9
+ //
+ this.button9.Location = new System.Drawing.Point(13, 60);
+ this.button9.Name = "button9";
+ this.button9.Size = new System.Drawing.Size(60, 23);
+ this.button9.TabIndex = 3;
+ this.button9.Text = "运行";
+ this.button9.UseVisualStyleBackColor = true;
+ //
+ // checkBox4
+ //
+ this.checkBox4.AutoSize = true;
+ this.checkBox4.Location = new System.Drawing.Point(184, 21);
+ this.checkBox4.Name = "checkBox4";
+ this.checkBox4.Size = new System.Drawing.Size(30, 16);
+ this.checkBox4.TabIndex = 2;
+ this.checkBox4.Text = "Z";
+ this.checkBox4.UseVisualStyleBackColor = true;
+ //
+ // checkBox3
+ //
+ this.checkBox3.AutoSize = true;
+ this.checkBox3.Location = new System.Drawing.Point(100, 21);
+ this.checkBox3.Name = "checkBox3";
+ this.checkBox3.Size = new System.Drawing.Size(30, 16);
+ this.checkBox3.TabIndex = 1;
+ this.checkBox3.Text = "Y";
+ this.checkBox3.UseVisualStyleBackColor = true;
+ //
+ // checkBox2
+ //
+ this.checkBox2.AutoSize = true;
+ this.checkBox2.Location = new System.Drawing.Point(16, 21);
+ this.checkBox2.Name = "checkBox2";
+ this.checkBox2.Size = new System.Drawing.Size(30, 16);
+ this.checkBox2.TabIndex = 0;
+ this.checkBox2.Text = "X";
+ this.checkBox2.UseVisualStyleBackColor = true;
+ //
+ // MainForm
+ //
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+ this.ClientSize = new System.Drawing.Size(1226, 725);
+ this.Controls.Add(this.groupBox10);
+ this.Controls.Add(this.groupBox5);
+ this.Controls.Add(this.groupBox4);
+ this.Controls.Add(this.groupBox3);
+ this.Controls.Add(this.grpIO);
+ this.Controls.Add(this.groupBox2);
+ this.Controls.Add(this.grpSafety);
+ this.Controls.Add(this.grpMotionTest);
+ this.Controls.Add(this.groupBox1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "MainForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "HexcalMC运动补偿";
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.grpMotionTest.ResumeLayout(false);
+ this.grpMotionTest.PerformLayout();
+ this.grpMst.ResumeLayout(false);
+ this.grpMst.PerformLayout();
+ this.grpPositions.ResumeLayout(false);
+ this.grpPositions.PerformLayout();
+ this.grpJog.ResumeLayout(false);
+ this.grpJog.PerformLayout();
+ this.grpProfile.ResumeLayout(false);
+ this.grpProfile.PerformLayout();
+ this.grpPTP.ResumeLayout(false);
+ this.grpPTP.PerformLayout();
+ this.grpSafety.ResumeLayout(false);
+ this.grpSafety.PerformLayout();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ this.grpIO.ResumeLayout(false);
+ this.grpIO.PerformLayout();
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox4.PerformLayout();
+ this.groupBox5.ResumeLayout(false);
+ this.groupBox9.ResumeLayout(false);
+ this.groupBox9.PerformLayout();
+ this.groupBox8.ResumeLayout(false);
+ this.groupBox8.PerformLayout();
+ this.groupBox7.ResumeLayout(false);
+ this.groupBox6.ResumeLayout(false);
+ this.groupBox10.ResumeLayout(false);
+ this.groupBox10.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Timer tmrMonitor;
+ private System.Windows.Forms.GroupBox grpMotionTest;
+ private System.Windows.Forms.ComboBox cboAxisNo;
+ private System.Windows.Forms.GroupBox grpJog;
+ private System.Windows.Forms.Button btnJogPos;
+ private System.Windows.Forms.Button btnJogNeg;
+ private System.Windows.Forms.TextBox txtJogVel;
+ private System.Windows.Forms.CheckBox chkUseVel;
+ private System.Windows.Forms.GroupBox grpProfile;
+ private System.Windows.Forms.Button btnDisable;
+ private System.Windows.Forms.Button btnEnable;
+ private System.Windows.Forms.TextBox txtJerk;
+ private System.Windows.Forms.TextBox txtKdec;
+ private System.Windows.Forms.TextBox txtDec;
+ private System.Windows.Forms.TextBox txtAcc;
+ private System.Windows.Forms.TextBox txtVel;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.GroupBox grpPTP;
+ private System.Windows.Forms.Button btnPTP_R_Neg;
+ private System.Windows.Forms.Button btnPTP;
+ private System.Windows.Forms.TextBox txtPTP_Pos;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.TextBox txtPort;
+ private System.Windows.Forms.TextBox txtIP;
+ private System.Windows.Forms.Button btnClose;
+ private System.Windows.Forms.Button btnOpen;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.RadioButton rdoTCP;
+ private System.Windows.Forms.RadioButton rdoSimu;
+ private System.Windows.Forms.Button btnHalt;
+ private System.Windows.Forms.GroupBox grpMst;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.GroupBox grpPositions;
+ private System.Windows.Forms.Button btnSetZero;
+ private System.Windows.Forms.TextBox txtPE;
+ private System.Windows.Forms.TextBox txtFPOS;
+ private System.Windows.Forms.TextBox txtRPOS;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.Button btnDisableAll;
+ private System.Windows.Forms.Button btnPTP_R_Pos;
+ private System.Windows.Forms.Button btnHallAll;
+ private System.Windows.Forms.Label lblMoving;
+ private System.Windows.Forms.Label lblEnable;
+ private System.Windows.Forms.Label lblInPos;
+ private System.Windows.Forms.Label lblAcc;
+ private System.Windows.Forms.GroupBox grpSafety;
+ private System.Windows.Forms.Label lblEMG;
+ private System.Windows.Forms.Label lblRL7;
+ private System.Windows.Forms.Label lblRL3;
+ private System.Windows.Forms.Label lblLL7;
+ private System.Windows.Forms.Label lblLL3;
+ private System.Windows.Forms.Label lblRL6;
+ private System.Windows.Forms.Label lblRL2;
+ private System.Windows.Forms.Label lblLL6;
+ private System.Windows.Forms.Label lblRL5;
+ private System.Windows.Forms.Label lblLL2;
+ private System.Windows.Forms.Label lblLL5;
+ private System.Windows.Forms.Label lblRL1;
+ private System.Windows.Forms.Label lblRL4;
+ private System.Windows.Forms.Label lblLL1;
+ private System.Windows.Forms.Label lblLL4;
+ private System.Windows.Forms.Label lblRL0;
+ private System.Windows.Forms.Label lblLL0;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.Label label36;
+ private System.Windows.Forms.Label label27;
+ private System.Windows.Forms.Label label35;
+ private System.Windows.Forms.Label label26;
+ private System.Windows.Forms.Label label34;
+ private System.Windows.Forms.Label label25;
+ private System.Windows.Forms.Label label33;
+ private System.Windows.Forms.Label label24;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.ComboBox cboBufferNo;
+ private System.Windows.Forms.Label label21;
+ private System.Windows.Forms.Button btnStopBuffer;
+ private System.Windows.Forms.Button btnRunBuffer;
+ private System.Windows.Forms.TextBox txtLabelName;
+ private System.Windows.Forms.Label label22;
+ private System.Windows.Forms.Label label28;
+ private System.Windows.Forms.Label lblPRG_Status;
+ private System.Windows.Forms.Label lblPRG_Status_LED;
+ private System.Windows.Forms.GroupBox grpIO;
+ private System.Windows.Forms.Button btnSW7;
+ private System.Windows.Forms.Button btnSW6;
+ private System.Windows.Forms.Button btnSW5;
+ private System.Windows.Forms.Button btnSW4;
+ private System.Windows.Forms.Button btnSW3;
+ private System.Windows.Forms.Button btnSW2;
+ private System.Windows.Forms.Button btnSW0;
+ private System.Windows.Forms.Button btnSW1;
+ private System.Windows.Forms.Label label29;
+ private System.Windows.Forms.Label label23;
+ private System.Windows.Forms.Label label42;
+ private System.Windows.Forms.Label lblOUT7;
+ private System.Windows.Forms.Label lblIN7;
+ private System.Windows.Forms.Label label41;
+ private System.Windows.Forms.Label lblOUT3;
+ private System.Windows.Forms.Label lblIN3;
+ private System.Windows.Forms.Label label40;
+ private System.Windows.Forms.Label label39;
+ private System.Windows.Forms.Label label38;
+ private System.Windows.Forms.Label lblOUT6;
+ private System.Windows.Forms.Label lblIN6;
+ private System.Windows.Forms.Label label37;
+ private System.Windows.Forms.Label lblOUT2;
+ private System.Windows.Forms.Label lblIN2;
+ private System.Windows.Forms.Label lblOUT5;
+ private System.Windows.Forms.Label lblIN5;
+ private System.Windows.Forms.Label label31;
+ private System.Windows.Forms.Label label30;
+ private System.Windows.Forms.Label lblOUT1;
+ private System.Windows.Forms.Label lblIN1;
+ private System.Windows.Forms.Label lblOUT0;
+ private System.Windows.Forms.Label lblOUT4;
+ private System.Windows.Forms.Label lblIN0;
+ private System.Windows.Forms.Label lblIN4;
+ private System.Windows.Forms.Label label32;
+ private System.Windows.Forms.TextBox txtFVEL;
+ private System.Windows.Forms.Label label43;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.Button btnEventProgramEnd;
+ private System.Windows.Forms.Button btnEventMotionEnd;
+ private System.Windows.Forms.ListBox lstLog;
+ private System.Windows.Forms.RichTextBox rtxtTerminal;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.Button btnSend;
+ private System.Windows.Forms.TextBox txtCommand;
+ private System.Windows.Forms.GroupBox groupBox5;
+ private System.Windows.Forms.GroupBox groupBox9;
+ private System.Windows.Forms.GroupBox groupBox8;
+ private System.Windows.Forms.Button button8;
+ private System.Windows.Forms.CheckBox checkBox1;
+ private System.Windows.Forms.TextBox textBox3;
+ private System.Windows.Forms.TextBox textBox2;
+ private System.Windows.Forms.TextBox textBox1;
+ private System.Windows.Forms.Label label46;
+ private System.Windows.Forms.Label label45;
+ private System.Windows.Forms.Label label44;
+ private System.Windows.Forms.GroupBox groupBox7;
+ private System.Windows.Forms.Button button7;
+ private System.Windows.Forms.Button button6;
+ private System.Windows.Forms.Button button5;
+ private System.Windows.Forms.Button button4;
+ private System.Windows.Forms.GroupBox groupBox6;
+ private System.Windows.Forms.Button button3;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.GroupBox groupBox10;
+ private System.Windows.Forms.Label label48;
+ private System.Windows.Forms.TextBox textBox4;
+ private System.Windows.Forms.Button button10;
+ private System.Windows.Forms.Button button9;
+ private System.Windows.Forms.CheckBox checkBox4;
+ private System.Windows.Forms.CheckBox checkBox3;
+ private System.Windows.Forms.CheckBox checkBox2;
+ private System.Windows.Forms.Label label56;
+ private System.Windows.Forms.Label label55;
+ private System.Windows.Forms.Label label54;
+ private System.Windows.Forms.Label label53;
+ private System.Windows.Forms.Label label52;
+ private System.Windows.Forms.Label label51;
+ private System.Windows.Forms.Label label50;
+ private System.Windows.Forms.Label label49;
+ private System.Windows.Forms.Label label47;
+ }
+}
+
diff --git a/HexcalMC/Motion/Motion.cs b/HexcalMC/Motion/Motion.cs
new file mode 100644
index 0000000..82721b6
--- /dev/null
+++ b/HexcalMC/Motion/Motion.cs
@@ -0,0 +1,971 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Threading;
+using System.IO;
+using ACS.SPiiPlusNET; // ACS .NET Library
+using System.Runtime.InteropServices;
+
+namespace HexcalMC
+{
+ public partial class Motion : Form
+ {
+ private Api _ACS;
+
+ private const int MAX_AXIS_COUNT = 32;
+ private const int MAX_BUFFER_CNT = 64;
+
+ private const int MAX_UI_LIMIT_CNT = 8;
+ private const int MAX_UI_IO_CNT = 8;
+
+ private int m_nTotalAxis = 0;
+ private int m_nTotalBuffer = 0;
+ private Axis[] m_arrAxisList = null;
+
+ private bool m_bConnected = false;
+
+ // For update values
+ private MotorStates m_nMotorState; //运动状态
+ private ProgramStates m_nProgramState; //程序状态
+ private object m_objReadVar = null;
+ private Array m_arrReadVector = null;
+ private double m_lfRPos, m_lfFPos, m_lfPE, m_lfFVEL; //参考位置,反馈位置 位置误差 反馈速度 double类型
+ private int m_nValues, m_nOutputState;
+
+
+ private Label[] m_lblLeftLimit; //左限位
+ private Label[] m_lblRightLimit; //右限位
+ private Label[] m_lblInput;
+ private Label[] m_lblOutput;
+ private Button[] m_btnOutput;
+
+ public Motion()
+ {
+ InitializeComponent();
+
+ _ACS = new Api(); //初始化 ACS运动控制类
+
+ // Register Event 注册时间
+ _ACS.PHYSICALMOTIONEND += _ACS_PHYSICALMOTIONEND;
+ _ACS.PROGRAMEND += _ACS_PROGRAMEND;
+ }
+
+ #region Initialize
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ rdoTCP.Checked = true;
+ btnOpen.Enabled = true;
+ btnClose.Enabled = false;
+
+ m_lblLeftLimit = new Label[MAX_UI_LIMIT_CNT]; //左限位
+ m_lblLeftLimit[0] = lblLL0;
+ m_lblLeftLimit[1] = lblLL1;
+ m_lblLeftLimit[2] = lblLL2;
+ m_lblLeftLimit[3] = lblLL3;
+ m_lblLeftLimit[4] = lblLL4;
+ m_lblLeftLimit[5] = lblLL5;
+ m_lblLeftLimit[6] = lblLL6;
+ m_lblLeftLimit[7] = lblLL7;
+
+ m_lblRightLimit = new Label[MAX_UI_LIMIT_CNT]; //有限位
+ m_lblRightLimit[0] = lblRL0;
+ m_lblRightLimit[1] = lblRL1;
+ m_lblRightLimit[2] = lblRL2;
+ m_lblRightLimit[3] = lblRL3;
+ m_lblRightLimit[4] = lblRL4;
+ m_lblRightLimit[5] = lblRL5;
+ m_lblRightLimit[6] = lblRL6;
+ m_lblRightLimit[7] = lblRL7;
+
+ m_lblInput = new Label[MAX_UI_IO_CNT];
+ m_lblInput[0] = lblIN0;
+ m_lblInput[1] = lblIN1;
+ m_lblInput[2] = lblIN2;
+ m_lblInput[3] = lblIN3;
+ m_lblInput[4] = lblIN4;
+ m_lblInput[5] = lblIN5;
+ m_lblInput[6] = lblIN6;
+ m_lblInput[7] = lblIN7;
+
+ m_lblOutput = new Label[MAX_UI_IO_CNT];
+ m_lblOutput[0] = lblOUT0;
+ m_lblOutput[1] = lblOUT1;
+ m_lblOutput[2] = lblOUT2;
+ m_lblOutput[3] = lblOUT3;
+ m_lblOutput[4] = lblOUT4;
+ m_lblOutput[5] = lblOUT5;
+ m_lblOutput[6] = lblOUT6;
+ m_lblOutput[7] = lblOUT7;
+
+ m_btnOutput = new Button[MAX_UI_IO_CNT];
+ m_btnOutput[0] = btnSW0;
+ m_btnOutput[1] = btnSW1;
+ m_btnOutput[2] = btnSW2;
+ m_btnOutput[3] = btnSW3;
+ m_btnOutput[4] = btnSW4;
+ m_btnOutput[5] = btnSW5;
+ m_btnOutput[6] = btnSW6;
+ m_btnOutput[7] = btnSW7;
+
+ //m_nFault = new int[MAX_AXIS_COUNT];
+ //Array.Clear(m_nFault, 0, MAX_AXIS_COUNT);
+ m_nOutputState = 0;
+
+ // Clear connection list from SPiiPlus UserMode-Driver (UMD)
+ //TernminateUMD_Connection();
+
+ #region 副屏显示功能
+ // Screen[] screens = Screen.AllScreens;
+ // Screen secondaryScreen = screens.Length > 1 ? screens[1] : screens[0]; // 如果有多个屏幕,选择第二个屏幕作为副屏幕
+ //
+ // // 创建一个新的窗体实例
+ // Form secondaryForm = new Form();
+ //
+ // // 设置窗体的位置和大小以适应副屏幕
+ // secondaryForm.StartPosition = FormStartPosition.Manual;
+ // secondaryForm.Location = secondaryScreen.Bounds.Location;
+ // secondaryForm.Size = secondaryScreen.Bounds.Size;
+ //
+ // // 可选:设置副屏窗体的标题、样式等其他属性
+ // secondaryForm.Text = "副屏窗体";
+ // // ... 其他属性设置
+ //
+ // // 显示副屏窗体
+ // secondaryForm.Show();
+
+
+ #endregion
+
+ }
+
+ private void rdoTCP_CheckedChanged(object sender, EventArgs e)
+ {
+ txtIP.Enabled = true;
+ txtPort.Enabled = true;
+ }
+
+ private void rdoSimu_CheckedChanged(object sender, EventArgs e)
+ {
+ txtIP.Enabled = false;
+ txtPort.Enabled = false;
+ }
+
+ #endregion
+
+ #region Communication - Open / Close
+
+ private void btnOpen_Click(object sender, EventArgs e)
+ {
+ string strTemp;
+ int i;
+ //double lfTemp = 0.0f;
+
+ try
+ {
+ if (rdoTCP.Checked)
+ {
+ // TCP/IP (Ethernet)
+ _ACS.OpenCommEthernetTCP(
+ txtIP.Text, // IP Address (Default : 10.0.0.100)
+ Convert.ToInt32(txtPort.Text.Trim())); // TCP/IP Port nubmer (default : 701)
+ }
+ else if (rdoSimu.Checked)
+ {
+ // Simmulation mode
+ _ACS.OpenCommSimulator();
+ }
+
+ m_bConnected = true;
+
+ // Get Total number of axes
+ // Using Transaction function : return string text from controller, we need to convert to integer value
+ strTemp = _ACS.Transaction("?SYSINFO(13)");
+ m_nTotalAxis = Convert.ToInt32(strTemp.Trim());
+
+ // Using Sysinfo function
+ //_ACS.GetSysInfo(_ACS.ACSC_SYS_NAXES_KEY, out lfTemp);
+
+ // When we are using multi axes command (ex) ToPointM, HaltM, ...), we need to allocate the array size more 1.
+ // Because of the last delimeter (-1)
+ m_arrAxisList = new Axis[m_nTotalAxis + 1];
+ for (i = 0; i < m_nTotalAxis; i++)
+ {
+ cboAxisNo.Items.Add(i.ToString());
+ m_arrAxisList[i] = (Axis)i;
+ }
+
+ // Insert '-1' at the last
+ m_arrAxisList[m_nTotalAxis] = Axis.ACSC_NONE;
+ cboAxisNo.SelectedIndex = 0;
+
+ // Update current motion paramter to UI.
+ UpdateProfile();
+
+ strTemp = _ACS.Transaction("?SYSINFO(10)");
+ m_nTotalBuffer = Convert.ToInt32(strTemp.Trim());
+ for (i = 0; i < m_nTotalBuffer; i++)
+ {
+ cboBufferNo.Items.Add(i.ToString());
+ }
+
+ cboBufferNo.SelectedIndex = 0;
+
+ btnOpen.Enabled = false;
+ btnClose.Enabled = true;
+
+ // Set updating timer
+ tmrMonitor.Interval = 50;
+ tmrMonitor.Start();
+ }
+
+ catch (COMException comex)
+ {
+ MessageBox.Show("Connection fail", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine("Connection fail" + comex.Message);
+
+ m_bConnected = false;
+ return;
+ }
+
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ private void btnClose_Click(object sender, EventArgs e)
+ {
+ if (m_bConnected) _ACS.CloseComm();
+
+ tmrMonitor.Stop();
+
+ btnOpen.Enabled = true;
+ btnClose.Enabled = false;
+ }
+
+
+ ///
+ /// Terminate connections from SPiiPlus User Mode Driver
+ /// 终止来自 SPiiPlus 用户模式驱动程序的连接
+ /// - Maximum connections up to 10 in UMD
+ ///
+ private void TernminateUMD_Connection()
+ {
+ try
+ {
+ string terminateExceptionConnName = "ACS.Framework.exe";
+
+ ACSC_CONNECTION_DESC[] connectionList = _ACS.GetConnectionsList();
+ for (int index = 0; index < connectionList.Length; index++)
+ {
+ if (terminateExceptionConnName.CompareTo((string)connectionList[index].Application) != 0)
+ _ACS.TerminateConnection(connectionList[index]);
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine(ex.ToString());
+ }
+ }
+
+ #endregion
+
+ #region Update UI data from Controller
+
+ ///
+ /// Update Motion Profile from Controller
+ ///
+ private void UpdateProfile()
+ {
+ if (m_bConnected)
+ {
+ txtVel.Text = _ACS.GetVelocity((Axis)cboAxisNo.SelectedIndex).ToString();
+ txtAcc.Text = _ACS.GetAcceleration((Axis)cboAxisNo.SelectedIndex).ToString();
+ txtDec.Text = _ACS.GetDeceleration((Axis)cboAxisNo.SelectedIndex).ToString();
+ txtKdec.Text = _ACS.GetKillDeceleration((Axis)cboAxisNo.SelectedIndex).ToString();
+ txtJerk.Text = _ACS.GetJerk((Axis)cboAxisNo.SelectedIndex).ToString();
+ }
+ }
+
+ private void cboAxisNo_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ UpdateProfile();
+ }
+
+ private void tmrMonitor_Tick(object sender, EventArgs e)
+ {
+ // Get selected axis number
+ int iAxisNo = cboAxisNo.SelectedIndex;
+ // Get selected buffer number
+ int iBufferNo = cboBufferNo.SelectedIndex;
+
+ if (m_bConnected)
+ {
+ try
+ {
+ // Instruction 1. Using library functions - acsc_GetFPosition, acsc_GetRPosition, ....
+ // Instruction 2. Read ACS variable - Already defined almost things (FPOS, RPOS, ...)
+ // Motion parameters and state is array (Max length is total number of axes)
+ //
+ // * Library function can read only 1 axis information, so if you want to read several axes, you have to call the function many times.
+ // (This may cause communication delay.)
+ // Recommand (if you want to read many axes) : read/write variable using ReadVariable, ReadVariableScalar, ReadVariableVector, ReadVariableMatrix
+
+ //
+ // Get Motor State
+ // ACSPL+ Variable : MST (integer)
+ m_nMotorState = _ACS.GetMotorState((Axis)iAxisNo);
+
+ // Returned value is integer, you need to use bitmaks
+ if ((m_nMotorState & MotorStates.ACSC_MST_MOVE) != 0) lblMoving.Image = Properties.Resources.On;
+ else lblMoving.Image = Properties.Resources.Off; // 运动中
+ if ((m_nMotorState & MotorStates.ACSC_MST_INPOS) != 0) lblInPos.Image = Properties.Resources.On;
+ else lblInPos.Image = Properties.Resources.Off; // 就位
+ if ((m_nMotorState & MotorStates.ACSC_MST_ACC) != 0) lblAcc.Image = Properties.Resources.On;
+ else lblAcc.Image = Properties.Resources.Off; // 加速
+ if ((m_nMotorState & MotorStates.ACSC_MST_ENABLE) != 0) lblEnable.Image = Properties.Resources.On;
+ else lblEnable.Image = Properties.Resources.Off; // 使能
+
+ // Reference position
+ // ACSPL+ Variable : RPOS (real)
+ m_lfRPos = _ACS.GetRPosition((Axis)iAxisNo); // 参考位置
+
+ // Feedback position (Encoder value)
+ // ACSPL+ Variable : FPO (real)
+ m_lfFPos = _ACS.GetFPosition((Axis)iAxisNo); //反馈位置
+
+ // PE (Position Error)
+ // There is no function in library. We need to use ReadVariable function
+ m_lfPE = (double)_ACS.ReadVariable("PE", ProgramBuffer.ACSC_NONE, iAxisNo, iAxisNo); //位置误差
+
+ // Feedback Velocity
+ m_lfFVEL = (double)_ACS.ReadVariable("FVEL", ProgramBuffer.ACSC_NONE, iAxisNo, iAxisNo); //实际速度
+
+ txtRPOS.Text = String.Format("{0:0.0000}", m_lfRPos);
+ txtFPOS.Text = String.Format("{0:0.0000}", m_lfFPos);
+ txtPE.Text = String.Format("{0:0.0000}", m_lfPE);
+ txtFVEL.Text = String.Format("{0:0.0000}", m_lfFVEL);
+
+ // Program State 运动状态
+ // State : Compiled, Running, Suspended, Autoroutine is running (ON syntax)
+ //
+ // ACSPL+ Variable : PST (integer)
+ m_nProgramState = _ACS.GetProgramState((ProgramBuffer)iBufferNo);
+ if ((m_nProgramState & ProgramStates.ACSC_PST_RUN) != 0)
+ {
+ lblPRG_Status_LED.Image = Properties.Resources.On;
+ lblPRG_Status.Text = "Running";
+ }
+ else
+ {
+ lblPRG_Status_LED.Image = Properties.Resources.Off;
+ lblPRG_Status.Text = "Stop";
+ }
+
+ // Read left/right hardware limits state
+ // ACSPL+ Variable : FAULT (integer)
+ m_objReadVar =
+ _ACS.ReadVariableAsVector("FAULT", ProgramBuffer.ACSC_NONE, 0, m_nTotalAxis - 1, -1, -1);
+ if (m_objReadVar != null)
+ {
+ m_arrReadVector = m_objReadVar as Array;
+ if (m_arrReadVector != null)
+ {
+ for (int i = 0; i < m_nTotalAxis; i++)
+ {
+ UpdateLimitState(i, (int)m_arrReadVector.GetValue(i));
+ }
+ }
+ }
+
+ // Read digital input/output (Port means all of bits)
+ // If you want to read only 1 bit (not an integer), use "GetInput" function
+ m_nValues = _ACS.GetInputPort(0); // _ACS.ReadVariableAsVector("IN", -1, 0, 0, -1, -1);
+ UpdateIOState(m_nValues, true);
+
+ m_nOutputState = _ACS.GetOutputPort(0); // _ACS.ReadVariableAsVector("OUT", -1, 0, 0, -1, -1);
+ UpdateIOState(m_nOutputState, false);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+ }
+
+ // Update limit state
+ private void UpdateLimitState(int axisNo, int fault)
+ {
+ if (axisNo < MAX_UI_LIMIT_CNT)
+ {
+ if ((fault & (int)SafetyControlMasks.ACSC_SAFETY_LL) != 0)
+ m_lblLeftLimit[axisNo].Image = Properties.Resources.Error;
+ else m_lblLeftLimit[axisNo].Image = Properties.Resources.Off;
+ if ((fault & (int)SafetyControlMasks.ACSC_SAFETY_RL) != 0)
+ m_lblRightLimit[axisNo].Image = Properties.Resources.Error;
+ else m_lblRightLimit[axisNo].Image = Properties.Resources.Off;
+ }
+ }
+
+ // Update general I/O stae
+ private void UpdateIOState(int value, bool isInput)
+ {
+ int bitUpCnt = 0x01;
+
+ for (int i = 0; i < MAX_UI_IO_CNT; i++)
+ {
+ if (isInput)
+ {
+ // Input state
+ if ((value & bitUpCnt) != 0) m_lblInput[i].Image = Properties.Resources.On;
+ else m_lblInput[i].Image = Properties.Resources.Off;
+ }
+ else
+ {
+ // Output state
+ if ((value & bitUpCnt) != 0)
+ {
+ m_btnOutput[i].Text = "OFF";
+ m_lblOutput[i].Image = Properties.Resources.On;
+ }
+ else
+ {
+ m_btnOutput[i].Text = "ON";
+ m_lblOutput[i].Image = Properties.Resources.Off;
+ }
+ }
+
+ // 0x01 => 0x02 => 0x04 => 0x08 ... increase bit number
+ bitUpCnt = (0x01) << (i + 1);
+ }
+ }
+
+ #endregion
+
+ #region Motor Enable / Disable
+
+ private void btnEnable_Click(object sender, EventArgs e)
+ {
+ // Enable selected axis
+ _ACS.Enable((Axis)cboAxisNo.SelectedIndex);
+
+ // If you want to enable several axes,
+ //
+ // Ex) Eanble three axes (0, 1, 6)
+ //
+ // int[] AxisList = new int[] { 0, 1, 6, -1 }; !!!! Important !! Must insert '-1' at the last
+ // _ACS.EnableM(AxisList);
+ }
+
+ private void btnDisable_Click(object sender, EventArgs e)
+ {
+ // Disable selected axis
+ _ACS.Disable((Axis)cboAxisNo.SelectedIndex);
+ // Disable multi axes : DisableM(int[] axisList)
+ }
+
+ private void btnDisableAll_Click(object sender, EventArgs e)
+ {
+ // Disable all of axes
+ _ACS.DisableAll();
+ }
+
+ #endregion
+
+ private void btnSetZero_Click(object sender, EventArgs e)
+ {
+ // Change current poisition as you want
+ // SetFPosition(Axis number, new position)
+ _ACS.SetFPosition((Axis)cboAxisNo.SelectedIndex, 0);
+ }
+
+ #region Move to absolute position
+
+ private void btnPTP_Click(object sender, EventArgs e)
+ {
+ double lfTargetPos = 0.0f;
+ try
+ {
+ if (txtPTP_Pos.Text.Length > 0)
+ {
+ lfTargetPos = Convert.ToDouble(txtPTP_Pos.Text);
+ _ACS.ToPoint(
+ 0, // '0' - Absolute position
+ (Axis)cboAxisNo.SelectedIndex, // Axis number
+ lfTargetPos // Target position
+ );
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ #endregion
+
+ #region Move to relative position (from current position)
+
+ private void btnPTP_R_Neg_Click(object sender, EventArgs e)
+ {
+ double lfTargetPos = 0.0f;
+ try
+ {
+ if (txtPTP_Pos.Text.Length > 0)
+ {
+ lfTargetPos = Convert.ToDouble(txtPTP_Pos.Text);
+ if (lfTargetPos > 0)
+ lfTargetPos = lfTargetPos * (-1); // Target position (from current position, step move)
+
+ _ACS.ToPoint(
+ MotionFlags.ACSC_AMF_RELATIVE, // Flat
+ (Axis)cboAxisNo.SelectedIndex, // Axis number
+ lfTargetPos // Move distance
+ );
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ private void btnPTP_R_Pos_Click(object sender, EventArgs e)
+ {
+ double lfTargetPos = 0.0f;
+ try
+ {
+ if (txtPTP_Pos.Text.Length > 0)
+ {
+ lfTargetPos = Convert.ToDouble(txtPTP_Pos.Text);
+ if (lfTargetPos < 0) lfTargetPos = lfTargetPos * (-1);
+
+ _ACS.ToPoint(MotionFlags.ACSC_AMF_RELATIVE, (Axis)cboAxisNo.SelectedIndex, lfTargetPos);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ #endregion
+
+ #region Stop motion using deceleration (halt command)
+
+ private void btnHalt_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _ACS.Halt((Axis)cboAxisNo.SelectedIndex); //使用 halt 命令减速
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ private void btnHallAll_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ // There is no halt all command, so you need to user HaltM function
+ //
+ // ex) You want to stop 0, 2, 5 axis
+ // int[] m_arrAxisList = new int[] { 0, 2, 5, -1 };
+ //
+ if (m_arrAxisList != null) _ACS.HaltM(m_arrAxisList);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ #endregion
+
+ #region JOG Command
+
+ // Move negative direction
+ private void btnJogNeg_MouseDown(object sender, MouseEventArgs e)
+ {
+ double lfVelocity = 0.0f;
+
+ try
+ {
+ if (chkUseVel.Checked)
+ {
+ lfVelocity = Convert.ToDouble(txtJogVel.Text.Trim());
+ if (lfVelocity > 0) lfVelocity = lfVelocity * (-1); // Negative direction : Using - (minus) velocity
+
+ _ACS.Jog(
+ MotionFlags.ACSC_AMF_VELOCITY, // Velocity flag 速度标志
+ (Axis)cboAxisNo.SelectedIndex, // Axis number
+ lfVelocity // Velocity
+ );
+ }
+ else
+ {
+ _ACS.Jog(0, (Axis)cboAxisNo.SelectedIndex, (double)GlobalDirection.ACSC_NEGATIVE_DIRECTION);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ // 정방향 이동 동작
+ private void btnJogPos_MouseDown(object sender, MouseEventArgs e)
+ {
+ double lfVelocity = 0.0f;
+
+ try
+ {
+ if (chkUseVel.Checked)
+ {
+ lfVelocity = Convert.ToDouble(txtJogVel.Text.Trim());
+ if (lfVelocity < 0) lfVelocity = lfVelocity * (-1);
+
+ _ACS.Jog(MotionFlags.ACSC_AMF_VELOCITY, (Axis)cboAxisNo.SelectedIndex, lfVelocity);
+ }
+ else
+ {
+ _ACS.Jog(0, (Axis)cboAxisNo.SelectedIndex, (double)GlobalDirection.ACSC_POSITIVE_DIRECTION);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ // Stop JOG motion
+ private void btnJog_MouseUp(object sender, MouseEventArgs e)
+ {
+ _ACS.Halt((Axis)cboAxisNo.SelectedIndex);
+ }
+
+ #endregion
+
+ #region Run/Stop Buffer Program
+
+ private void btnRunBuffer_Click(object sender, EventArgs e)
+ {
+ string temp;
+
+ try
+ {
+ if (txtLabelName.Text.Length > 0)
+ {
+ temp = txtLabelName.Text.ToUpper();
+ // Allow _ (Under bar) or A ~ Z characters
+ if (temp[0] != 0x5F && (temp[0] < 0x41 || temp[0] > 0x5A))
+ {
+ MessageBox.Show("Wrong 'Label' name inputed.", "ERROR", MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ return;
+ }
+
+ // Run buffer program from label position
+ _ACS.RunBuffer((ProgramBuffer)cboBufferNo.SelectedIndex, txtLabelName.Text.Trim());
+ }
+ else
+ {
+ // Run buffer program from first line
+ _ACS.RunBuffer((ProgramBuffer)cboBufferNo.SelectedIndex, null);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ System.Diagnostics.Debug.WriteLine(ex.Message);
+ }
+ }
+
+ private void btnStopBuffer_Click(object sender, EventArgs e)
+ {
+ // Stop program
+ _ACS.StopBuffer((ProgramBuffer)cboBufferNo.SelectedIndex);
+ }
+
+ #endregion
+
+ #region Change motion profile
+
+ private void TextBoxes_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ try
+ {
+ double lfTemp = 0.0f;
+ TextBox textBox = sender as TextBox;
+ if (textBox != null)
+ {
+ // Allow numbers (0 ~ 9), . (DOT), Backspace
+ if ((e.KeyChar >= 0x30 && e.KeyChar <= 0x39) || e.KeyChar == 0x2E || e.KeyChar == 0x08 ||
+ e.KeyChar == (char)Keys.Return || e.KeyChar == (char)Keys.Enter)
+ {
+ if ((e.KeyChar == 0x2E) && (textBox.Text.Contains(Convert.ToString(0x2E))))
+ e.KeyChar = (char)0x00;
+ if (e.KeyChar == (char)Keys.Return || e.KeyChar == (char)Keys.Enter)
+ {
+ e.Handled = true;
+
+ lfTemp = Convert.ToDouble(textBox.Text.Trim());
+ switch (textBox.TabIndex)
+ {
+ // Immediately change value (On the fly) : SetVelocityImm()
+ // Affect next motion : SetVelocity()
+
+ case 0:
+ _ACS.SetVelocityImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 1:
+ _ACS.SetAccelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 2:
+ _ACS.SetDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 3:
+ _ACS.SetKillDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 4:
+ _ACS.SetJerkImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ }
+
+ textBox.SelectAll();
+ }
+ }
+ else e.KeyChar = (char)0x00;
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine("TextBoxes_KeyPress() Error\n" + ex.ToString());
+ }
+ }
+
+ private void TextBoxes_Enter(object sender, EventArgs e)
+ {
+ try
+ {
+ TextBox textBox = sender as TextBox;
+ if (textBox != null) textBox.SelectAll();
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine("TextBoxes_Enter() Error\n" + ex.ToString());
+ }
+ }
+
+ private void TextBoxes_Leave(object sender, EventArgs e)
+ {
+ try
+ {
+ double lfTemp = 0.0f;
+
+ TextBox textBox = sender as TextBox;
+ if (textBox == null) return;
+
+ lfTemp = Convert.ToDouble(textBox.Text.Trim());
+ switch (textBox.TabIndex)
+ {
+ case 0:
+ _ACS.SetVelocityImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 1:
+ _ACS.SetAccelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 2:
+ _ACS.SetDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 3:
+ _ACS.SetKillDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ case 4:
+ _ACS.SetJerkImm((Axis)cboAxisNo.SelectedIndex, lfTemp);
+ break;
+ }
+
+ textBox.SelectAll();
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine("TextBoxes_Leave() Error\n" + ex.ToString());
+ }
+ }
+
+ #endregion
+
+ #region On and Off General Output
+
+ private void btnSW_Click(object sender, EventArgs e)
+ {
+ int nBitNo = 0x01;
+
+ try
+ {
+ Button btn = sender as Button;
+ if (btn == null) return;
+
+ nBitNo = btn.TabIndex;
+ nBitNo = (0x01) << nBitNo; //左移几位
+
+ if ((m_nOutputState & nBitNo) != 0)
+ {
+ // Set only 1 bit
+ _ACS.SetOutput(
+ 0, // Port number
+ btn.TabIndex, // Bit number
+ 0 // 0 = OFF, 1 = ON
+ );
+
+ // If your I/O device is EtherCAT type, you cannot use this function
+ // You can use WriteVariable function and Command function
+ //
+ // Ex) If EtherCAT mapped variable is 'EC_DOUT'
+ // Want to ON bit '3'
+ // _ACS.Command("EC_DOUT.3=1");
+ }
+ else
+ {
+ _ACS.SetOutput(0, btn.TabIndex, 1);
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine("btnSW_Click() Error\n" + ex.ToString());
+ }
+ }
+
+ #endregion
+
+ #region Event
+
+ private void btnEventMotionEnd_Click(object sender, EventArgs e)
+ {
+ //_ACS.PHYSICALMOTIONEND +=_ACS_PHYSICALMOTIONEND;
+ _ACS.EnableEvent(Interrupts.ACSC_INTR_PHYSICAL_MOTION_END);
+ lstLog.Items.Add("PHYSICAL_MOTION_END event enabled");
+ }
+
+ void _ACS_PHYSICALMOTIONEND(AxisMasks axis)
+ {
+ int bit = 0x01;
+ int axisNo = 0;
+ // Param value is bit number
+ // Bit Number = Axis Number
+ for (int i = 0; i < 64; i++)
+ {
+ if ((int)axis == bit)
+ {
+ axisNo = i;
+ break;
+ }
+
+ bit = bit << 1;
+ }
+
+ // Add log to ListBox
+ this.Invoke((MethodInvoker)delegate
+ {
+ lstLog.Items.Add(String.Format(" - Axis {0}, Stoppped", axisNo));
+ lstLog.SelectedIndex = lstLog.Items.Count - 1;
+ });
+ }
+
+ private void btnEventProgramEnd_Click(object sender, EventArgs e)
+ {
+ //_ACS.PROGRAMEND += _ACS_PROGRAMEND;
+ _ACS.EnableEvent(Interrupts.ACSC_INTR_PROGRAM_END);
+ lstLog.Items.Add("PROGRAM_END event enabled");
+ }
+
+ void _ACS_PROGRAMEND(BufferMasks buffer)
+ {
+ int bit = 0x01;
+ int bufferNo = 0;
+ // Param value is bit number
+ // Bit Number = Axis Number
+ for (int i = 0; i < 32; i++)
+ {
+ if ((int)buffer == bit)
+ {
+ bufferNo = i;
+ break;
+ }
+
+ bit = bit << 1;
+ }
+
+ // Add log to ListBox
+ this.Invoke((MethodInvoker)delegate
+ {
+ lstLog.Items.Add(String.Format(" - Buffer {0}, Stoppped", bufferNo));
+ lstLog.SelectedIndex = lstLog.Items.Count - 1;
+ });
+ }
+
+ #endregion
+
+ #region Communication Termial - Using Transaction function
+
+ private void txtCommand_KeyPress(object sender, KeyPressEventArgs e)
+ {
+ if (e.KeyChar == (char)Keys.Enter)
+ btnSend.PerformClick();
+ }
+
+ private void btnSend_Click(object sender, EventArgs e)
+ {
+ string temp = string.Empty;
+ if (m_bConnected)
+ {
+ try
+ {
+ AppendTextToTextBox("> " + txtCommand.Text.Trim());
+ temp = _ACS.Transaction(txtCommand.Text.Trim());
+ }
+ catch (ACS.SPiiPlusNET.ACSException ex)
+ {
+ temp = String.Format("?{0}", ex.ErrorCode);
+ }
+ finally
+ {
+ if (temp.Length > 0)
+ {
+ AppendTextToTextBox(temp);
+ AppendTextToTextBox(":");
+ }
+ }
+
+ txtCommand.Focus();
+ txtCommand.SelectAll();
+ }
+ }
+
+ private void AppendTextToTextBox(string text)
+ {
+ rtxtTerminal.AppendText(text);
+ rtxtTerminal.AppendText(Environment.NewLine);
+ rtxtTerminal.ScrollToCaret();
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/HexcalMC/Motion/Motion.resx b/HexcalMC/Motion/Motion.resx
new file mode 100644
index 0000000..8a60b22
--- /dev/null
+++ b/HexcalMC/Motion/Motion.resx
@@ -0,0 +1,1561 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+
+ Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4
+ uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N
+ zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc
+ 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo
+ KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C
+ FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX
+ FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl
+ Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo
+ KCgoHw8HBwcfKCgoKCg=
+
+
+
+ 25
+
+
+
+ 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
+ AP2YeQD+mXsA/Zl7AP2afAD+mXsA/Zl7AP2afAD/5r9C/+a/Qv/kvUD95r9C/+a/Qv/vxkb9q4gE/4lr
+ AP+RcgD9hmQA/+nbt///9er/elYA/cCsXP//+vH9/////9/NnP+ScwD9lXUA/5t9AP+ZewD9m30A/5t9
+ AP+ZewD95r9C/+a/Qv/kvUD95r9C/+nBQf/JqT/9zbh2/9G6cP/KsmH9z7x5///////9+/X/w6ZK/cCl
+ SP///v39/Pjw///+/P/////9sZo7/5Z3AP+ZewD9m30A/5t9AP+ZewD95L1A/eS9QP3lvkH+5L1A/eS7
+ Nv3025v+knUA/ebSn/3/8NH+/////f7///3////9+eS8/vnmwP33687+/////f7///3////+xbJq/ZJy
+ AP2afAD+mXsA/Zl7AP2XeQD+5r9C/+a/Qv/kvUD95r9C/+S7Nv/33Z390Lt4/3tYAP/ItWz9////////
+ ////////8tyt/fXiuf/z3Kz9/fz3///////////9wq9k/5R0AP+ZewD9m30A/5Z4AP+mhgn95r9C/+a/
+ Qv/kvUD95r9C/+S7Nv/v1Y79//Te/5R1AP//+O79+u3V//z06f//////+OO6/fXiuf/z37X99eK8////
+ ///////9wq9k/5R0AP+ZewD9lngA/51+Af/xyUz95r9C/+a/Qv/kvUD95r9C/+S7Nv/v1Y799eK6///5
+ 7v/779z9+u/b//vv2//269P/xKlT/f/02v/45cD99N6v//z06P/////9wq9k/5R0AP+UdwD9nX4B//DI
+ S//mv0L95L1A/eS9QP3lvkH+5L1A/eO6NP3v1Iz+9eTC/f////368uL++OzX/frv3f388eL9gF4A/pl7
+ AP3l0p7+//DU/fXgtf3////+wq9k/Y1uAP2dfgH+8chL/ea/Qv3lvkH+5r9C/+a/Qv/kvUD95r9C/+S7
+ Nv/tz4H9/v7//////////v/9+evU//zx3v/88uP/i2oA/Zl6AP+MbAD9rI8l/+3asv/////9vq5o/5Z1
+ AP/wyEv96MBD/+a/Qv/kvUD95L1A/eS9QP3lvkH+5L1A/eK4MP3047P+/////f39/v3+///+/PXr/fnu
+ 2f388uP9i2oA/pl7AP2YegD+iGwA/dKqHf311oP+yrhz/enAPP3mv0L+5L1A/eS9QP3lvkH+5r9C/+a/
+ Qv/kvUD95r9C/+W+P//lvT399uvI///////+///9/v////ru2v/88uP/i2oA/Zp8AP+OcQD937k8/+zE
+ R//jujf96b87/+fAQ//kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvD3947Yn/+fD
+ Tv/8+vH9///////9+v/8797/imkA/Y5xAP/huz797MRH/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/
+ Qv/kvUD95L1A/+S9QP/lvkH+5L1A/eS9QP3lvkH+5L1A/eO7Of3hsyD+7dF5/f////3++fX9gF8A/uG7
+ Pv3qwkX+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+9MpGVua/Qv/kvUD/5r9C/+a/
+ Qv/kvUD95r9C/+a/Qv/kvUD95Lo1/+O3KP/v3af/1K0n/evER//kvUD95r9C/+a/Qv/kvUD95r9C/+a/
+ Qv/kvUD95r9C/+a/Qv/kvUD9AAAAAAAAAADtxEOi5r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a+
+ QP/luzb/58BD/ea/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD9AAAAAAAA
+ AAAAAAAA/9hKHejAQdTlvkH/5L1A/+S9QP3lvkH+5L1A/eS9QP3kvUD95b5B/uS9QP3lvkH+5L1A/eS9
+ QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+AAAAAAAAAAAAAAAAAAAAAAAAAAD6z0dM58BC+Oa/
+ Qv/kvUD+5r9C/+a/Qv/mv0L/5L1A/ea/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/
+ Qv/kvUD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPKRn7kvUD/5r9C/+a/Qv/mv0L/5L1A/ea/
+ Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAADwx0QD5L1AoOS9QPzkvUD+5b5B/uS9QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9
+ QP3lvkH+5L1A/eS9QP/lvkHpAAA/AAAADwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADgAAAA+AAAAP4AAAD/AAAAKAAAACAA
+ AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAOa/Qtjmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7GSf/XsjX/lHUA/5p9AP+bfQD/m30A/5t9
+ AP+bfQDBm30AKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/uxkn/064x/4xuAP+afQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30AtaaGAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/7sZJ/9OuMf+MbgD/mn0A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5x+AIIAAAAAAAAAAAAAAAAAAAAAAAAAAOa/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7GSf/TrjH/jG4A/5p9
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9APqegABOAAAAAAAA
+ AAAAAAAA5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/uxkn/064x/4xu
+ AP+afQD/lXYA/5NzAP+YegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP+bfQDWooMAHwAAAADmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/7sZJ/9Ou
+ Mf+MbgD/mn0A/5R1AP+5o03/39Gk/5t9AP+QbwD/mnwA/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30AeOa/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7G
+ Sf/TrjH/jG4A/5p9AP+ZewD/kXIA///58f+dgAX//////9G9gf+MawD/lHQA/5t8AP+bfQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/uxkn/064x/4xuAP+afQD/m30A/45tAP/dzJn///bq/39bAP/j06j////7///79f+6o0z/iGcA/5d4
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/7sZI/9KtL/+LbQD/mnwA/5p8AP+XeAD/nYAI///////47tr/i2kA/5N0AP////7//PHf///+
+ 9//269b/pIcX/4xrAP+ZegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+nCRP/Oqi3/h2sA/5FyAP+RcgD/kXIA/4VjAP/u4sT///Tl//fq0/+CYAD/hmQA/8Gr
+ XP//9+r/+e3X//zx3v////3/4dCi/5l7AP+ZegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/6b87/8y0bP/p16n////y///02v//8NH///no///////////////////u
+ zP//8tb/+ua+////////////////////////////3NKn/5FwAP+bfQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/kujL//+3J/4ZnAP+pjCD/9eO///nluv/+////////////
+ ///+/v7/892u//Xiuf/04LT/9+nM///////////////////////VyJT/kXAA/5t9AP+bfQD/m30A/5t9
+ AP+bfQD/mXsA/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6Mv/55Lj/38uU/4hoAP+DYgD/3c6f////
+ //////////////7+/v/z3a7/9eK5//Xiuf/z3Kv//fz5/////////////////9XIlP+RcAD/m30A/5t9
+ AP+bfQD/m30A/5h6AP+dfwL/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5Loy//Perv//89v/o4YT/45v
+ AP///Pf/+e3Y//348//+/////v////Pdrv/14rn/9eK5//Thtv/1473/////////////////1ciU/5Fw
+ AP+bfQD/m30A/5t9AP+YegD/lHcA/+7GSf/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/kujL/896u//jm
+ wv/o0pz/1sOK///26P/67tr/+e3W//rw3f///v3//unE//fkvP/14rn/9eK5//Per//79ur/////////
+ ///VyJT/kXAA/5t9AP+bfQD/mHoA/5R3AP/txUj/6cFE/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6
+ Mv/z3q7/9eK6//jpyf///v3/+e3Y//rv2//679v//PHe//HkyP+hhA//+ejG//7szP/14rr/9OG3//Tf
+ sv///////////9XIlP+RcAD/m30A/5h6AP+UdwD/7cVI/+nBRP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5Loy//Perv/z3a///v38///////57NX/+u7a//rv2//88d//+O7a/4hmAP+LawD/xa1b///x
+ 1v/76cX/9N+y//ju2f//////1ciU/5FwAP+YegD/lHcA/+3FSP/pwUT/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/kujL/89yp//fs0/////////////v48P/57db/+u/b//zx3//47tr/jWwA/5p8
+ AP+ScwD/knMA/9rEh///89n/9N2x///////VyZX/jm4A/5R3AP/txUj/6cFE/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6Mf/x2qP//////////////////v////ju2v/67tr//PHf//ju
+ 2v+NbAD/m30A/5t9AP+ZewD/jm4A/5h7CP/14bP///fr/9PLnv+KagD/7cVI/+nBRP/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/47cr//v27f///////////////////////fv5//ns
+ 1P/88d//+O7a/41sAP+bfQD/m30A/5t9AP+McAD/xqEg/+m9Mf/tzG3/1MWN/+S6NP/pwUT/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvTz/5sJM//v26P//////////////
+ ////////+vDi//zw3f/47tr/jWwA/5t9AP+bfQD/jHAA/8uoK//wyEv/5r9B/+W8Ov/ovjj/58BD/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvTz/4bMg/+vM
+ bP/////////////////+/v//++7X//ju2v+NbAD/m30A/4xwAP/NqCv/8MhL/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5Ls2/+C0If/y25v////////////++O7/+OzX/41sAP+McAD/zagr//DIS//mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r5B/+O5L//juC//9uvI///////47tz/fl8A/82oK//wyEv/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQlvmv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+W+Pv/itif/6cdV//Hr3P+/mA7/8MhL/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAPTL
+ RgXmv0K05r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvDv/5bow/+vD
+ Rv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv8AAAAAAAAAAAAAAADtxUQs5r9C4ua/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/wAAAAAAAAAAAAAAAAAAAAAAAAAA6cFDXea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa/QpDmv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHI
+ RRDmv0LD5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAADrw0M65r9C7ea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5r9CZea/QuHmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/QtgAAAD/AAAAPwAA
+ AB8AAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAOAAAAD4AAAA/gAAAP8AAAD/wAAA//AAACgA
+ AAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAADmv0Ko5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+fAQ//zyk3/ro8S/5d6AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9APqbfQC6m30AOwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9
+ AP+ZewD/mXsA/5t9AMWZewAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3nwEP/88lM/aeHCv2UdgD/mXsA/Zl7AP2bfQD/mXsA/Zl7
+ AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD/mXsAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQ//zyUz/pocK/5R2AP+bfQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQBhAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7
+ AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD/mXsA4pt9ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3nwEP/88lM/aeH
+ Cv2UdgD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/5t9AP+ZewC2mXsACQAAAAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fA
+ Q//zyUz/pocK/5R2AP+bfQD/m30A/5l6AP+YeQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AIUAAAAAAAAAAAAA
+ AADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9
+ QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/l3gA/aSIGP2uljH/jGsA/Zh5AP2bfQD/mXsA/Zl7
+ AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/pt9
+ AP+ZewD4mXsAUgAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/
+ Qv/kvUD95L1A/eS9QP3nwEP/88lM/aeHCv2UdgD/mXsA/Zl7AP2bfAD/jG0A/ePUq/3dzJz/5NWs/ZFx
+ AP2ScgD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD9mXsA/Zt9AP+ZewD/mXsA/5l7AIDmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQ//zyUz/pocK/5R2AP+bfQD/m30A/5t9AP+TcwD/wKpZ//vw
+ 4P+CYAD////////////Fr2T/i2oA/5V2AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/mXsA/Zh6
+ AP2PbgD////5/fLlyv2GZAD/wKlY/f/89f3//PP//PLj/a+WNP2KaQD/lngA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7AP7mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/nwEP/88lM/6eHCv+TdgD/m30A/5t9
+ AP+bfQD/m30A/49vAP/SwIX///31//Djx/+ObQD/imoA//ju3P/98uH//PLg////+//r3r7/mn4D/49u
+ AP+aewD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/efAQ//zyUz9pogK/ZJ1
+ AP2bfQD/mXsA/Zl7AP2bfQD/lngA/Zl7AP3//////PHh/fDjx/2ObgD/lHUA/amQJv3///7/+O3Z/fjt
+ 2f3+9OX//////dbFjf+PbwD9kXEA/Zt8AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD9mXsA/Zl7AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5b5A/fLI
+ Sv+lhgj9kXQA/ph6AP2afAD/mHoA/Zh6AP2afAD/imkA/ejbt/3/9eX/+/Hg/fDjx/2NbQD/mHoA/Ytp
+ AP3m2LL//fPk/fjt2f3679r/+O3Z/f/47P///PT9v6hW/YpqAP+VdQD9mXsA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD9mXsA/Zt9AP+ZewD9mnwA/pp8AP7mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/6sNF/amLEf+OcQD9lHUA/ZR1AP2UdQD/lHUA/ZR1AP2PcAD/rZMu/f/++f357dn//PHg/e3g
+ wf2FYgD/kXEA/Y5uAP2QcQD///ry/fnu2v357dn/+e3Z/fnt2f/679v9//vz/fnu2/+pkCb9lXYA/Zt9
+ AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7AP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/lvj7/7Mhe/72nYP//9N3///zn///y1v//8dX///HV///x1f//7cn/////////
+ ////////////////////7s3///LW///y1v//7Mr/+/Xo////////////////////////////////////
+ ////////jWsA/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP/mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/7MdZ/eDNn/9+XQD9xq5i/f/x1f376MT/8+C3/fLe
+ sf347tf//////f39/f3//////f7//f78+P3z3q//8+C3/fPgt/314bj/8t6w/f////3//////f39/f//
+ ///9/f39/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7
+ AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JR/f/25P+ojiL9i2sA/ZV2
+ AP3cx47///LX/fTgtP3//////f7+/f39/f3//////f7//f78+P3z3q//8+C3/fPgt/314rn/8t6x/fjr
+ 0f3//////f39/f/////9/f39/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9
+ AP+ZewD9mXsA/Zl7AP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//np
+ zf/14r3/i2wA/5l6AP+NbgD/nX4F//nz5/////////////////////////////77+P/z3q//9eK5//Xi
+ uf/14rn/9eK5//Pcq//+/f3////////////////////////////6+PT/jWsA/5t9AP+bfQD/m30A/5t9
+ AP+bfQD/m30A/5t9AP+bfQD/mnwA/5Z4AP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3lvj3/58JQ/ffmyP/+7Mz9v6VR/ZFyAP2YeQD/nH4D/f/78v389On//v///f7+//3//////f7//f78
+ +P3z3q//8+C3/fPgt/314rn/8+C3/fPftP315cL//////f/////9/f39/f39/f/////6+PT9i2kA/Zt9
+ AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+YegD9jnAA/d65PP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/04bn9/+3R/ZByAP2IaAD/7eHC/fzy4v357tj/+ezV/fz4
+ 8P3+/////v///f78+P3z3q//8+C3/fPgt/314rn/8+C3/fPgt/3z3a7/+/fu/f/////9/f39/f39/f//
+ ///6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zp8AP+OcAD927Y5/evDRv3mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//fmyP/14rn//OrH/8+3cP+pjyT///76//rv
+ 2//679v/+u/a//nt1v/47tr//fz7///////24bT/9eK5//Xiuf/14rn/9eK5//Xiuf/04bf/9OG1////
+ ///////////////////6+PT/jWsA/5t9AP+bfQD/m30A/5t9AP+bfQD/mnwA/41wAP/ctjn/7cVI/+a/
+ Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/z4Lf98+C3/fnk
+ vf327dz/+u/c/fjt2f3679v/+O3Z/fjt2f367tr/++7Z/fHnzv3p1KL//u3N/fThuf314rn/8+C3/fPg
+ t/314rn/8t2w/frx3v/+///9/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+YegD9jnAA/du2
+ Of/rw0b95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffm
+ yP/z4Lf98t2w/frx3v3/////+ezU/fjt2f3679v/+O3Z/fjt2f3679v/+/Hg/e7gwv1/XAD/vaRO/f/u
+ 0v386sf/9OG4/fPgt/314rn/8+C3/fPdrf/+///9/f7//f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zp8
+ AP+OcAD927Y5/e3FSP/kvUD95L1A/eS9QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/lvT3/58JQ//fmyP/14bf/9N+1////////////+vLl//ru2P/679v/+u/b//rv2//679v//fPi//Dj
+ x/+ObQD/k3QA/45vAP/TvXn///LX//nnwf/14rn/9eK5//TgtP/36cz////////////6+PT/jWsA/5t9
+ AP+bfQD/mnwA/41wAP/ctjn/7cVI/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/y3a79/Pft/f7///3//////////fnr1P3679v/+O3Z/fjt
+ 2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zh6AP2PcAD/nH4G/ebSov3/8NP/9eK7/fXiuf/z3Kz9/fz5/f//
+ ///6+PT9i2kA/Zt9AP+YegD9jnAA/du2Of/rw0b95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/fblxf/15cD9/////f39/f3//////v///fz3
+ 7f357df/+O3Z/fjt2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zl7AP2bfQD/lngA/YtrAP2uky3/+ObD/f/t
+ zf/z4Lb99eO9/f/////6+fT9i2kA/Zp8AP+OcAD927Y5/e3FSP/kvUD95L1A/ea/Qv/kvUD95L1A/eS9
+ QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//Xhuv/+/fz/////////
+ //////////////7////47tj/+u/a//rv2//679v//fPi//Djx/+ObQD/m30A/5t9AP+bfQD/m30A/5t9
+ AP+WdwD/imsA/8GoVv/458z/9eG3//758P/7+vn/jGoA/41wAP/ctjn/7cVI/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58BL/fnw
+ 3//////9/f39/f39/f3//////f39/f7+//39+vb/9+vV/fjt2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zl7
+ AP2bfQD/mXsA/Zl7AP2bfQD/lHYA/ZR0AP/mvjz98NeY/fjnzf/6/v/9gF4A/du2Of/rw0b95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3lvT3/5sJR/f/////+///9/f39/f39/f3//////f39/f39/f3+////+vHf/fjs2P3679v/+/Hg/fDj
+ x/2ObgD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2WeAD/m30A/e7HSv/mvj/95Low/ejCTP/s4L/9zqcf/e3F
+ SP/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0H/5Lk0/+3Ug/////////////////////////////////////////3+//ns
+ 1P/679v//fPi//Djx/+ObQD/m30A/5t9AP+bfQD/m30A/5V4AP+egAP/8MZJ/+jBRP/mv0L/5r9C/+W9
+ Pf/luzP/6cJF/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS6M//htin98+Ow/f////3//////f39/f39
+ /f3//////v///fr05/367tj/+/Hg/fDjx/2ObgD/mXsA/Zl7AP2bfQD/lHYA/Z6AAv3xyUz/5r9C/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9
+ QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mvkD/47cr/+a+
+ P//5893////////////////////////////57dX//fPi//Djx/+ObQD/m30A/5t9AP+VeAD/noAC//HI
+ S//nwEP/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/
+ Qv/kvUD95L1A/eS8O/3itCL/6sli/f3+//3//////f7//f7///389/D/++/c/fDjx/2ObgD/mXsA/ZR2
+ AP2ggQT/8clM/ea/Qv3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/47o2/eGzIP3w2ZD//////f////3//////PLg/fDj
+ xv2ObgD/lHYA/Z6AAv3xyUz/5r5B/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L25r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qf/juTH/47cu//Xo
+ u////////////+/gwf+IaQD/noAC//HIS//nwEP/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0Ja5L1A/+S9
+ QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5Lw9/eG1KP3lwEb///zz/fDs5P2TcQD/8clM/ea/Qv3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9
+ QP0AAAAA5L1AI+S9QNLmv0L/5L1A/+S9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvTz/47Ym/ePGZ/3nvz7/5r5B/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAADmv0JO5r9C+ea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a+PP/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAOS9QIDmv0L/5L1A/+S9
+ QP7mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AADmv0IK5L1As+S9QP/mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa/Qi3mv0Li5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5L1AXea/Qv/kvUD/5L1A/uS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AADkvUCQ5L1A/+S9QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA5r9CE+a/QsLmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/
+ Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0I65L1A6uS9QP/mv0L/5L1A/eS9
+ QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOS9
+ QGvmv0L/5L1A/+S9QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/
+ Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95b5B/uW+
+ Qf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA5L1Ah+S9QOPmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9
+ 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
+ MZeYvYdTAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/HexcalMC/Program.cs b/HexcalMC/Program.cs
index 238c9ed..b76ae87 100644
--- a/HexcalMC/Program.cs
+++ b/HexcalMC/Program.cs
@@ -2,6 +2,30 @@
using System.Collections.Generic;
using System.Windows.Forms;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+//
+//开发说明
+// V0.1 2023/04/10
+//---------------------------------------
+//1、初版构建
+//2、调用流程: 开启TCP服务端、连接到平台轴启用—》hexcal软件连接,开启校准通讯流程—》移动至到位后反馈—》hexcal逻辑处理—》hexcal校准完成关系—》软件关闭
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
namespace HexcalMC
{
static class Program
diff --git a/HexcalMC/Properties/Settings.Designer.cs b/HexcalMC/Properties/Settings.Designer.cs
index a545888..1e91ef9 100644
--- a/HexcalMC/Properties/Settings.Designer.cs
+++ b/HexcalMC/Properties/Settings.Designer.cs
@@ -1,30 +1,26 @@
//------------------------------------------------------------------------------
//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.18408
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
//
//------------------------------------------------------------------------------
-namespace HexcalMC.Properties
-{
-
-
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
- internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
- {
-
- private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
- public static Settings Default
- {
- get
- {
- return defaultInstance;
- }
- }
- }
+namespace HexcalMC.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
}
diff --git a/HexcalMC/Resources/Hexagon.ico b/HexcalMC/Resources/Hexagon.ico
new file mode 100644
index 0000000..7acfd2f
Binary files /dev/null and b/HexcalMC/Resources/Hexagon.ico differ
diff --git a/HexcalMC/Resources/about.png b/HexcalMC/Resources/about.png
new file mode 100644
index 0000000..4d781c5
Binary files /dev/null and b/HexcalMC/Resources/about.png differ
diff --git a/HexcalMC/Resources/help.png b/HexcalMC/Resources/help.png
new file mode 100644
index 0000000..e5c7f86
Binary files /dev/null and b/HexcalMC/Resources/help.png differ
diff --git a/HexcalMC/Resources/motion.png b/HexcalMC/Resources/motion.png
new file mode 100644
index 0000000..224a51f
Binary files /dev/null and b/HexcalMC/Resources/motion.png differ
diff --git a/HexcalMC/Resources/xx.png b/HexcalMC/Resources/xx.png
new file mode 100644
index 0000000..2347279
Binary files /dev/null and b/HexcalMC/Resources/xx.png differ
diff --git a/HexcalMC/app.config b/HexcalMC/app.config
new file mode 100644
index 0000000..725d418
--- /dev/null
+++ b/HexcalMC/app.config
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/HexcalMC/packages.config b/HexcalMC/packages.config
new file mode 100644
index 0000000..ced538a
--- /dev/null
+++ b/HexcalMC/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file