diff --git a/Forwarder/Forwarder/DBPanel.Designer.cs b/Forwarder/Forwarder/DBPanel.Designer.cs new file mode 100644 index 0000000..5546ff2 --- /dev/null +++ b/Forwarder/Forwarder/DBPanel.Designer.cs @@ -0,0 +1,36 @@ +namespace Forwarder +{ + partial class DBPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Forwarder/Forwarder/DBPanel.cs b/Forwarder/Forwarder/DBPanel.cs new file mode 100644 index 0000000..e25f0e7 --- /dev/null +++ b/Forwarder/Forwarder/DBPanel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Forwarder +{ + public partial class DBPanel : Panel + { + public DBPanel() + { + InitializeComponent(); + DoubleBuffered = true; + } + } +} diff --git a/Forwarder/Forwarder/Extension.cs b/Forwarder/Forwarder/Extension.cs index 1fcec9f..2f3b2bb 100644 --- a/Forwarder/Forwarder/Extension.cs +++ b/Forwarder/Forwarder/Extension.cs @@ -25,8 +25,9 @@ namespace Forwarder { - static class SocketExtensions + static class Utils { + private const int MAX_DIALOG_PREVIEW = 256; public static bool IsConnected(this Socket socket) { try @@ -35,5 +36,75 @@ } catch (SocketException) { return false; } } + + public static string FBytes(int bytes) + { + if (bytes < 1024) + return bytes.ToString()+"b"; + string tail = null; + double b = bytes; + if (b > 1024) + { + tail = "Kb"; + b /= 1024; + } + if (b > 1024) + { + tail = "Mb"; + b /= 1024; + } + if (b > 1024) + { + tail = "Gb"; + b /= 1024; + } + return b.ToString("#0.00") + tail; + } + + public static string FTime(TimeSpan ts) + { + StringBuilder result = new StringBuilder(); + if (ts.Days > 0) + { + result.Append(ts.Days); + result.Append("d "); + } + if (ts.Hours > 0) + { + result.Append(ts.Hours); + result.Append("h "); + } + if (ts.Minutes > 0) + { + result.Append(ts.Minutes); + result.Append("m "); + } + if (ts.Seconds > 0) + { + result.Append(ts.Seconds); + result.Append("s "); + } + if (ts.Milliseconds > 0 || result.Length == 0) + { + result.Append(ts.Milliseconds); + result.Append("ms "); + } + return result.ToString(); + } + + public static string BinToTextSample(byte[] data) + { + if (data == null || data.Length == 0) + return ""; + string result = Encoding.ASCII.GetString(data, 0, Math.Min(MAX_DIALOG_PREVIEW, data.Length)); + StringBuilder sb = new StringBuilder(result.Trim()); + for (int i = 0; i < sb.Length; i++) + if (Char.IsControl(sb[i]) && sb[i] != '\n' && sb[i] != '\r') + sb[i] = '□'; + result = sb.ToString(); + if (data.Length > MAX_DIALOG_PREVIEW) + result += "\r\n..."; + return result; + } } } diff --git a/Forwarder/Forwarder/FAbout.Designer.cs b/Forwarder/Forwarder/FAbout.Designer.cs index 140b363..804023a 100644 --- a/Forwarder/Forwarder/FAbout.Designer.cs +++ b/Forwarder/Forwarder/FAbout.Designer.cs @@ -35,6 +35,7 @@ this.llbAuthor = new System.Windows.Forms.LinkLabel(); this.btOk = new System.Windows.Forms.Button(); this.lbVer = new System.Windows.Forms.Label(); + this.lbIp = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // @@ -65,7 +66,7 @@ | System.Windows.Forms.AnchorStyles.Right))); this.lbText.Location = new System.Drawing.Point(12, 74); this.lbText.Name = "lbText"; - this.lbText.Size = new System.Drawing.Size(270, 207); + this.lbText.Size = new System.Drawing.Size(270, 188); this.lbText.TabIndex = 2; this.lbText.Text = resources.GetString("lbText.Text"); // @@ -88,7 +89,7 @@ | System.Windows.Forms.AnchorStyles.Right))); this.btOk.Location = new System.Drawing.Point(288, 12); this.btOk.Name = "btOk"; - this.btOk.Size = new System.Drawing.Size(33, 269); + this.btOk.Size = new System.Drawing.Size(33, 250); this.btOk.TabIndex = 4; this.btOk.Text = "Ok"; this.btOk.UseVisualStyleBackColor = true; @@ -103,11 +104,23 @@ this.lbVer.TabIndex = 5; this.lbVer.Text = "1.0"; // + // lbIp + // + this.lbIp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lbIp.AutoSize = true; + this.lbIp.ForeColor = System.Drawing.SystemColors.GrayText; + this.lbIp.Location = new System.Drawing.Point(12, 249); + this.lbIp.Name = "lbIp"; + this.lbIp.Size = new System.Drawing.Size(35, 13); + this.lbIp.TabIndex = 6; + this.lbIp.Text = "label1"; + // // FAbout // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(330, 293); + this.ClientSize = new System.Drawing.Size(330, 274); + this.Controls.Add(this.lbIp); this.Controls.Add(this.lbVer); this.Controls.Add(this.btOk); this.Controls.Add(this.llbAuthor); @@ -133,5 +146,6 @@ private System.Windows.Forms.LinkLabel llbAuthor; private System.Windows.Forms.Button btOk; private System.Windows.Forms.Label lbVer; + private System.Windows.Forms.Label lbIp; } } \ No newline at end of file diff --git a/Forwarder/Forwarder/FAbout.cs b/Forwarder/Forwarder/FAbout.cs index 3abae8e..167ae9b 100644 --- a/Forwarder/Forwarder/FAbout.cs +++ b/Forwarder/Forwarder/FAbout.cs @@ -5,6 +5,9 @@ using System.Diagnostics; using System.Drawing; using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -34,6 +37,8 @@ private FAbout() { InitializeComponent(); + lbVer.Text = Program.VERSION; + GetIp(); } public static void Execute() @@ -44,6 +49,28 @@ } } + private void GetIp() + { + string output = ""; + foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) + if (item.NetworkInterfaceType != NetworkInterfaceType.Loopback && item.OperationalStatus == OperationalStatus.Up) + foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) + if (ip.Address.AddressFamily == AddressFamily.InterNetwork) + output += ip.Address.ToString() + "\r\n"; + output = output.Trim(); + if (output.Length == 0) + + lbIp.Visible = false; + else + { + lbIp.Text = output; + Height += lbIp.Height; + lbText.Height -= lbIp.Height; + lbIp.Top = ClientSize.Height - (lbIp.Height + 12); + } + lbIp.Text = output; + } + private void llbAuthor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start("https://xwolf.es/2018/02/171/"); diff --git a/Forwarder/Forwarder/FTransmission.Designer.cs b/Forwarder/Forwarder/FTransmission.Designer.cs new file mode 100644 index 0000000..e87a61e --- /dev/null +++ b/Forwarder/Forwarder/FTransmission.Designer.cs @@ -0,0 +1,118 @@ +namespace Forwarder +{ + partial class FTransmission + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.lbInfo = new System.Windows.Forms.Label(); + this.lbAt = new System.Windows.Forms.Label(); + this.lbCtt = new System.Windows.Forms.Label(); + this.pTimeline = new DBPanel(); + this.tUpdate = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // lbInfo + // + this.lbInfo.AutoSize = true; + this.lbInfo.Location = new System.Drawing.Point(12, 9); + this.lbInfo.Name = "lbInfo"; + this.lbInfo.Size = new System.Drawing.Size(112, 13); + this.lbInfo.TabIndex = 0; + this.lbInfo.Text = "Transmission between"; + // + // lbAt + // + this.lbAt.AutoSize = true; + this.lbAt.ForeColor = System.Drawing.SystemColors.GrayText; + this.lbAt.Location = new System.Drawing.Point(19, 22); + this.lbAt.Name = "lbAt"; + this.lbAt.Size = new System.Drawing.Size(16, 13); + this.lbAt.TabIndex = 1; + this.lbAt.Text = "at"; + // + // lbCtt + // + this.lbCtt.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lbCtt.Location = new System.Drawing.Point(12, 35); + this.lbCtt.Name = "lbCtt"; + this.lbCtt.Size = new System.Drawing.Size(360, 13); + this.lbCtt.TabIndex = 2; + this.lbCtt.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // pTimeline + // + this.pTimeline.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pTimeline.AutoScroll = true; + this.pTimeline.BackColor = System.Drawing.SystemColors.Window; + this.pTimeline.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pTimeline.Location = new System.Drawing.Point(12, 51); + this.pTimeline.Name = "pTimeline"; + this.pTimeline.Size = new System.Drawing.Size(360, 355); + this.pTimeline.TabIndex = 3; + this.pTimeline.Resize += new System.EventHandler(this.pTimeline_Resize); + // + // tUpdate + // + this.tUpdate.Interval = 1000; + this.tUpdate.Tick += new System.EventHandler(this.tUpdate_Tick); + // + // FTransmission + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 418); + this.Controls.Add(this.pTimeline); + this.Controls.Add(this.lbCtt); + this.Controls.Add(this.lbAt); + this.Controls.Add(this.lbInfo); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(300, 200); + this.Name = "FTransmission"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Transmission"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FTransmission_FormClosed); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbInfo; + private System.Windows.Forms.Label lbAt; + private System.Windows.Forms.Label lbCtt; + private DBPanel pTimeline; + private System.Windows.Forms.Timer tUpdate; + } +} \ No newline at end of file diff --git a/Forwarder/Forwarder/FTransmission.cs b/Forwarder/Forwarder/FTransmission.cs new file mode 100644 index 0000000..d71a163 --- /dev/null +++ b/Forwarder/Forwarder/FTransmission.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Forwarder +{ + public partial class FTransmission : Form + { + private static Dictionary fmap = new Dictionary(); + private static Font fontMonospace = new Font("Lucida Console", 7.5f); + private static Font fontSmall = new Font(FontFamily.GenericSansSerif, 6f); + + private Transmission trans; + + private FTransmission(Transmission trans) + { + InitializeComponent(); + this.trans = trans; + LoadTransmission(); + pTimeline.AutoScroll = false; + pTimeline.HorizontalScroll.Enabled = false; + pTimeline.HorizontalScroll.Visible = false; + pTimeline.HorizontalScroll.Maximum = 0; + pTimeline.AutoScroll = true; + } + + public static void Execute(Transmission trans) + { + FTransmission f; + if (!fmap.TryGetValue(trans, out f)) + fmap[trans] = f = new FTransmission(trans); + f.Show(); + f.Focus(); + } + + public static FTransmission Get(Transmission trans) + { + FTransmission f; + if (!fmap.TryGetValue(trans, out f)) + return null; + return f; + } + + public void NotifyUpdate() + { + tUpdate.Enabled = true; + } + + private void LoadTransmission() + { + lbInfo.Text = "Transmission between " + trans.SourceIP + " and " + trans.DestinationIP; + lbAt.Text = trans.Date.ToLongDateString() + " " + trans.Date.ToLongTimeString(); + lbCtt.Text = "Uploaded: " + Utils.FBytes(trans.Uploaded) + " Downloaded: " + Utils.FBytes(trans.Downloaded); + int cscroll = pTimeline.VerticalScroll.Value; + pTimeline.VerticalScroll.Value = 0; + pTimeline.Controls.Clear(); + pTimeline.SuspendLayout(); + int y = 5, w2 = (int)(pTimeline.ClientSize.Width * 0.7); + DateTime tstart = trans.Date; + DateTime tlast = tstart; + foreach (Sentence s in trans.Conversation) + { + if ((s.Time - tlast).TotalSeconds > 30) + { + Label lbx = new Label(); + lbx.Parent = pTimeline; + lbx.Font = fontSmall; + lbx.Text = "On hold by " + Utils.FTime(s.Time - tlast); + lbx.TextAlign = ContentAlignment.MiddleCenter; + lbx.BackColor = Color.LightYellow; + lbx.Top = y; + lbx.Left = 5; + lbx.Width = pTimeline.ClientSize.Width - 10; + y += lbx.Height + 4; + } + Label lbs = new Label(); + lbs.AutoSize = true; + lbs.MinimumSize = lbs.MaximumSize = new Size(w2, 0); + lbs.Padding = new Padding(3); + lbs.Top = y; + lbs.Width = pTimeline.ClientSize.Width / 2; + lbs.Left = s.FromMe ? 5 : pTimeline.ClientSize.Width - 5 - w2; + lbs.BackColor = s.FromMe ? Color.LightGreen : Color.LightBlue; + lbs.TextAlign = s.FromMe ? ContentAlignment.TopLeft : ContentAlignment.TopRight; + lbs.Text = Utils.BinToTextSample(s.Data); + lbs.Font = fontMonospace; + lbs.Parent = pTimeline; + Label lbt = new Label(); + lbt.Parent = pTimeline; + lbt.Font = fontSmall; + lbt.Text = Utils.FTime(s.Time - tstart); + lbt.AutoSize = true; + lbt.Top = lbs.Top - 2; + lbt.Left = s.FromMe ? w2 + 10 : lbs.Left - lbt.Width - 5; + Label lbd = new Label(); + lbd.Parent = pTimeline; + lbd.Font = fontSmall; + lbd.Text = Utils.FTime(s.Time - tlast); + lbd.ForeColor = SystemColors.GrayText; + lbd.AutoSize = true; + lbd.Top = lbt.Top + lbt.Height - 1; + lbd.Left = s.FromMe ? w2 + 10 : lbs.Left - lbd.Width - 5; + Label lbz = new Label(); + lbz.Parent = pTimeline; + lbz.Font = fontSmall; + lbz.Text = Utils.FBytes(s.Data.Length); + lbz.AutoSize = true; + lbz.Top = lbd.Top + lbd.Height - 1; + lbz.Left = s.FromMe ? w2 + 10 : lbs.Left - lbz.Width - 5; + y += lbs.Height + 4; + tlast = s.Time; + } + pTimeline.ResumeLayout(); + pTimeline.VerticalScroll.Value = cscroll; + } + + private void FTransmission_FormClosed(object sender, FormClosedEventArgs e) + { + fmap.Remove(trans); + Dispose(); + } + + private void pTimeline_Resize(object sender, EventArgs e) + { + LoadTransmission(); + } + + private void tUpdate_Tick(object sender, EventArgs e) + { + tUpdate.Enabled = false; + LoadTransmission(); + } + } +} diff --git a/Forwarder/Forwarder/FTransmission.resx b/Forwarder/Forwarder/FTransmission.resx new file mode 100644 index 0000000..fbe92e5 --- /dev/null +++ b/Forwarder/Forwarder/FTransmission.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + \ No newline at end of file diff --git a/Forwarder/Forwarder/Form1.Designer.cs b/Forwarder/Forwarder/Form1.Designer.cs index 77c62e5..a365604 100644 --- a/Forwarder/Forwarder/Form1.Designer.cs +++ b/Forwarder/Forwarder/Form1.Designer.cs @@ -33,12 +33,12 @@ this.panel1 = new System.Windows.Forms.Panel(); this.lbForwarders = new System.Windows.Forms.ListBox(); this.panel2 = new System.Windows.Forms.Panel(); - this.splitter1 = new System.Windows.Forms.Splitter(); - this.pFord = new System.Windows.Forms.Panel(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.btAbout = new System.Windows.Forms.Button(); this.btDel = new System.Windows.Forms.Button(); this.btAdd = new System.Windows.Forms.Button(); + this.splitter1 = new System.Windows.Forms.Splitter(); + this.pFord = new System.Windows.Forms.Panel(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.panel1.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); @@ -51,7 +51,7 @@ this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Margin = new System.Windows.Forms.Padding(5); this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(200, 372); + this.panel1.Size = new System.Drawing.Size(210, 372); this.panel1.TabIndex = 2; // // lbForwarders @@ -63,10 +63,11 @@ this.lbForwarders.ItemHeight = 40; this.lbForwarders.Location = new System.Drawing.Point(0, 0); this.lbForwarders.Name = "lbForwarders"; - this.lbForwarders.Size = new System.Drawing.Size(200, 335); + this.lbForwarders.Size = new System.Drawing.Size(210, 335); this.lbForwarders.TabIndex = 1; this.lbForwarders.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbForwarders_DrawItem); this.lbForwarders.SelectedIndexChanged += new System.EventHandler(this.lbForwarders_SelectedIndexChanged); + this.lbForwarders.DoubleClick += new System.EventHandler(this.lbForwarders_DoubleClick); // // panel2 // @@ -76,26 +77,9 @@ this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom; this.panel2.Location = new System.Drawing.Point(0, 335); this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(200, 37); + this.panel2.Size = new System.Drawing.Size(210, 37); this.panel2.TabIndex = 2; // - // splitter1 - // - this.splitter1.Location = new System.Drawing.Point(200, 0); - this.splitter1.Name = "splitter1"; - this.splitter1.Size = new System.Drawing.Size(3, 372); - this.splitter1.TabIndex = 3; - this.splitter1.TabStop = false; - // - // pFord - // - this.pFord.Dock = System.Windows.Forms.DockStyle.Fill; - this.pFord.Location = new System.Drawing.Point(203, 0); - this.pFord.MinimumSize = new System.Drawing.Size(300, 0); - this.pFord.Name = "pFord"; - this.pFord.Size = new System.Drawing.Size(501, 372); - this.pFord.TabIndex = 4; - // // btAbout // this.btAbout.Image = global::Forwarder.Properties.Resources.help; @@ -111,7 +95,7 @@ // this.btDel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btDel.Image = global::Forwarder.Properties.Resources.world_delete; - this.btDel.Location = new System.Drawing.Point(132, 6); + this.btDel.Location = new System.Drawing.Point(142, 6); this.btDel.Name = "btDel"; this.btDel.Size = new System.Drawing.Size(68, 26); this.btDel.TabIndex = 1; @@ -125,7 +109,7 @@ // this.btAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btAdd.Image = global::Forwarder.Properties.Resources.world_add; - this.btAdd.Location = new System.Drawing.Point(61, 6); + this.btAdd.Location = new System.Drawing.Point(71, 6); this.btAdd.Name = "btAdd"; this.btAdd.Size = new System.Drawing.Size(65, 26); this.btAdd.TabIndex = 0; @@ -135,16 +119,33 @@ this.btAdd.UseVisualStyleBackColor = true; this.btAdd.Click += new System.EventHandler(this.btAdd_Click); // + // splitter1 + // + this.splitter1.Location = new System.Drawing.Point(210, 0); + this.splitter1.Name = "splitter1"; + this.splitter1.Size = new System.Drawing.Size(3, 372); + this.splitter1.TabIndex = 3; + this.splitter1.TabStop = false; + // + // pFord + // + this.pFord.Dock = System.Windows.Forms.DockStyle.Fill; + this.pFord.Location = new System.Drawing.Point(213, 0); + this.pFord.MinimumSize = new System.Drawing.Size(300, 0); + this.pFord.Name = "pFord"; + this.pFord.Size = new System.Drawing.Size(381, 372); + this.pFord.TabIndex = 4; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(704, 372); + this.ClientSize = new System.Drawing.Size(594, 372); this.Controls.Add(this.pFord); this.Controls.Add(this.splitter1); this.Controls.Add(this.panel1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(650, 200); + this.MinimumSize = new System.Drawing.Size(600, 200); this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "TCP Forwarder"; diff --git a/Forwarder/Forwarder/Form1.cs b/Forwarder/Forwarder/Form1.cs index 4db6379..3c4a0dd 100644 --- a/Forwarder/Forwarder/Form1.cs +++ b/Forwarder/Forwarder/Form1.cs @@ -3,8 +3,10 @@ using System.ComponentModel; using System.Data; using System.Drawing; +using System.IO; using System.Linq; using System.Net; +using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -31,10 +33,16 @@ { public partial class Form1 : Form { + private const string CFG_FILENAME = "Forwarder.conf"; + private string cfgPath; + public Form1() { InitializeComponent(); - btAdd_Click(null, null); + Text += " " + Program.VERSION; + cfgPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), CFG_FILENAME); + if (!LoadForwarders()) + AddForwarder(); LookupUI(); } @@ -48,11 +56,54 @@ lbForwarders.Invalidate(); } - private void btAdd_Click(object sender, EventArgs e) + private bool LoadForwarders() + { + if (!File.Exists(cfgPath)) + return false; + try + { + foreach(string line in File.ReadAllLines(cfgPath)) + { + string[] lp = line.Split(':'); + if (lp.Length != 3 || lp[0].Length<1) + continue; + ForwarderControl fc = AddForwarder(); + fc.SourceLocal = lp[0][0] == '-'; + fc.SourcePort = lp[0].Substring(1); + fc.DestinationHost = lp[1]; + fc.DestinationPort = lp[2]; + } + return true; + } + catch + { + return false; + } + } + + private void SaveForwarders() + { + try + { + List fws = new List(); + foreach(ForwarderControl fc in lbForwarders.Items) + fws.Add( (fc.SourceLocal ? "-" : "*") + fc.SourcePort + ":" + fc.DestinationHost + ":" + fc.DestinationPort); + File.WriteAllLines(cfgPath, fws.ToArray()); + } + catch { }; + } + + private ForwarderControl AddForwarder() { ForwarderControl fc = new ForwarderControl(); fc.WhenChanged = ForwarderChagned; lbForwarders.SelectedIndex = lbForwarders.Items.Add(fc); + return fc; + } + + private void btAdd_Click(object sender, EventArgs e) + { + AddForwarder(); } private void lbForwarders_SelectedIndexChanged(object sender, EventArgs e) @@ -90,7 +141,7 @@ if (fc.SourceLocal) e.Graphics.DrawImage(Properties.Resources.computer, e.Bounds.Right - 18, e.Bounds.Top + 2); Brush br = new SolidBrush(e.ForeColor); - e.Graphics.DrawString(fc.SourcePort, lbForwarders.Font, br, 36, e.Bounds.Top + 2); + e.Graphics.DrawString(fc.SourcePort, lbForwarders.Font, br, 38, e.Bounds.Top + 2); e.Graphics.DrawString(fc.DestinationHost, lbForwarders.Font, br, 40, e.Bounds.Top + 20); e.Graphics.DrawString(fc.DestinationPort, lbForwarders.Font, br, e.Bounds.Right - (2 + e.Graphics.MeasureString(fc.DestinationPort, lbForwarders.Font).Width), e.Bounds.Top + 20); } @@ -100,7 +151,8 @@ private void Form1_FormClosed(object sender, FormClosedEventArgs e) { - while (lbForwarders.Items.Count>0) + SaveForwarders(); + while (lbForwarders.Items.Count > 0) { lbForwarders.SelectedIndex = 0; btDel_Click(sender, e); @@ -111,5 +163,16 @@ { FAbout.Execute(); } + + private void lbForwarders_DoubleClick(object sender, EventArgs e) + { + ForwarderControl fc = lbForwarders.SelectedItem as ForwarderControl; + if (fc == null) + return; + if (fc.Active) + fc.StopForwarder(); + else + fc.StartForwarder(); + } } } diff --git a/Forwarder/Forwarder/Forwarder.cs b/Forwarder/Forwarder/Forwarder.cs index 8512e4c..d496396 100644 --- a/Forwarder/Forwarder/Forwarder.cs +++ b/Forwarder/Forwarder/Forwarder.cs @@ -356,9 +356,8 @@ private IPEndPoint dst; private int uploaded; private int downloaded; + private DateTime date = DateTime.Now; private List conversation = new List(); - private Sentence lastSay; - private Sentence lastListen; public Transmission(IPEndPoint src, IPEndPoint dst) { @@ -387,34 +386,24 @@ public object Tag { get; set; } public int Uploaded => uploaded; public int Downloaded => downloaded; + public DateTime Date => date; public Sentence[] Conversation => conversation.ToArray(); } public class Sentence { - private DateTime begin= DateTime.Now; - private DateTime end; + private DateTime time= DateTime.Now; private byte[] data; private bool me; public Sentence(byte[] data,bool me) { this.me = me; - Append(data); + this.data = data; } - internal void Append(byte[] data) - { - if (this.data == null) - this.data = data; - else - { - byte[] ndata = new byte[this.data.Length + data.Length]; - this.data.CopyTo(ndata, 0); - data.CopyTo(ndata, this.data.Length); - this.data = ndata; - } - end = DateTime.Now; - } + public bool FromMe => me; + public byte[] Data => data; + public DateTime Time => time; } } diff --git a/Forwarder/Forwarder/Forwarder.csproj b/Forwarder/Forwarder/Forwarder.csproj index 601e82c..3781de2 100644 --- a/Forwarder/Forwarder/Forwarder.csproj +++ b/Forwarder/Forwarder/Forwarder.csproj @@ -49,6 +49,12 @@ + + Component + + + DBPanel.cs + Form @@ -69,6 +75,12 @@ ForwarderControl.cs + + Form + + + FTransmission.cs + @@ -80,6 +92,9 @@ ForwarderControl.cs + + FTransmission.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/Forwarder/Forwarder/ForwarderControl.Designer.cs b/Forwarder/Forwarder/ForwarderControl.Designer.cs index 667fb9b..b94c698 100644 --- a/Forwarder/Forwarder/ForwarderControl.Designer.cs +++ b/Forwarder/Forwarder/ForwarderControl.Designer.cs @@ -31,6 +31,9 @@ this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ForwarderControl)); this.pConf = new System.Windows.Forms.Panel(); + this.rbFollow = new System.Windows.Forms.RadioButton(); + this.lbInfo = new System.Windows.Forms.Label(); + this.btClear = new System.Windows.Forms.Button(); this.btStart = new System.Windows.Forms.Button(); this.tbDestPort = new System.Windows.Forms.TextBox(); this.lbDestPort = new System.Windows.Forms.Label(); @@ -41,20 +44,15 @@ this.lbSrc = new System.Windows.Forms.Label(); this.lvHistory = new System.Windows.Forms.ListView(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.ilMsg = new System.Windows.Forms.ImageList(this.components); - this.lbInfo = new System.Windows.Forms.Label(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.btClear = new System.Windows.Forms.Button(); - this.rbFollow = new System.Windows.Forms.RadioButton(); - this.cbCapture = new System.Windows.Forms.CheckBox(); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.ilMsg = new System.Windows.Forms.ImageList(this.components); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.pConf.SuspendLayout(); this.SuspendLayout(); // // pConf // - this.pConf.Controls.Add(this.cbCapture); this.pConf.Controls.Add(this.rbFollow); this.pConf.Controls.Add(this.lbInfo); this.pConf.Controls.Add(this.btClear); @@ -72,6 +70,40 @@ this.pConf.Size = new System.Drawing.Size(424, 80); this.pConf.TabIndex = 0; // + // rbFollow + // + this.rbFollow.Appearance = System.Windows.Forms.Appearance.Button; + this.rbFollow.Checked = true; + this.rbFollow.Image = global::Forwarder.Properties.Resources.list_follow; + this.rbFollow.Location = new System.Drawing.Point(28, 52); + this.rbFollow.Name = "rbFollow"; + this.rbFollow.Size = new System.Drawing.Size(25, 25); + this.rbFollow.TabIndex = 21; + this.rbFollow.TabStop = true; + this.toolTip1.SetToolTip(this.rbFollow, "Follow events"); + this.rbFollow.UseVisualStyleBackColor = true; + // + // lbInfo + // + this.lbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lbInfo.Location = new System.Drawing.Point(274, 59); + this.lbInfo.Name = "lbInfo"; + this.lbInfo.Size = new System.Drawing.Size(147, 16); + this.lbInfo.TabIndex = 19; + this.lbInfo.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // btClear + // + this.btClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btClear.Image = global::Forwarder.Properties.Resources.list_clear; + this.btClear.Location = new System.Drawing.Point(1, 52); + this.btClear.Name = "btClear"; + this.btClear.Size = new System.Drawing.Size(25, 25); + this.btClear.TabIndex = 18; + this.toolTip1.SetToolTip(this.btClear, "Clear event list"); + this.btClear.UseVisualStyleBackColor = true; + this.btClear.Click += new System.EventHandler(this.btClear_Click); + // // btStart // this.btStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -85,9 +117,9 @@ // // tbDestPort // - this.tbDestPort.Location = new System.Drawing.Point(306, 28); + this.tbDestPort.Location = new System.Drawing.Point(274, 27); this.tbDestPort.Name = "tbDestPort"; - this.tbDestPort.Size = new System.Drawing.Size(48, 20); + this.tbDestPort.Size = new System.Drawing.Size(41, 20); this.tbDestPort.TabIndex = 16; this.tbDestPort.Text = "8088"; this.tbDestPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; @@ -96,7 +128,7 @@ // lbDestPort // this.lbDestPort.AutoSize = true; - this.lbDestPort.Location = new System.Drawing.Point(271, 31); + this.lbDestPort.Location = new System.Drawing.Point(243, 31); this.lbDestPort.Name = "lbDestPort"; this.lbDestPort.Size = new System.Drawing.Size(29, 13); this.lbDestPort.TabIndex = 15; @@ -106,7 +138,7 @@ // this.tbDestHost.Location = new System.Drawing.Point(76, 29); this.tbDestHost.Name = "tbDestHost"; - this.tbDestHost.Size = new System.Drawing.Size(185, 20); + this.tbDestHost.Size = new System.Drawing.Size(161, 20); this.tbDestHost.TabIndex = 14; this.tbDestHost.TextChanged += new System.EventHandler(this.ConfChanged); // @@ -122,7 +154,7 @@ // cbLocal // this.cbLocal.AutoSize = true; - this.cbLocal.Location = new System.Drawing.Point(130, 5); + this.cbLocal.Location = new System.Drawing.Point(123, 6); this.cbLocal.Name = "cbLocal"; this.cbLocal.Size = new System.Drawing.Size(131, 17); this.cbLocal.TabIndex = 12; @@ -134,7 +166,7 @@ // this.tbSrcPort.Location = new System.Drawing.Point(76, 3); this.tbSrcPort.Name = "tbSrcPort"; - this.tbSrcPort.Size = new System.Drawing.Size(48, 20); + this.tbSrcPort.Size = new System.Drawing.Size(41, 20); this.tbSrcPort.TabIndex = 11; this.tbSrcPort.Text = "8088"; this.tbSrcPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; @@ -167,6 +199,7 @@ this.lvHistory.TabIndex = 1; this.lvHistory.UseCompatibleStateImageBehavior = false; this.lvHistory.View = System.Windows.Forms.View.Details; + this.lvHistory.DoubleClick += new System.EventHandler(this.lvHistory_DoubleClick); this.lvHistory.Resize += new System.EventHandler(this.lvHistory_Resize); // // columnHeader1 @@ -174,63 +207,6 @@ this.columnHeader1.Text = "Events"; this.columnHeader1.Width = 300; // - // ilMsg - // - this.ilMsg.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilMsg.ImageStream"))); - this.ilMsg.TransparentColor = System.Drawing.Color.Transparent; - this.ilMsg.Images.SetKeyName(0, "msg_info.png"); - this.ilMsg.Images.SetKeyName(1, "msg_error.png"); - this.ilMsg.Images.SetKeyName(2, "msg_connect.png"); - this.ilMsg.Images.SetKeyName(3, "msg_go.png"); - this.ilMsg.Images.SetKeyName(4, "msg_come.png"); - this.ilMsg.Images.SetKeyName(5, "msg_finish.png"); - // - // lbInfo - // - this.lbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.lbInfo.Location = new System.Drawing.Point(274, 59); - this.lbInfo.Name = "lbInfo"; - this.lbInfo.Size = new System.Drawing.Size(147, 16); - this.lbInfo.TabIndex = 19; - this.lbInfo.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // btClear - // - this.btClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.btClear.Image = global::Forwarder.Properties.Resources.list_clear; - this.btClear.Location = new System.Drawing.Point(1, 52); - this.btClear.Name = "btClear"; - this.btClear.Size = new System.Drawing.Size(25, 25); - this.btClear.TabIndex = 18; - this.toolTip1.SetToolTip(this.btClear, "Clear event list"); - this.btClear.UseVisualStyleBackColor = true; - this.btClear.Click += new System.EventHandler(this.btClear_Click); - // - // rbFollow - // - this.rbFollow.Appearance = System.Windows.Forms.Appearance.Button; - this.rbFollow.Checked = true; - this.rbFollow.Image = global::Forwarder.Properties.Resources.list_follow; - this.rbFollow.Location = new System.Drawing.Point(28, 52); - this.rbFollow.Name = "rbFollow"; - this.rbFollow.Size = new System.Drawing.Size(25, 25); - this.rbFollow.TabIndex = 21; - this.rbFollow.TabStop = true; - this.toolTip1.SetToolTip(this.rbFollow, "Follow events"); - this.rbFollow.UseVisualStyleBackColor = true; - // - // cbCapture - // - this.cbCapture.AutoSize = true; - this.cbCapture.Enabled = false; - this.cbCapture.Location = new System.Drawing.Point(59, 57); - this.cbCapture.Name = "cbCapture"; - this.cbCapture.Size = new System.Drawing.Size(87, 17); - this.cbCapture.TabIndex = 22; - this.cbCapture.Text = "Capture data"; - this.toolTip1.SetToolTip(this.cbCapture, "Capture traffic data for later analysis"); - this.cbCapture.UseVisualStyleBackColor = true; - // // columnHeader2 // this.columnHeader2.Text = "Send"; @@ -243,6 +219,17 @@ this.columnHeader3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; this.columnHeader3.Width = 70; // + // ilMsg + // + this.ilMsg.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilMsg.ImageStream"))); + this.ilMsg.TransparentColor = System.Drawing.Color.Transparent; + this.ilMsg.Images.SetKeyName(0, "msg_info.png"); + this.ilMsg.Images.SetKeyName(1, "msg_error.png"); + this.ilMsg.Images.SetKeyName(2, "msg_connect.png"); + this.ilMsg.Images.SetKeyName(3, "msg_go.png"); + this.ilMsg.Images.SetKeyName(4, "msg_come.png"); + this.ilMsg.Images.SetKeyName(5, "msg_finish.png"); + // // ForwarderControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -275,7 +262,6 @@ private System.Windows.Forms.Label lbInfo; private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.RadioButton rbFollow; - private System.Windows.Forms.CheckBox cbCapture; private System.Windows.Forms.ColumnHeader columnHeader2; private System.Windows.Forms.ColumnHeader columnHeader3; } diff --git a/Forwarder/Forwarder/ForwarderControl.cs b/Forwarder/Forwarder/ForwarderControl.cs index 7d8d00e..3cd1d2c 100644 --- a/Forwarder/Forwarder/ForwarderControl.cs +++ b/Forwarder/Forwarder/ForwarderControl.cs @@ -84,10 +84,12 @@ case ForwarderMessageType.DEACTIVATED: lvi = lvHistory.Items.Add(msg.Message); lvi.ImageIndex = 0; + lvi.Tag = msg; break; case ForwarderMessageType.ERROR: lvi = lvHistory.Items.Add(msg.Message); lvi.ImageIndex = 1; + lvi.Tag = msg; break; case ForwarderMessageType.TSTART: lvi = lvHistory.Items.Add(msg.Message); @@ -95,6 +97,7 @@ msg.Transmission.Tag = lvi; lvi.SubItems.Add("0"); lvi.SubItems.Add("0"); + lvi.Tag = msg; break; case ForwarderMessageType.TEND: case ForwarderMessageType.TRECV: @@ -105,13 +108,14 @@ lvi = lvHistory.Items.Add("<<< Lost transmission >>>"); lvi.ImageIndex = 1; msg.Transmission.Tag = lvi; + lvi.SubItems.Add(""); + lvi.SubItems.Add(""); + lvi.Tag = msg; } - else - { - lvi.ImageIndex = FMessageIcon(msg.Type); - lvi.SubItems[1].Text = FBytes(msg.Transmission.Uploaded); - lvi.SubItems[2].Text = FBytes(msg.Transmission.Downloaded); - } + lvi.ImageIndex = FMessageIcon(msg.Type); + lvi.SubItems[1].Text = Utils.FBytes(msg.Transmission.Uploaded); + lvi.SubItems[2].Text = Utils.FBytes(msg.Transmission.Downloaded); + FTransmission.Get(msg.Transmission)?.NotifyUpdate(); break; default: lvi = lvHistory.Items.Add("[??] " + msg.Message); @@ -120,6 +124,7 @@ } if (lvi != null) { + lvi.Tag = msg.Transmission; if (rbFollow.Checked) lvi.Selected = true; //lvHistory_Resize(null, null); @@ -127,30 +132,6 @@ lbInfo.Text = "Hints: " + sender.TotalConnections + " Alive: " + sender.CurrentConnections; } - private string FBytes(int bytes) - { - if (bytes < 1024) - return bytes.ToString(); - string tail = null; - double b = bytes; - if (b > 1024) - { - tail = "Kb"; - b /= 1024; - } - if (b > 1024) - { - tail = "Mb"; - b /= 1024; - } - if (b > 1024) - { - tail = "Gb"; - b /= 1024; - } - return b.ToString("#0.00") + tail; - } - private bool RefreshForwarder() { try @@ -182,9 +163,48 @@ return true; } + public void StartForwarder() + { + try + { + pConf.Enabled = false; + if (!RefreshForwarder()) + { + pConf.Enabled = true; + return; + } + pConf.Enabled = true; + + fw.Activate(); + tbDestHost.Enabled = false; + tbDestPort.Enabled = false; + tbSrcPort.Enabled = false; + cbLocal.Enabled = false; + btStart.Text = "Stop"; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + WhenChanged?.Invoke(); + } + public void StopForwarder() { - fw.Deactivate(); + try + { + fw.Deactivate(); + tbDestHost.Enabled = true; + tbDestPort.Enabled = true; + tbSrcPort.Enabled = true; + cbLocal.Enabled = true; + btStart.Text = "Start"; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + WhenChanged?.Invoke(); } public override string ToString() @@ -192,48 +212,18 @@ return fw.ToString(); } - public string SourcePort => tbSrcPort.Text; - public bool SourceLocal => cbLocal.Checked; - public string DestinationPort => tbDestPort.Text; - public string DestinationHost => tbDestHost.Text; + public string SourcePort { get => tbSrcPort.Text; set => tbSrcPort.Text = value; } + public bool SourceLocal { get => cbLocal.Checked; set => cbLocal.Checked = value; } + public string DestinationPort { get => tbDestPort.Text; set => tbDestPort.Text = value; } + public string DestinationHost { get => tbDestHost.Text; set => tbDestHost.Text = value; } public bool Active => fw.Active; private void btStart_Click(object sender, EventArgs e) { - try - { - if (fw.Active) - { - fw.Deactivate(); - tbDestHost.Enabled = true; - tbDestPort.Enabled = true; - tbSrcPort.Enabled = true; - cbLocal.Enabled = true; - btStart.Text = "Start"; - } - else - { - pConf.Enabled = false; - if (!RefreshForwarder()) - { - pConf.Enabled = true; - return; - } - pConf.Enabled = true; - - fw.Activate(); - tbDestHost.Enabled = false; - tbDestPort.Enabled = false; - tbSrcPort.Enabled = false; - cbLocal.Enabled = false; - btStart.Text = "Stop"; - } - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - WhenChanged?.Invoke(); + if (fw.Active) + StopForwarder(); + else + StartForwarder(); } private void ConfChanged(object sender, EventArgs e) @@ -243,19 +233,30 @@ private void lvHistory_Resize(object sender, EventArgs e) { - //lvHistory.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); int acw = 0; for (int i = 1; i < lvHistory.Columns.Count; i++) acw += lvHistory.Columns[i].Width; - //if (lvHistory.Columns[0].Width + acw < lvHistory.ClientRectangle.Width) lvHistory.Columns[0].Width = lvHistory.ClientRectangle.Width - acw; } private void btClear_Click(object sender, EventArgs e) { + // Bread cycling references (Make life easy for c#) + foreach (ListViewItem lvi in lvHistory.Items) + lvi.Tag = null; lvHistory.Items.Clear(); fw.ResetCounter(); } + + private void lvHistory_DoubleClick(object sender, EventArgs e) + { + if (lvHistory.SelectedItems.Count < 0) + return; + Transmission t = lvHistory.SelectedItems[0].Tag as Transmission; + if (t == null) + return; + FTransmission.Execute(t); + } } public delegate void ForwarderChanged(); diff --git a/Forwarder/Forwarder/ForwarderControl.resx b/Forwarder/Forwarder/ForwarderControl.resx index 9f9c906..9cb1725 100644 --- a/Forwarder/Forwarder/ForwarderControl.resx +++ b/Forwarder/Forwarder/ForwarderControl.resx @@ -124,128 +124,125 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADU - GgAAAk1TRnQBSQFMAgEBBgEAARgBAAEYAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADI + GgAAAk1TRnQBSQFMAgEBBgEAASgBAAEoAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABIAMAAQEBAAEgBgABICYAAwQBBQMMARADDAEQAwQBBhwAAyMBMwMjATMDIwEzxAADBAEFAxMBGgMk - ATUDIQExAw0BERwAATcBgQGsAf8BNgGAAasB/wE3AYEBrAH/wAADAwEEAxIBGAMmATkBHAGAAVIB8QEA - AY4BSwH/AxABFhwAATUBfAGrAf8BaAGyAdQB/wE1AYABqwH/vAADAgEDAxABFQMkATUBIwF5AU8B7AEA - AccBhgH/AQABiwFIAf8DHAEnAxABFgMQARYDEAEWAxABFgMQARYDDAEQAwQBBQE1AXwBqgH/AWYBsAHT - Af8BNQF8AasB/7gAAwIBAwMPARQDIgEyAUIBZgFVAc8BAAHAAYAB/wEAAeUBpgH/AQABiAFFAf8DLgFI - AysBQwMrAUMDKwFDAysBQwMrAUIDIQExAwwBEAE1AXwBqgH/AWYBsAHTAf8BNAGBAa8B/xQAAwsBDwMi - ATIDIwEzAyMBMwMjATMDGAEhAwcBCoQAAwMBBAMPARQDIgEyAUgBXwFTAcEBAAG8AYEB/wEAAdsBoAH/ - AQAB3AGhAf8BAAGDAT8B/wEAAYcBQwH/AQABiAFEAf8BAAGIAUQB/wEAAYgBRAH/AQABiAFEAf8BAAGK - AUYB/wEZAX8BTwHyAxABFgE1AXwBqwH/AWUBsgHWAf8BMgGFAbYB/wMXASADCgENDAADPwFtA04B+wNH - Af8DQAH/A0AB/wNTAbkDOAFdAxYBH4AAAwoBDQMgAS4BSAFfAVMBwQEAAboBgAH/AQAB1gGgAf8BAAHT + ATUDIQExAw0BERwAATUBgQGsAf8BNAGAAasB/wE1AYEBrAH/wAADAwEEAxIBGAMmATkBKQF7AVMB8QEA + AY4BSQH/AxABFhwAATMBegGrAf8BZgGyAdQB/wEzAYABqwH/vAADAgEDAxABFQMkATUBMwFyAVMB7AEA + AccBhgH/AQABiwFGAf8DHAEnAxABFgMQARYDEAEWAxABFgMQARYDDAEQAwQBBQEzAXoBqgH/AWQBsAHT + Af8BMwF6AasB/7gAAwIBAwMPARQDIgEyAVIBYQFZAc8BAAHAAYAB/wEAAeUBpgH/AQABiAFDAf8DLgFI + AysBQwMrAUMDKwFDAysBQwMrAUIDIQExAwwBEAEzAXoBqgH/AWQBsAHTAf8BMgGBAa8B/xQAAwsBDwMi + ATIDIwEzAyMBMwMjATMDGAEhAwcBCoQAAwMBBAMPARQDIgEyAVMBWwFWAcEBAAG8AYEB/wEAAdsBoAH/ + AQAB3AGhAf8BAAGDAT0B/wEAAYcBQQH/AQABiAFCAf8BAAGIAUIB/wEAAYgBQgH/AQABiAFCAf8BAAGK + AUQB/wEmAXsBUwHyAxABFgEzAXoBqwH/AWMBsgHWAf8BMAGFAbYB/wMXASADCgENDAADPwFtA04B+wNF + Af8DPgH/Az4B/wNVAbkDOAFdAxYBH4AAAwoBDQMgAS4BUwFbAVYBwQEAAboBgAH/AQAB1gGgAf8BAAHT AZwB/wEAAdMBnAH/AQAB2AGgAf8BAAHZAaIB/wEAAdoBogH/AQAB2gGiAf8BAAHaAaIB/wEAAdoBoQH/ - ATYB6AG+Af8BAAGJAUUB/wMQARYBNQF8AasB/wFjAawBzwH/AUoBRQFDAf8DUwGxAz0BaQMjATMDIwEz - AyMBMwNKAf8DSQH/A0oF/wH8AfsB+QH/AW8BbgFtAf8BQgJDAf8DUwGtgAADDwEUAUgBXwFUAcABAAG4 + ATQB6AG+Af8BAAGJAUMB/wMQARYBMwF6AasB/wFhAawBzwH/AUgBQwFBAf8DVQGxAz0BaQMjATMDIwEz + AyMBMwNIAf8DRwH/A0gF/wH8AfsB+QH/AW0BbAFrAf8BQAJBAf8DUwGtgAADDwEUAVMBWgFXAcABAAG4 AYEB/wEAAdIBnwH/AQABzgGbAf8BAAHNAZoB/wEAAc0BmgH/AQABzwGbAf8BAAHPAZsB/wEAAc8BmwH/ - AQABzwGbAf8BAAHPAZsB/wEAAc8BmgH/AU8B5QHDAf8BAAGHAUIB/wMQARYBNAF8AawB/wFkAbUB3AH/ - AUoBQgE+Af8BQQE/AT4B/wNIAf8DRwH/A0AB/wM9Af8DPwH/A0AB/wM8Bf8B9gH1AfMB/wFmAWUBZAH/ - AXkBeAF3Af8DRwH/gAADDAEQAQABigFFAf8BKQHcAbcB/wEEAc0BoQH/AQAByQGZAf8BAAHJAZoB/wEA - AckBmQH/AQAByQGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByAGZAf8BAAHIAZgB/wEAAcgBlwH/AWoB5gHN - Af8BAAGHAUEB/wMQARYBNAF8AawB/wFjAbUB3AH/AUYBPgE7Af8BdwF0AXIB/wE7AjoB/wFBAUABPwH/ - AfIB8QHwCf8BcwFxAXAB/wE8Aj0B/wGOAYsBigH/AXgBdgF1Af8B2gHZAdgB/wG4ArcB/wNBAf+AAAME - AQUBJwF9AVMB6wEAAbMBgQH/AV8B4AHHAf8BAAHGAZoB/wEAAcUBmQH/AQABxAGYAf8BAAHDAZgB/wEA - AcMBmQH/AQABwwGZAf8BAAHDAZkB/wEAAcMBmAH/AQABwwGXAf8BhwHpAdgB/wEAAYcBQQH/AxABFQE0 - AXwBrAH/AWIBtAHbAf8BQAE5ATUB/wHiAeAB3QH/AawBqwGqAf8BkAGPAY4B/wHqAekB6AX/Af4C/QH/ - AccBxgHFAf8DOgH/AV0BWwFYAf8BTgFMAUsB/wH7AfoB+QX/Az0B/4QAAwQBBQEuAXYBUwHlAQABrwF8 - Af8BXQHcAcYB/wEAAcABlwH/AZQB5gHYAf8BSgHnAdEB/wFOAekB1AH/AU8B6QHVAf8BTwHpAdUB/wFO - AekB1AH/AUsB6QHUAf8BnQHwAeYB/wEAAYkBQwH/AwoBDQE0AXwBrAH/AWIBswHaAf8BPgE3ATMB/wHq - AegB5QH/Ae8B7gHtAf8B/gH/Af0B/wFoAWUBZgH/AXcBdAF1Af8BaAFnAWYB/wH0AfMB8gH/AzQB/wHn - AuYB/wHJAcgBxgH/AdIB0QHQBf8DPQH/iAADBAEFASwBdwFRAeYBAAGrAXwB/wFXAdkBxAH/AYIB4wHW - Af8BAAGCATgB/wEAAYYBPwH/AQABhwFAAf8BAAGHAUAB/wEAAYcBQAH/AQABhwFBAf8BAAGJAUMB/wFK - AV0BVAG0AwMBBAE0AXwBrAH/AWIBswHbAf8BPwE4ATQB/wHHAcUBwwH/AbYBtQG0Af8C6QHoAf8BaQJn - Af8BdwJ1Af8BaAFnAWYB/wHiAeEB4AH/AzEF/wHwAe4B7AH/AVoBWQFYAf8BxQHDAcQB/wM/Af+MAAMD - AQQBSAFiAVUBwAEAAaoBfAH/AXcB4wHYAf8BAAGJAUEB/wMQARYcAAE0AXwBrAH/AWIBtAHbAf8BQQE5 - ATUB/wG8ArsB/wEvAS4BLwH/ATcBNgE0Af8B6wHqAegF/wH7AvoB/wG1ArQB/wM0Af8D8QH/AegB5wHm - Af8C2wHaAf8D3QH/A0EB/5AAAwIBAwFLAVsBUgGuAQABqwGHAf8BAAGMAUcB/wMNAREcAAE0AXwBrAH/ - AWMBtAHbAf8BQgE6ATYB/wHtAewB6wH/ApwBnQH/AYMCggH/AegB5wHmBf8B+QL4Af8D2AH/AzwB/wNI - Af8DZwH/A28B/wPTAf8DRAH/lAADAwEEAUwBXAFUAbMBAAGOAUoB/wMEAQYcAAE1AYABrAH/AWUBtgHc - Af8BRwE+ATgB/wFqAWgBZgH/A5AB/wG1ArQB/wHNAswB/wHMAssB/wLKAcgB/wOoAf8DQwH/BAADIgEx - AzUBVwNUAbwDSQH/wAABUgFbAWABsQE1AYMBsQH/AVABVQFXAaQDPAFmAlcBVgHNA0MB/wNBAf8BPwJA - Af8DQQH/A0gB+ANJAYiwAAMdASoDIwEzAx0BKhgAAwMBBAMKAQ0DEAEVAxABFgMQARYDEAEWAxABFgMQ - ARYDEAEWAxABFgMQARYDEAEWAxABFgMQARUDCgENAwMBBAQAAxoBJAMjATNQAAMEAQYDDAEQAwwBEAME - AQUsAAMfAS0BewFnAVIB3QGnAXQBQgH/AXsBZwFSAd0DHwEtFAADCgENAx4BKwMqAUADKwFDAysBQwMr - AUMDKwFDAysBQwMrAUMDKwFDAysBQwMrAUMDKwFDAyoBQAMeASsDCgENBAABbwJtAcMBbQFvAXAB/wMj - ATMDIwEzAyMBMwMjATMDIwEzPAADDQERAyEBMQMkATUDEwEaAwQBBSQAAx8BLQGHAWoBTgHpAcUBowF7 - Af8B+wH0AecB/wHFAaMBewH/AYcBagFOAekDHwEtEAADDgETAVEBYAFvAcQBNgF8AcgB/wE1AXoBxwH/ - ATYBeQHHAf8BNgF5AccB/wE1AXoBxwH/ATUBegHIAf8BNQF6AcgB/wE1AXoBxwH/ATYBeQHHAf8BNgF5 - AccB/wE1AXoBxwH/ATYBfAHIAf8BUQFgAW8BxAMOARMEAAGfAaABogH/AswBzgH/AWgBcAF6Af8BuwGD - ATwB/wG3AYIBQAH/AbYBgwFBAf8BuAGEAUIB/wMjATM4AAMQARYBAAGOAUsB/wEcAYABUgHxAyYBOQMS - ARgDAwEEHAADHwEtAYUBagFOAegBxAGkAXwB/wH2Ae0B3wH/AcEBngF2Af8B9gHtAd8B/wHEAaQBfAH/ - AYUBagFOAegDHwEtDAADCgENATgBhgHNAf8BUAHiAv8BUgHjAv8BUwHhAv8BUwHiAv8BUgHkAv8BUAHn - Av8BUAHnAv8BUgHkAv8BUwHiAv8BUwHhAv8BUgHjAv8BUAHiAv8BOAGGAc0B/wMKAQ0IAAGcAaQBrgH/ - AbkBewE0Af8B+QHBAXAB/wHyAboBagH/Ae8BtgFiAf8B5QG1AWoB/wG3AYMBQQH/AyMBMxgAAwQBBQMM - BBABFgMQARYDEAEWAxABFgMQARYDHAEnAQABiwFIAf8BAAHHAYYB/wEjAXkBTwHsAyQBNQMQARUDAgED - FAADHwEtAYUBagFOAegBxQGlAYEB/wH4AfEB5gH/AbQBiQFaAf8BowFvATsB/wG0AYkBWgH/AfgB8QHm - Af8BxQGlAYEB/wGFAWoBTgHoAx8BLQgAAwMBBAFSAVsBYgGyAXgBvAHnAf8BTgHaAv8BRwHUAv8BSQHU - Av8BRwHYAv8BigFiAVQB/wGKAWIBVAH/AUcB2AL/AUkB1AL/AUcB1AL/AU4B2gL/AXgBvAHnAf8BUgFb - AWIBsgMDAQQIAAG5AYABNwH/AfQByQGPAf8B9gHAAXUB/wHyAbsBbQH/AesBvwGBAf8BsQF6ATwB/wHv - AbMBWgH/AbgBhAFBAf8YAAMMARADIQExAysBQgMrAUMDKwFDAysBQwMrAUMDLgFIAQABiAFFAf8BAAHl - AaYB/wEAAcABgAH/AUIBZgFVAc8DIgEyAw8BFAMCAQMMAAMfAS0BhQFqAU4B6AHHAaYBhAH/AfoB9AHq - Af8BswGJAVkB/wGiAW0BOQH/AaMBbgE6Af8BogFtATkB/wGzAYkBWQH/AfoB9AHqAf8BxwGmAYQB/wGF - AWoBTgHoAx8BLQgAAwcBCgE8AYIByQH/AaMB5QL/AToBzAL/AT8BzAL/AT8B0QL/AT0B2QL/AT0B2QL/ - AT8B0QL/AT8BzAL/AToBzAL/AaMB5QL/ATwBggHJAf8DBwEKDAABtgGAATsB/wH4AdEBngH/AfgBwgF6 - Af8B8gHLAZQB/wGuAXcBOAH/AfQBugFoAf8BlgGAAWEB3QG4AYIBPQH/AyMBMwMjATMQAAMQARYBGQF/ - AU8B8gEAAYoBRgH/AQABiAFEAf8BAAGIAUQB/wEAAYgBRAH/AQABiAFEAf8BAAGHAUMB/wEAAYMBPwH/ - AQAB3AGhAf8BAAHbAaAB/wEAAbwBgQH/AUgBXwFTAcEDIgEyAw8BFAMDAQQEAAMbASYBhwFqAU4B6QHG - AacBhAH/AfwB9wHvAf8BswGKAVwB/wG4AZEBZQH/AfoB8gHkAf8B+AHvAeAB/wH7AfMB5gH/AbkBkgFm - Af8BswGLAVwB/wH8AfcB7wH/AcYBpwGEAf8BhwFqAU4B6QMdASoEAAMBAQIBQwJEAXgBYwGhAdgB/wGS - AeQC/wEyAccC/wE1Ac8C/wFhAUUBOwH/AWEBRQE7Af8BNQHPAv8BMgHHAv8BkgHkAv8BYwGhAdgB/wFD - AkQBeAMBAQIMAAG1AYABPAL/AdwBrwH/AfsB1wGnAf8BrQF1ATQB/wH5AcIBeAH/AZoBiAFsAd4BtQF8 - ATsB/wG5AcUB2AH/AbgBgQE8Af8BuAGEAUEB/wMjATMMAAMQARYBAAGJAUUB/wE2AegBvgH/AQAB2gGh - Af8BAAHaAaIB/wEAAdoBogH/AQAB2gGiAf8BAAHZAaIB/wEAAdgBoAH/AQAB0wGcAf8BAAHTAZwB/wEA - AdYBoAH/AQABugGAAf8BSAFfAVMBwQMgAS4DCgENBAABbQFhAVUBzAHIAagBhwH/Af0B+QHyAf8BtQGM - AV0B/wGmAXMBQAH/AaUBcgE/Af8BuAGQAWMB/wH9AfgB7wH/AaIBbAE3Af8BpwF0AUIB/wGmAXMBQQH/ - AbUBjAFdAf8B/QH5AfIB/wHIAagBhwH/AXsBZwFSAd0IAAMEAQYBTgFnAX4B0wGjAdEB8AH/AWcB1QL/ - AScByQL/AWYBUwFJAf8BZgFTAUkB/wEnAckC/wFnAdUC/wGjAdEB8AH/AU4BZwF+AdMDBAEGEAABtgGB - AT0C/wHrAcUB/wGtAXQBMgL/AcsBiAH/AZwBjQF2Ad4BtQF8ATwB/wMjATMBtQF8ATkB/wHpAcUBkQH/ - Ae0BrwFTAf8BtwGEAUIB/wMjATMIAAMQARYBAAGHAUIB/wFPAeUBwwH/AQABzwGaAf8BAAHPAZsB/wEA - Ac8BmwH/AQABzwGbAf8BAAHPAZsB/wEAAc8BmwH/AQABzQGaAf8BAAHNAZoB/wEAAc4BmwH/AQAB0gGf - Af8BAAG4AYEB/wFIAV8BVAHAAw8BFAQAAaYBcgFABf8BxAGkAYEB/wGjAW8BOwH/AagBdQFEAf8BpgFy - AT8B/wG5AZEBZAP/Af4B/wGkAW8BOwH/AakBdwFHAf8BqQF3AUYB/wGkAW8BOwH/AcQBpAGBBf8BpgFy - AUAB/wsAAQEDHQEpAUIBiAHMAf8BvQHtAv8BOwHMAv8BaQFYAVAB/wFpAVgBUAH/ATsBzAL/Ab0B7QL/ - AUIBiAHMAf8DHQEpAwABARQAAbUBfAE7Av8B2gGfAf8BnQGRAX4B3QG0AXoBNgH/AyMBMwG1AXwBPAH/ - AZsBiQFwAd4B8QG3AWMB/wGyAXsBPAH/AeEBrAFcAf8BuAGEAUIB/wgAAxABFgEAAYcBQQH/AWoB5gHN - Af8BAAHIAZcB/wEAAcgBmAH/AQAByAGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByQGZAf8BAAHJAZkB/wEA - AckBmgH/AQAByQGZAf8BBAHNAaEB/wEpAdwBtwH/AQABigFFAf8DDAEQBAABXQFYAVMBrAHJAakBiQP/ - AfwB/wG0AY0BXwH/AaUBcQE/Af8BvgGaAXEJ/wGlAXEBPgH/AakBdwFGAf8BpwF0AUEB/wG1AY0BYAP/ - AfwB/wHJAakBiQH/AWgBXwFUAcEMAAMCAQMBTgFRAVUBnAFyAa8B4gH/AbMB8AL/AWoBWAFPAf8BagFY - AU8B/wGzAfAC/wFyAa8B4gH/AU4BUQFVAZwDAgEDHAABtwGCAT4B/wG2AXwBOQH/AbgBxAHVAf8BtQF7 - ATcB/wGcAYkBcgHeAfkBwQF2Af8BrwF3ATgB/wHmAbkBcgH/AeYBtQFtAf8BtwGDAUAB/wgAAxABFQEA - AYcBQQH/AYcB6QHYAf8BAAHDAZcB/wEAAcMBmAH/AQABwwGZAf8BAAHDAZkB/wEAAcMBmQH/AQABwwGY - Af8BAAHEAZgB/wEAAcUBmQH/AQABxgGaAf8BXwHgAccB/wEAAbMBgQH/AScBfQFTAesDBAEFCAABWgFW - AVABpwHJAaoBiwX/AbYBjAFfAf8BowFvAToB/wGiAW0BOAH/AaIBbQE4Af8BpgFzAUAB/wGmAXMBQAH/ - AbcBjQFgBf8ByQGqAYsB/wFaAVYBUAGnFAADBgEIAS0BegHIAf8BoAHWAfkB/wGRAeIC/wGRAeIC/wGg - AdYB+QH/AS0BegHIAf8DBgEIKAABtwGAAToB/wHvAcsBnwL/Ac0BjAH/Aa0BdQE0Af8B7gHGAYsB/wHw - AbcBZwH/AewBwAGBAf8BtwGCAT4B/wgAAwoBDQEAAYkBQwH/AZ0B8AHmAf8BSwHpAdQB/wFOAekB1AH/ - AU8B6QHVAf8BTwHpAdUB/wFOAekB1AH/AUoB5wHRAf8BlAHmAdgB/wEAAcABlwH/AV0B3AHGAf8BAAGv - AXwB/wEuAXYBUwHlAwQBBRAAAVoBVgFQAacBygGrAYwF/wG1AYwBXgH/AboBlAFoA/8B/gH/AaMBbgE6 - Af8BtgGOAWAF/wHKAasBjAH/AVoBVgFQAacbAAEBAzIBUAFHAZAB0wH/AcQB8AL/AcQB8AL/AUcBkAHT - Af8DMgFQAwABASgAAbcBggE+Av8B3AGiAf8BrgF0ATIB/wH6AdQBowH/AfYBwAF2Af8B9AG7AW0B/wH3 - Ac0BkwH/AbwBgwE7Af8IAAMDAQQBSgFdAVQBtAEAAYkBQwH/AQABhwFBAf8BAAGHAUAB/wEAAYcBQAH/ - AQABhwFAAf8BAAGGAT8B/wEAAYIBOAH/AYIB4wHWAf8BVwHZAcQB/wEAAasBfAH/ASwBdwFRAeYDBAEF - GAABWgFWAVABpwHKAawBjgX/AbMBigFcAf8BoAFpATMB/wG0AYsBXQX/AcoBrAGOAf8BWgFWAVABpyAA - AwQBBQFPAWkBgAHVAXcBvAHsAf8BdwG8AewB/wFPAWkBgAHVAwQBBTAAAbUBfAE7Av8B6gHDAv8B4QG4 - Av8B3QGwAv8B2wGrAf8BuQF7ATIB/wFoAXABegH/AyMBMyAAAxABFgEAAYkBQQH/AXcB4wHYAf8BAAGq - AXwB/wFIAWIBVQHAAwMBBCAAAVoBVgFQAacBywGtAY4F/wHGAagBhgX/AcsBrQGPAf8BWgFWAVABpygA - Aw4BEwExAYUBzQH/ATEBhQHNAf8DDgETOAABtgGBAT0B/wG1AXwBOwH/AbUBfAE6Af8BuAF8ATYB/wGc - AaQBrQH/AswBzgH/AW0BbgFwAf8gAAMNAREBAAGMAUcB/wEAAasBhwH/AUsBWwFSAa4DAgEDKAABWgFW - AVABpwHLAa4BkQX/AcsBrgGRAf8BWgFWAVABp4gAAZ8BoAGiAf8BZQJkAbQgAAMEAQYBAAGOAUoB/wFM - AVwBVAGzAwMBBDAAAV0BWAFTAawBpgFyAT4B/wFdAVgBUwGs2AABQgFNAT4HAAE+AwABKAMAAUADAAEg - AwABAQEAAQEGAAEBFgAD/wEAAfgBfwEfAf8EAAHwAX8BHwH/BAAB4AF/AR8B/wQAAcABAAEfAf8EAAGA - AQABHwEBBgABByUAAYAHAAHABwAB4AF/BgAB8AF/BgAB+AF/AQABEAQAAv8BAAEfBAAB/gE/AgABnwH/ - Af4BHwH8AR8CAAGAAf8B/gEPAfgBDwIAAYABfwH+AQcB8AEHAgABwAE/AQABAwHgAQMCAAHAAT8BAAEB - AcABAQGAAQEBwAEPAgABgAEAAYABAQHAAQcCAAGAAQABwAEDAcABAwIAAYABAAHAAQMB4AEDAgABgAEA - AeABBwHwAQMCAAHAAQEB8AEPAfwBAwEAAQEB4AEDAfABDwH8AQMBAAEDAfABBwH4AR8B/gEBAf4BBwH4 - AQ8B/AE/Af8BAQH+AQ8B/AEfA/8B+QH+AR8B/gE/Bv8L + AQABzwGbAf8BAAHPAZsB/wEAAc8BmgH/AU0B5QHDAf8BAAGHAUAB/wMQARYBMgF6AawB/wFiAbUB3AH/ + AUgBQAE8Af8BPwE9ATwB/wNGAf8DRQH/Az4B/wM7Af8DPQH/Az4B/wM6Bf8B9gH1AfMB/wFkAWMBYgH/ + AXcBdgF1Af8DRQH/gAADDAEQAQABigFDAf8BJwHcAbcB/wECAc0BoQH/AQAByQGZAf8BAAHJAZoB/wEA + AckBmQH/AQAByQGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByAGZAf8BAAHIAZgB/wEAAcgBlwH/AWgB5gHN + Af8BAAGHAT8B/wMQARYBMgF6AawB/wFhAbUB3AH/AUQBPAE5Af8BdQFyAXAB/wE5AjgB/wE/AT4BPQH/ + AfIB8QHwCf8BcQFvAW4B/wE6AjsB/wGOAYsBigH/AXYBdAFzAf8B2gHZAdgB/wG4ArcB/wM/Af+AAAME + AQUBNwF3AVYB6wEAAbMBgQH/AV0B4AHHAf8BAAHGAZoB/wEAAcUBmQH/AQABxAGYAf8BAAHDAZgB/wEA + AcMBmQH/AQABwwGZAf8BAAHDAZkB/wEAAcMBmAH/AQABwwGXAf8BhwHpAdgB/wEAAYcBPwH/AxABFQEy + AXoBrAH/AWABtAHbAf8BPgE3ATMB/wHiAeAB3QH/AawBqwGqAf8BkAGPAY4B/wHqAekB6AX/Af4C/QH/ + AccBxgHFAf8DOAH/AVsBWQFWAf8BTAFKAUkB/wH7AfoB+QX/AzsB/4QAAwQBBQE+AW4BVwHlAQABrwF6 + Af8BWwHcAcYB/wEAAcABlwH/AZQB5gHYAf8BSAHnAdEB/wFMAekB1AH/AU0B6QHVAf8BTQHpAdUB/wFM + AekB1AH/AUkB6QHUAf8BnQHwAeYB/wEAAYkBQQH/AwoBDQEyAXoBrAH/AWABswHaAf8BPAE1ATEB/wHq + AegB5QH/Ae8B7gHtAf8B/gH/Af0B/wFmAWMBZAH/AXUBcgFzAf8BZgFlAWQB/wH0AfMB8gH/AzIB/wHn + AuYB/wHJAcgBxgH/AdIB0QHQBf8DOwH/iAADBAEFAT4BbwFWAeYBAAGrAXoB/wFVAdkBxAH/AYIB4wHW + Af8BAAGCATYB/wEAAYYBPQH/AQABhwE+Af8BAAGHAT4B/wEAAYcBPgH/AQABhwE/Af8BAAGJAUEB/wFS + AVgBVQG0AwMBBAEyAXoBrAH/AWABswHbAf8BPQE2ATIB/wHHAcUBwwH/AbYBtQG0Af8C6QHoAf8BZwJl + Af8BdQJzAf8BZgFlAWQB/wHiAeEB4AH/Ay8F/wHwAe4B7AH/AVgBVwFWAf8BxQHDAcQB/wM9Af+MAAMD + AQQBUwFcAVgBwAEAAaoBegH/AXUB4wHYAf8BAAGJAT8B/wMQARYcAAEyAXoBrAH/AWABtAHbAf8BPwE3 + ATMB/wG8ArsB/wEtASwBLQH/ATUBNAEyAf8B6wHqAegF/wH7AvoB/wG1ArQB/wMyAf8D8QH/AegB5wHm + Af8C2wHaAf8D3QH/Az8B/5AAAwIBAwFSAVUBVAGuAQABqwGHAf8BAAGMAUUB/wMNAREcAAEyAXoBrAH/ + AWEBtAHbAf8BQAE4ATQB/wHtAewB6wH/ApwBnQH/AYMCggH/AegB5wHmBf8B+QL4Af8D2AH/AzoB/wNG + Af8DZQH/A20B/wPTAf8DQgH/lAADAwEEAVMBVwFWAbMBAAGOAUgB/wMEAQYcAAEzAYABrAH/AWMBtgHc + Af8BRQE8ATYB/wFoAWYBZAH/A5AB/wG1ArQB/wHNAswB/wHMAssB/wLKAcgB/wOoAf8DQQH/BAADIgEx + AzUBVwNWAbwDRwH/wAABVQFWAVcBsQEzAYMBsQH/AVACUgGkAzwBZgJZAVgBzQNBAf8DPwH/AT0CPgH/ + Az8B/wNIAfgDSQGIsAADHQEqAyMBMwMdASoYAAMDAQQDCgENAxABFQMQARYDEAEWAxABFgMQARYDEAEW + AxABFgMQARYDEAEWAxABFgMQARYDEAEVAwoBDQMDAQQEAAMaASQDIwEzUAADBAEGAwwBEAMMARADBAEF + LAADHwEtAXABYwFXAd0BpwFyAUAB/wFwAWMBVwHdAx8BLRQAAwoBDQMeASsDKgFAAysBQwMrAUMDKwFD + AysBQwMrAUMDKwFDAysBQwMrAUMDKwFDAysBQwMqAUADHgErAwoBDQQAAWMCYAHDAWsBbQFuAf8DIwEz + AyMBMwMjATMDIwEzAyMBMzwAAw0BEQMhATEDJAE1AxMBGgMEAQUkAAMfAS0BewFlAVEB6QHFAaMBeQH/ + AfsB9AHnAf8BxQGjAXkB/wF7AWUBUQHpAx8BLRAAAw4BEwFXAVsBYQHEATQBegHIAf8BMwF4AccB/wE0 + AXcBxwH/ATQBdwHHAf8BMwF4AccB/wEzAXgByAH/ATMBeAHIAf8BMwF4AccB/wE0AXcBxwH/ATQBdwHH + Af8BMwF4AccB/wE0AXoByAH/AVcBWwFhAcQDDgETBAABnwGgAaIB/wLMAc4B/wFmAW4BeAH/AbsBgwE6 + Af8BtwGCAT4B/wG2AYMBPwH/AbgBhAFAAf8DIwEzOAADEAEWAQABjgFJAf8BKQF7AVMB8QMmATkDEgEY + AwMBBBwAAx8BLQF6AWcBVAHoAcQBpAF6Af8B9gHtAd8B/wHBAZ4BdAH/AfYB7QHfAf8BxAGkAXoB/wF6 + AWcBVAHoAx8BLQwAAwoBDQE2AYYBzQH/AU4B4gL/AVAB4wL/AVEB4QL/AVEB4gL/AVAB5AL/AU4B5wL/ + AU4B5wL/AVAB5AL/AVEB4gL/AVEB4QL/AVAB4wL/AU4B4gL/ATYBhgHNAf8DCgENCAABnAGkAa4B/wG5 + AXkBMgH/AfkBwQFuAf8B8gG6AWgB/wHvAbYBYAH/AeUBtQFoAf8BtwGDAT8B/wMjATMYAAMEAQUDDAQQ + ARYDEAEWAxABFgMQARYDEAEWAxwBJwEAAYsBRgH/AQABxwGGAf8BMwFyAVMB7AMkATUDEAEVAwIBAxQA + Ax8BLQF6AWcBVAHoAcUBpQGBAf8B+AHxAeYB/wG0AYkBWAH/AaMBbQE5Af8BtAGJAVgB/wH4AfEB5gH/ + AcUBpQGBAf8BegFnAVQB6AMfAS0IAAMDAQQBVQFWAVkBsgF2AbwB5wH/AUwB2gL/AUUB1AL/AUcB1AL/ + AUUB2AL/AYoBYAFSAf8BigFgAVIB/wFFAdgC/wFHAdQC/wFFAdQC/wFMAdoC/wF2AbwB5wH/AVUBVgFZ + AbIDAwEECAABuQGAATUB/wH0AckBjwH/AfYBwAFzAf8B8gG7AWsB/wHrAb8BgQH/AbEBeAE6Af8B7wGz + AVgB/wG4AYQBPwH/GAADDAEQAyEBMQMrAUIDKwFDAysBQwMrAUMDKwFDAy4BSAEAAYgBQwH/AQAB5QGm + Af8BAAHAAYAB/wFSAWEBWQHPAyIBMgMPARQDAgEDDAADHwEtAXoBZwFUAegBxwGmAYQB/wH6AfQB6gH/ + AbMBiQFXAf8BogFrATcB/wGjAWwBOAH/AaIBawE3Af8BswGJAVcB/wH6AfQB6gH/AccBpgGEAf8BegFn + AVQB6AMfAS0IAAMHAQoBOgGCAckB/wGjAeUC/wE4AcwC/wE9AcwC/wE9AdEC/wE7AdkC/wE7AdkC/wE9 + AdEC/wE9AcwC/wE4AcwC/wGjAeUC/wE6AYIByQH/AwcBCgwAAbYBgAE5Af8B+AHRAZ4B/wH4AcIBeAH/ + AfIBywGUAf8BrgF1ATYB/wH0AboBZgH/AX4BcQFeAd0BuAGCATsB/wMjATMDIwEzEAADEAEWASYBewFT + AfIBAAGKAUQB/wEAAYgBQgH/AQABiAFCAf8BAAGIAUIB/wEAAYgBQgH/AQABhwFBAf8BAAGDAT0B/wEA + AdwBoQH/AQAB2wGgAf8BAAG8AYEB/wFTAVsBVgHBAyIBMgMPARQDAwEEBAADGwEmAXsBZQFRAekBxgGn + AYQB/wH8AfcB7wH/AbMBigFaAf8BuAGRAWMB/wH6AfIB5AH/AfgB7wHgAf8B+wHzAeYB/wG5AZIBZAH/ + AbMBiwFaAf8B/AH3Ae8B/wHGAacBhAH/AXsBZQFRAekDHQEqBAADAQECA0MBeAFhAaEB2AH/AZIB5AL/ + ATABxwL/ATMBzwL/AV8BQwE5Af8BXwFDATkB/wEzAc8C/wEwAccC/wGSAeQC/wFhAaEB2AH/A0MBeAMB + AQIMAAG1AYABOgL/AdwBrwH/AfsB1wGnAf8BrQFzATIB/wH5AcIBdgH/AYABdwFmAd4BtQF6ATkB/wG5 + AcUB2AH/AbgBgQE6Af8BuAGEAT8B/wMjATMMAAMQARYBAAGJAUMB/wE0AegBvgH/AQAB2gGhAf8BAAHa + AaIB/wEAAdoBogH/AQAB2gGiAf8BAAHZAaIB/wEAAdgBoAH/AQAB0wGcAf8BAAHTAZwB/wEAAdYBoAH/ + AQABugGAAf8BUwFbAVYBwQMgAS4DCgENBAABYgFeAVkBzAHIAagBhwH/Af0B+QHyAf8BtQGMAVsB/wGm + AXEBPgH/AaUBcAE9Af8BuAGQAWEB/wH9AfgB7wH/AaIBagE1Af8BpwFyAUAB/wGmAXEBPwH/AbUBjAFb + Af8B/QH5AfIB/wHIAagBhwH/AXABYwFXAd0IAAMEAQYBVgFfAWsB0wGjAdEB8AH/AWUB1QL/ASUByQL/ + AWQBUQFHAf8BZAFRAUcB/wElAckC/wFlAdUC/wGjAdEB8AH/AVYBXwFrAdMDBAEGEAABtgGBATsC/wHr + AcUB/wGtAXIBMAL/AcsBiAH/AYMBeQFsAd4BtQF6AToB/wMjATMBtQF6ATcB/wHpAcUBkQH/Ae0BrwFR + Af8BtwGEAUAB/wMjATMIAAMQARYBAAGHAUAB/wFNAeUBwwH/AQABzwGaAf8BAAHPAZsB/wEAAc8BmwH/ + AQABzwGbAf8BAAHPAZsB/wEAAc8BmwH/AQABzQGaAf8BAAHNAZoB/wEAAc4BmwH/AQAB0gGfAf8BAAG4 + AYEB/wFTAVoBVwHAAw8BFAQAAaYBcAE+Bf8BxAGkAYEB/wGjAW0BOQH/AagBcwFCAf8BpgFwAT0B/wG5 + AZEBYgP/Af4B/wGkAW0BOQH/AakBdQFFAf8BqQF1AUQB/wGkAW0BOQH/AcQBpAGBBf8BpgFwAT4B/wsA + AQEDHQEpAUABiAHMAf8BvQHtAv8BOQHMAv8BZwFWAU4B/wFnAVYBTgH/ATkBzAL/Ab0B7QL/AUABiAHM + Af8DHQEpAwABARQAAbUBegE5Av8B2gGfAf8BgQF7AXAB3QG0AXgBNAH/AyMBMwG1AXoBOgH/AYIBdwFo + Ad4B8QG3AWEB/wGyAXkBOgH/AeEBrAFaAf8BuAGEAUAB/wgAAxABFgEAAYcBPwH/AWgB5gHNAf8BAAHI + AZcB/wEAAcgBmAH/AQAByAGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByQGZAf8BAAHJAZkB/wEAAckBmgH/ + AQAByQGZAf8BAgHNAaEB/wEnAdwBtwH/AQABigFDAf8DDAEQBAABVgFUAVMBrAHJAakBiQP/AfwB/wG0 + AY0BXQH/AaUBbwE9Af8BvgGaAW8J/wGlAW8BPAH/AakBdQFEAf8BpwFyAT8B/wG1AY0BXgP/AfwB/wHJ + AakBiQH/AV0BWwFWAcEMAAMCAQMBTwJRAZwBcAGvAeIB/wGzAfAC/wFoAVYBTQH/AWgBVgFNAf8BswHw + Av8BcAGvAeIB/wFPAlEBnAMCAQMcAAG3AYIBPAH/AbYBegE3Af8BuAHEAdUB/wG1AXkBNQH/AYMBdwFo + Ad4B+QHBAXQB/wGvAXUBNgH/AeYBuQFwAf8B5gG1AWsB/wG3AYMBPgH/CAADEAEVAQABhwE/Af8BhwHp + AdgB/wEAAcMBlwH/AQABwwGYAf8BAAHDAZkB/wEAAcMBmQH/AQABwwGZAf8BAAHDAZgB/wEAAcQBmAH/ + AQABxQGZAf8BAAHGAZoB/wFdAeABxwH/AQABswGBAf8BNwF3AVYB6wMEAQUIAAFUAVIBUQGnAckBqgGL + Bf8BtgGMAV0B/wGjAW0BOAH/AaIBawE2Af8BogFrATYB/wGmAXEBPgH/AaYBcQE+Af8BtwGNAV4F/wHJ + AaoBiwH/AVQBUgFRAacUAAMGAQgBKwF4AcgB/wGgAdYB+QH/AZEB4gL/AZEB4gL/AaAB1gH5Af8BKwF4 + AcgB/wMGAQgoAAG3AYABOAH/Ae8BywGfAv8BzQGMAf8BrQFzATIB/wHuAcYBiwH/AfABtwFlAf8B7AHA + AYEB/wG3AYIBPAH/CAADCgENAQABiQFBAf8BnQHwAeYB/wFJAekB1AH/AUwB6QHUAf8BTQHpAdUB/wFN + AekB1QH/AUwB6QHUAf8BSAHnAdEB/wGUAeYB2AH/AQABwAGXAf8BWwHcAcYB/wEAAa8BegH/AT4BbgFX + AeUDBAEFEAABVAFSAVEBpwHKAasBjAX/AbUBjAFcAf8BugGUAWYD/wH+Af8BowFsATgB/wG2AY4BXgX/ + AcoBqwGMAf8BVAFSAVEBpxsAAQEDMgFQAUUBkAHTAf8BxAHwAv8BxAHwAv8BRQGQAdMB/wMyAVADAAEB + KAABtwGCATwC/wHcAaIB/wGuAXIBMAH/AfoB1AGjAf8B9gHAAXQB/wH0AbsBawH/AfcBzQGTAf8BvAGD + ATkB/wgAAwMBBAFSAVgBVQG0AQABiQFBAf8BAAGHAT8B/wEAAYcBPgH/AQABhwE+Af8BAAGHAT4B/wEA + AYYBPQH/AQABggE2Af8BggHjAdYB/wFVAdkBxAH/AQABqwF6Af8BPgFvAVYB5gMEAQUYAAFUAVIBUQGn + AcoBrAGOBf8BswGKAVoB/wGgAWcBMQH/AbQBiwFbBf8BygGsAY4B/wFUAVIBUQGnIAADBAEFAVYBYwFw + AdUBdQG8AewB/wF1AbwB7AH/AVYBYwFwAdUDBAEFMAABtQF6ATkC/wHqAcMC/wHhAbgC/wHdAbAC/wHb + AasB/wG5AXkBMAH/AWYBbgF4Af8DIwEzIAADEAEWAQABiQE/Af8BdQHjAdgB/wEAAaoBegH/AVMBXAFY + AcADAwEEIAABVAFSAVEBpwHLAa0BjgX/AcYBqAGGBf8BywGtAY8B/wFUAVIBUQGnKAADDgETAS8BhQHN + Af8BLwGFAc0B/wMOARM4AAG2AYEBOwH/AbUBegE5Af8BtQF6ATgB/wG4AXoBNAH/AZwBpAGtAf8CzAHO + Af8BawFsAW4B/yAAAw0BEQEAAYwBRQH/AQABqwGHAf8BUgFVAVQBrgMCAQMoAAFUAVIBUQGnAcsBrgGR + Bf8BywGuAZEB/wFUAVIBUQGniAABnwGgAaIB/wNaAbQgAAMEAQYBAAGOAUgB/wFTAVcBVgGzAwMBBDAA + AVYBVAFTAawBpgFwATwB/wFWAVQBUwGs2AABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEB + FgAD/wEAAfgBfwEfAf8EAAHwAX8BHwH/BAAB4AF/AR8B/wQAAcABAAEfAf8EAAGAAQABHwEBBgABByUA + AYAHAAHABwAB4AF/BgAB8AF/BgAB+AF/AQABEAQAAv8BAAEfBAAB/gE/AgABnwH/Af4BHwH8AR8CAAGA + Af8B/gEPAfgBDwIAAYABfwH+AQcB8AEHAgABwAE/AQABAwHgAQMCAAHAAT8BAAEBAcABAQGAAQEBwAEP + AgABgAEAAYABAQHAAQcCAAGAAQABwAEDAcABAwIAAYABAAHAAQMB4AEDAgABgAEAAeABBwHwAQMCAAHA + AQEB8AEPAfwBAwEAAQEB4AEDAfABDwH8AQMBAAEDAfABBwH4AR8B/gEBAf4BBwH4AQ8B/AE/Af8BAQH+ + AQ8B/AEfA/8B+QH+AR8B/gE/Bv8L 98, 17 - - 98, 17 - \ No newline at end of file diff --git a/Forwarder/Forwarder/Program.cs b/Forwarder/Forwarder/Program.cs index 1ebd7da..dc7ed0b 100644 --- a/Forwarder/Forwarder/Program.cs +++ b/Forwarder/Forwarder/Program.cs @@ -26,6 +26,7 @@ { static class Program { + public const string VERSION = "1.1"; /// /// The main entry point for the application. /// @@ -42,7 +43,7 @@ { Exception ex = e.ExceptionObject as Exception; if (ex != null) - MessageBox.Show(ex.Message,"Critical "+ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Critical " + ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error); } } }