diff --git a/Src/SwqlStudio/CrudOperation.cs b/Src/SwqlStudio/CrudOperation.cs new file mode 100644 index 000000000..b00fa447c --- /dev/null +++ b/Src/SwqlStudio/CrudOperation.cs @@ -0,0 +1,7 @@ +namespace SwqlStudio +{ + public enum CrudOperation + { + Create, Update, Delete + } +} \ No newline at end of file diff --git a/Src/SwqlStudio/CrudTab.Designer.cs b/Src/SwqlStudio/CrudTab.Designer.cs new file mode 100644 index 000000000..7bed77487 --- /dev/null +++ b/Src/SwqlStudio/CrudTab.Designer.cs @@ -0,0 +1,57 @@ +namespace SwqlStudio +{ + partial class CrudTab + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.container = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // container + // + this.container.AutoScroll = true; + this.container.Dock = System.Windows.Forms.DockStyle.Fill; + this.container.Location = new System.Drawing.Point(0, 0); + this.container.Name = "container"; + this.container.Size = new System.Drawing.Size(150, 150); + this.container.TabIndex = 0; + // + // CrudTab + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.container); + this.Name = "CrudTab"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel container; + } +} diff --git a/Src/SwqlStudio/CrudTab.cs b/Src/SwqlStudio/CrudTab.cs new file mode 100644 index 000000000..3099a0333 --- /dev/null +++ b/Src/SwqlStudio/CrudTab.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using SolarWinds.InformationService.Contract2; +using SwqlStudio.Metadata; + +namespace SwqlStudio +{ + public partial class CrudTab : UserControl, IConnectionTab + { + private const int ControlsMargin = 3; + private readonly CrudOperation _operation; + + private readonly Dictionary _textboxes = new Dictionary(); + private TextBox _uri; + private Entity _entity; + + public CrudTab(CrudOperation operation) + { + _operation = operation; + InitializeComponent(); + } + + public Entity Entity + { + get => _entity; + set + { + _entity = value; + CreateSubComponents(); + } + } + + /// + public IApplicationService ApplicationService { get; set; } + + /// + public ConnectionInfo ConnectionInfo { get; set; } + + public event EventHandler CloseItself; + + private void CreateSubComponents() + { + _textboxes.Clear(); + container.Controls.Clear(); + container.SuspendLayout(); + try + { + var y = 0; + + bool createProperties = true; + switch (_operation) + { + case CrudOperation.Create: + break; + case CrudOperation.Delete: + createProperties = false; + goto case CrudOperation.Update; + case CrudOperation.Update: + _uri = CreateLabelAndTextbox("SwisUri", ref y); + y += ControlsMargin * 3; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + // for delete, uri is enough + if (createProperties) + { + foreach (var property in _entity.Properties) + { + var textBox = CreateLabelAndTextbox(property.Name, ref y); + + _textboxes[property] = textBox; + } + } + + var commit = new Button(); + container.Controls.Add(commit); + + commit.Text = _operation.ToString(); + commit.Top = y; + commit.AutoSize = true; + commit.Click += OnCommit; + } + finally + { + container.ResumeLayout(); + } + } + + private void OnCommit(object sender, EventArgs e) + { + var propertyBag = CreatePropertyBag(); + + try + { + var message = ""; + switch (_operation) + { + case CrudOperation.Create: + var rv = ConnectionInfo.Proxy.Create(_entity.FullName, propertyBag); + message = $"Created: {rv}"; + break; + case CrudOperation.Update: + ConnectionInfo.Proxy.Update(_uri.Text, propertyBag); + message = "OK"; + break; + case CrudOperation.Delete: + ConnectionInfo.Proxy.Delete(_uri.Text); + message = "OK"; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + MessageBox.Show(message, "SwqlStudio", MessageBoxButtons.OK, MessageBoxIcon.Information); + OnCloseItself(); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to {_operation}: {ex.Message}", + "SwqlStudio", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + + private PropertyBag CreatePropertyBag() + { + var rv = new PropertyBag(); + foreach (var property in _textboxes) + { + if (!string.IsNullOrEmpty(property.Value.Text)) + { + rv[property.Key.Name] = property.Value.Text; + } + } + + return rv; + } + + + private TextBox CreateLabelAndTextbox(string name, ref int y) + { + var label = new Label(); + container.Controls.Add(label); + + label.Text = name; + label.AutoSize = true; + label.Top = y; + y += label.Height + ControlsMargin; + + var textBox = new TextBox(); + container.Controls.Add(textBox); + textBox.Top = y; + textBox.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; + textBox.Width = container.Width - ControlsMargin * 2; + textBox.Left = ControlsMargin; + y += textBox.Height + ControlsMargin; + return textBox; + } + + protected virtual void OnCloseItself() + { + CloseItself?.Invoke(this, EventArgs.Empty); + } + } +} \ No newline at end of file diff --git a/Src/SwqlStudio/CrudTab.resx b/Src/SwqlStudio/CrudTab.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/Src/SwqlStudio/CrudTab.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/Src/SwqlStudio/IApplicationService.cs b/Src/SwqlStudio/IApplicationService.cs index 54b243c61..6adefb733 100644 --- a/Src/SwqlStudio/IApplicationService.cs +++ b/Src/SwqlStudio/IApplicationService.cs @@ -13,5 +13,7 @@ public interface IApplicationService void OpenActivityMonitor(string title, ConnectionInfo connectionInfo); void OpenInvokeTab(string title, ConnectionInfo connectionInfo, Verb verb); + + void OpenCrudTab(CrudOperation operation, ConnectionInfo connectionInfo, Entity entity); } } diff --git a/Src/SwqlStudio/MainForm.ApplicationService.cs b/Src/SwqlStudio/MainForm.ApplicationService.cs index 74f96e98d..f5de1497f 100644 --- a/Src/SwqlStudio/MainForm.ApplicationService.cs +++ b/Src/SwqlStudio/MainForm.ApplicationService.cs @@ -38,5 +38,28 @@ public void OpenInvokeTab(string title, ConnectionInfo info, Verb verb) fileTabs.Controls.Add(tab); fileTabs.SelectedTab = tab; } + + /// + public void OpenCrudTab(CrudOperation operation, ConnectionInfo info, Entity entity) + { + var tab = new TabPage(entity.FullName + " - " + operation) { BorderStyle = BorderStyle.None, Padding = new Padding(0) }; + var crudTab = new CrudTab(operation) + { + ConnectionInfo = info, + Dock = DockStyle.Fill, + ApplicationService = this, + Entity = entity + }; + + crudTab.CloseItself += (s, e) => + { + fileTabs.TabPages.Remove(tab); + tab.Dispose(); + }; + + tab.Controls.Add(crudTab); + fileTabs.Controls.Add(tab); + fileTabs.SelectedTab = tab; + } } } diff --git a/Src/SwqlStudio/MainForm.Designer.cs b/Src/SwqlStudio/MainForm.Designer.cs index 5e8437430..417ecd6ef 100644 --- a/Src/SwqlStudio/MainForm.Designer.cs +++ b/Src/SwqlStudio/MainForm.Designer.cs @@ -410,6 +410,7 @@ private void InitializeComponent() this.ObjectExplorerImageList.Images.SetKeyName(10, "BaseType"); this.ObjectExplorerImageList.Images.SetKeyName(11, "BaseTypeAbstract"); this.ObjectExplorerImageList.Images.SetKeyName(12, "TableAbstract"); + this.ObjectExplorerImageList.Images.SetKeyName(13, "TableCrud"); // // startTimer // diff --git a/Src/SwqlStudio/MainForm.resx b/Src/SwqlStudio/MainForm.resx index 948d6b925..bd4b07fcc 100644 --- a/Src/SwqlStudio/MainForm.resx +++ b/Src/SwqlStudio/MainForm.resx @@ -139,200 +139,215 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAC - LQAAAk1TRnQBSQFMAgEBDQEAAZwBAQGcAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABQAMAAQEBAAEgBgABQBIAQP/AAAT/A14B/wPAAf8D9AH/A9YB/wNJKf/AAAT/A7QB/wMnAf8DJwH/ - AycB/wOiKf/AAAT/A/IB/wNAAf8D6AH/A0IB/wPoAf8BJAEKAQAB/wEkAQoBAAH/ASQBCgEAAf8BJAEK - AQAB/wEkAQoBAAH/ASQBCgEAAf8BJAEKAQAB/wEkAQoBAAn/wAAE/wP5Af8DjQH/A2cB/wNxAf8D9wH/ - Ad8BzgHDAf8B3QHIAbsB/wHbAb8BrQH/AdsBuwGnAf8B2wG7AacB/wHbAbsBpwH/Ac8BtAGjAf8BJAEK - AQAJ/8AABP8D/QH/A9sB/wMnAf8DyQH/A/sB/wH7AewB4wH/AaQBjQE/Af8BmgGDATMB/wH2AdYBwgH/ - AYgBMgEfAf8BgwEsARkB/wHPAbQBowH/ASQBCgEACf/AAAj/AboBpQGWAf8D/gH/A/4B/wP+Af8B/QH7 - AfkB/wH9AfcB8wH/AfsB7AHjAf8B+gHnAdsB/wH4AeEB0gH/AfcB2wHJAf8B0AG5AasB/wEkAQoBAAn/ - wAAI/wG+AakBmgH/A/4B/wG6AaYBmAH/AbQBoAGRAf8D/gH/AaMBjgE/Af8BmgGDATMB/wH7AewB4wH/ - AYkBMgEgAf8BgwEsARkB/wHRAcEBtgH/ASQBCgEACf/AAAj/AcMBrgGeAf8D/gH/A/4B/wP+Af8D/gH/ - A/4B/wH9AfcB8wH/AfwB8gHsAf8B+wHsAeMB/wH6AecB2wH/AdEBwQG2Af8BJAEKAQAJ/8AACP8ByAGy - AaMB/wP+Af8BugGmAZgB/wG0AaABkQH/A/4B/wGkAY4BPwH/AZkBhAEzAf8B/QH3AfMB/wGIATIBHwH/ - AYMBLAEZAf8B0QHBAbYB/wEkAQoBAAn/wAAI/wHMAbYBpwH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/ - Af0B+wH5Af8B/QH3AfMB/wH8AfIB7AH/AfsB7AHjAf8BJAEKAQAJ/8AACP8B6gGqAYsB/wHqAaoBiwH/ - AeoBqgGLAf8B6QGlAYQB/wHnAZcBLwH/AeYBjgEjAf8B4wE+AQsB/wHjATcBAQH/AeIBMwEAAf8B4gEz - AQAB/wHiATMBAAH/AcgBIwEACf/AAAj/AeoBqgGLAv8BwgGiAf8B/gHAAZ8B/wH9Ab0BmgH/AfsBtQGQ - Af8B+gGwAYsB/wH4AacBPgH/AfYBogE4Af8B9QGdATIB/wH1AZkBKwH/AfMBlQEmAf8BzQEmAQAJ/8AA - CP8B6gGqAYsB/wHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHpAaEBQAH/AegBmwE3Af8B5gGOASMB/wHl - AYcBGQH/AeQBgQEPAf8B5AE8AQcB/wHjATcBAAH/AeIBMwEACf/AAED/wABA//8AaQAB0wHfAesB/wHo - AfQC/wHoAfQC/wHTAd8B6wH/CAAD9AH/A/QB/wP1Bf8D9gH/A/QB/wP0Df8D/gH/A/YB/wP1Af8D/Qn/ - EAAB7wHmAdwB/wHOAbUBkwH/AbgBkwE/Af8BsgGIAS0B/wG4AZIBPgH/Ac4BtAGQAf8B7gHmAdsB/3gA - A98B/wHoAfQC/wGYAaQBsAH/AZgBpAGwAf8B6AH0Av8D3wH/BAAD9gH/A10B/wPAAf8D9AH/A9YB/wNI - Af8D9Qn/A/4B/wP2Af8BbgGuAdsB/wFuAa4B2wH/A/UB/wP9Bf8IAAH9AfsB+gH/AcgBrAGEAf8BoQFO - AQAB/wGdAUgBAAH/AZwBRgEAAf8BpAFUAQAB/wGdAUcBAAH/AZ0BRwEAAf8BnwFNAQAB/wHHAaoBgQH/ - AfwB+wH5Af8cAAOGAf8DGwH/DAADGwH/A4YB/zQAA98B/wP0Af8BSwGoAeYB/wEbAWkBtgH/ARMBaQG+ - Af8BQwGoAe4B/wHoAfQC/wHTAd8B6wH/A/oB/wO0Af8DJgH/AyYB/wMmAf8DogH/A/oF/wP+Af8D9gH/ - AW4BrgHbAf8BDgFsAccB/wEOAWwBxwH/AW4BrgHbAf8D9QH/A/0B/wQAAfwB+wH5Af8BvAGWAUQB/wGg - AUsBAAH/AaEBTAEAAf8BngFHAQAB/wHKAaoBVQH/AfYB8QHoAf8BzQGvAV8B/wGeAUcBAAH/AaEBTAEA - Af8BoQFLAQAB/wG6AZQBQAH/AfwB+gH4Af8UAAOGAf8DAAH/FwAB/wOGAf84AAFLAagB5gH/ARsBaQG2 - Af8BEwFpAb4B/wETAWkBvgH/AZgBpAGwAf8B6AH0Av8D/gH/A/IB/wM/Af8D6AH/A0EB/wPoAf8D/gH/ - A/QB/wP0Af8D9AH/AZQBvQHgAf8BDgFsAccB/wEOAWwBxwH/AQ4BbAHHAf8BbgGuAdsB/wP1Af8EAAHM - Aa8BiAH/AaUBUAEAAf8BpQFQAQAB/wGlAVEBAAH/AaIBSwEAAf8B5gHWAbsF/wHrAd4ByAH/AaMBTQEA - Af8BpQFQAQAB/wGlAVABAAH/AaUBUAEAAf8BygGtAYQB/xQAAzUB/wMAAf8XAAH/AzUB/zAAASQBaQGu - Af8BJAFpAa4B/wE8AWUBnQH/ATwBZQGdAf8BGwFpAbYB/wEbAWkBtgH/AZgBpAGwAf8B6AH0Bv8D+QH/ - A40B/wNmAf8DcAH/A/cF/wP0Af8BDgFsAccB/wEOAWwBxwH/AQ4BbAHHAf8BlAG9AeAB/wEOAWwBxwH/ - AQ4BbAHHAf8BlAG9AeAB/wP2Af8B8gHqAeEB/wGpAVcBAAH/AaoBVQEAAf8BqgFVAQAB/wGqAVUBAAH/ - AacBUAEAAf8B5QHTAbYF/wHqAdwBwwH/AagBUgEAAf8BqgFUAQAB/wGqAVUBAAH/AaoBVQEAAf8BqQFW - AQAB/wHwAekB3gH/EAADNQH/AwAB/xcAAf8DNQH/HAAD3wH/A98B/wwAASQBaQGuAf8BtQH6Av8BzQH2 - Av8BzQH2Av8BSwGoAeYB/wFLAagB5gH/AegB9AL/AdMB3wHrBf8D/QH/A9sB/wMmAf8DyQH/A/sF/wP0 - Af8BDgFsAccB/wP0Af8D9AH/A/QB/wGUAb0B4AH/AZQBvQHgAf8D9gH/A/4B/wHWAb4BnQH/AbABXAEA - Af8BrgFZAQAB/wGvAVoBAAH/Aa8BWgEAAf8BrAFVAQAB/wHmAdUBtgX/AesB3AHEAf8BrQFXAQAB/wGv - AVkBAAH/Aa8BWgEAAf8BrgFaAQAB/wGvAVkBAAH/AdMBuQGWAf8TAAH/A8AB/xQAA8AB/wMAAf8YAAHT - Ad8B6wH/AegB9AL/AegB9AL/AdMB3wHrAf8IAAE8AWUBnQH/Ac0B9gL/AckB9gL/AWgBpAHRAf8BaAGk - AdEB/wHJAfYC/wPlAf8EAAj/A/YB/wP0Af8D9AH/A/0F/wP0Af8BDgFsAccB/wP0Af8D9gH/AW4BrgHb - Af8BbgGuAdsB/wP0Af8D/AX/AcoBqQFcAf8BwAGOARgB/wG1AWEBAAH/AbMBXQEAAf8BtAFfAQAB/wGy - AVsBAAH/AegB1gG4Bf8B7AHeAcUB/wGyAVwBAAH/AbQBXgEAAf8BtAFfAQAB/wG0AV8BAAH/AbUBXwEA - Af8BxAGfAUkB/w8AAf8DTgH/HAADTgH/AwAB/xAAA98B/wHoAfQC/wGYAaQBsAH/AZgBpAGwAf8B6AH0 - Av8D3wH/BAABPAFlAZ0B/wHNAfYC/wFoAaQB0QH/ATgBZQGhAf8BOAFlAaEB/wFoAaQB0QH/A/QB/wPf - Bf8D/gH/A/YB/wFuAa4B2wH/AW4BrgHbAf8D9QH/A/0B/wP0Af8BDgFsAccB/wP0Af8BbgGuAdsB/wEO - AWwBxwH/AQ4BbAHHAf8BbgGuAdsB/wP1Af8D/QH/AckBpgFTAf8ByQGbASoB/wHFAZQBIwH/Ab4BiQEO - Af8BugGAAQAB/wG3AV8BAAH/AesB2QG7Bf8B7wHhAcgB/wG3AWEBAAH/AbkBYwEAAf8BuQFjAQAB/wG5 - AWMBAAH/AboBYwEAAf8BwwGaAT0B/xAAAxsB/wPAAf8UAAPAAf8DGwH/EAAB0wHfAesB/wHoAfQC/wFD - AagB7gH/ARMBaQG+Af8BEwFpAb4B/wFDAagB7gH/Ac0B9gL/Ac0B9gL/ASQBaQGuAf8BtQH6Av8BQwGo - Ae4B/wETAWkBvgH/AQsBaQHHAf8BCwFpAccB/wGMAaQBvQH/AdwB9AL/A/4B/wP2Af8BbgGuAdsB/wEO - AWwBxwH/AQ4BbAHHAf8BbgGuAdsB/wP0Af8D9AH/AQ4BbAHHAf8D9AH/AZQBvQHgAf8BDgFsAccB/wEO - AWwBxwH/AQ4BbAHHAf8BbgGuAdsB/wP1Af8B0AGvAYEB/wHOAaABLwH/AcsBnAEuAf8BzAGcAS4B/wHK - AZkBJgH/AcMBjQESAf8B5QHUAbUF/wHnAdgBvAH/Ab4BgwEAAf8BwAGHAQUB/wHBAYgBCAH/AcIBigEL - Af8BxgGQAREB/wHMAagBVgH/EAADNQH/AxsB/xQAAxsB/wM1Af8QAAHoAfQC/wGYAaQBsAH/ARMBaQG+ - Af8BEwFpAb4B/wETAWkBvgH/ARMBaQG+Af8BPAFlAZ0B/wE8AWUBnQH/ASQBaQGuAf8BJAFpAa4B/wET - AWkBvgH/ARMBaQG+Af8BCwFpAccB/wELAWkBxwH/AYwBpAG9Af8B3AH0Av8D9gH/AW4BrgHbAf8BDgFs - AccB/wEOAWwBxwH/AQ4BbAHHAf8BDgFsAccB/wFuAa4B2wH/AQ4BbAHHAf8BDgFsAccB/wEOAWwBxwH/ - AQ4BbAHHAf8BlAG9AeAB/wEOAWwBxwH/AQ4BbAHHAf8BlAG9AeAB/wP2Af8B3QHHAasB/wHTAaYBOAH/ - AdABogExAf8B0AGhATIB/wHQAaEBMgH/AdABnwEtAf8BywGkAUIB/wHUAcMBpQH/AcoBpAFCAf8BzQGb - ASUB/wHOAZwBKAH/Ac4BnAEoAf8BzgGcAScB/wHPAZ0BJwH/AdoBwwGiAf8QAAM1Af8DGwH/FAADGwH/ - AzUB/xAAAegB9AL/AZgBpAGwAf8BEwFpAb4B/wETAWkBvgH/AQsBaQHHAf8BCwFpAccB/wETAWkBvgH/ - AUMBqAHuAf8B6gH2Av8B6gH2Av8D9gH/A/YB/wGMAaQBvQH/AYwBpAG9Af8D9AH/A98B/wP3Af8BlAG9 - AeAB/wEOAWwBxwH/AQ4BbAHHAf8BDgFsAccB/wEOAWwBxwH/AQ4BbAHHAf8BbgGuAdsB/wP0Af8D9AH/ - A/QB/wP0Af8BlAG9AeAB/wGUAb0B4AH/A/YB/wP+Af8B9QHvAecB/wHRAagBRgH/AdgBqQE4Af8B1QGm - ATgB/wHVAaYBNgH/AdQBowExAf8B5QHHAZEB/wHzAeoB2AH/AecBywGZAf8B0wGhAS0B/wHTAaIBMAH/ - AdMBoQEuAf8B1QGjAS0B/wHNAZ0BMQH/AfQB7QHkAf8QAAOGAf8DGwH/FAADGwH/A4YB/xAAAdMB3wHr - Af8B6AH0Av8BQwGoAe4B/wETAWkBvgH/AQsBaQHHAf8BCwFpAccB/wETAWkBvgH/ARMBaQG+Af8BmAGk - AbAB/wHoAfQC/wPfAf8D3wH/AdwB9AL/AdwB9AL/A98B/wQAA/4B/wP3Af8BlAG9AeAB/wEOAWwBxwH/ - AQ4BbAHHAf8BDgFsAccB/wEOAWwBxwH/AQ4BbAHHAf8BbgGuAdsB/wP1Af8D/QH/A/4B/wP3Af8D9gH/ - A/4F/wQAAd0ByAGqAf8B3QGyAUcB/wHaAasBOwH/AdkBqwE8Af8B1wGnATUB/wHxAeYB0wX/AfUB7gHh - Af8B1wGmATUB/wHXAacBNQH/AdgBpwEzAf8B2QGqATgB/wHbAcEBngH/GAADhgH/AxsB/wwAAxsB/wOG - Af8YAAPfAf8B6AH0Av8BmAGkAbAB/wETAWkBvgH/ARMBaQG+Af8BEwFpAb4B/wETAWkBvgH/AZgBpAGw - Af8B6AH0Av8D3wH/BAAD3wH/A98B/wgABP8D/gH/A/cB/wGUAb0B4AH/AQ4BbAHHAf8BDgFsAccB/wEO - AWwBxwH/AQ4BbAHHAf8BlAG9AeAB/wP2Af8D/gX/A/4B/wP+Cf8EAAH+Av0B/wHZAb8BmgH/AeABtgFN - Af8B3wGxAUAB/wHcAa0BOwH/AdcBtQFeAf8B4gHVAb4B/wHXAbcBgAH/AdsBqgE3Af8B3gGuAToB/wHe - AbEBQgH/AdYBuAGNAf8B/gH9AfwB/1AAAdMB3wHrAf8B6AH0Av8BQwGoAe4B/wETAWkBvgH/ARMBaQG+ - Af8BQwGoAe4B/wHoAfQC/wHTAd8B6wH/GAAI/wP+Af8D9wH/AZQBvQHgAf8BDgFsAccB/wEOAWwBxwH/ - AZQBvQHgAf8D9gH/A/4Z/wwAAd8BywGxAf8B3AG4AV4B/wHjAbgBTwH/AeMBtAFDAf8B3QGuATsB/wHh - AbIBPwH/AeIBtgFJAf8B2wGzAVUB/wHeAcgBqgH/Av4B/QH/WAAD3wH/AegB9AL/AZgBpAGwAf8BmAGk - AbAB/wHoAfQC/wPfAf8cAAz/A/4B/wP3Af8BlAG9AeAB/wGUAb0B4AH/A/YB/wP+Hf8QAAH2AfEB6wH/ - AeQB1AG/Af8B3gHFAaMB/wHeAcQBnAH/Ad4BxAGhAf8B5AHTAbwB/wH1Ae8B6QH/ZAAB0wHfAesB/wHo - AfQC/wHoAfQC/wHTAd8B6wH/IAAQ/wP+Af8D9wH/A/YB/wP+If9ZAAErAbkB/wEAAR0BTAH/AQ8BGAEu - Af/1AAFMAccB/wEWAc0B/AH/AQgBLQGHAf+0AAM7AWUBAAEiAQAB/wM6AWA1AAFMAccB/wEPAaAB0gH/ - AQsBIwFDAf8cAAMBAQIDAAEBGwABAQwAASIBIQEiATEDAAEBXAADPgFqAR0BpwEPAf8BAAEmAQAB/wEA - ASIBAAH/AzYBWDEAAUwBxwH/ARgB0QH8Af8BCAEtAYcB/zMAAQEDAAEBEAAB7AHSAewB/wFDAQABQgH/ - AeYBzAHmAf8DAgEDAxIBGRAAAUABSgFMAf8BNgE+AUEB/wEtATIBNQH/ASMBJgEpAf8CGQEeAf8BEAEO - ARQB/wEHAQMBCQH/AgABAQH/AwAB/xwAAz4BagEdAacBDwH/AToBuwEuAf8BAAEqAQAB/wEAAScBAAH/ - AQABIgEAAf8DNQFXLQABTAHHAf8BEQGhAdEB/wELASMBQwH/PwABAQQAAe0B2AHtAf8BqQEhAagB/wGA - AQEBUAH/AUYBAAFGAf8B6wHRAesB/xQAAUkBggGDAf8BlwHbAfUB/wEsAakBygH/ASwBqQHKAf8BKwGn - AckB/wEjAZ8BwgH/ARoBlgG5Af8BEgGNAbAB/wMAAf8cAAEcAaQBDgH/AToBuwEuAf8BOgG7AS4B/wEA - ASkBAAH/AQABKgEAAf8BAAEnAQAB/wEAASIBAAH/AzABTCkAAUwBxwH/ASIB4gH9Af8BCQEpAYAB/yMA - AQEDAAEBAwABAQMAAQEDAAEBAwABAQMAAQEEAAHoAdEB6AH/AaoBIQGpAf8BzAE4AcsB/wFPAQABTwH/ - AZYBCQGVAf8BTAEAAUsB/wHwAdUB8AH/EAABUQKMAf8BoAHgAfcB/wFCAc0B8QH/ATUBxwHuAf8BKQHB - AesB/wEeAbwB6AH/ARMBtwHmAf8BGAGSAbYB/wEFAQIBBwH/HAABHQGnAQ8B/wE6AbsBLgH/AToBuwEu - Af8BqgHUAaIB/wEZAaABDAH/AQABKgEAAf8BAAEnAQAB/wEAASEBAAH/KQABTAHHAf8BKQHXAfwB/wEJ - ASkBgAH/JAABqwHwAfcB/wGrAeIB5QH/AawBzgHMAf8BrQG7AbUB/wGuAacBnAH/BAAB5AHKAeQB/wGp - ASEBqAH/AdMBPAHSAf8B1AE/AdMB/wFQAQEBTwH/AZ8BDQGfAf8BjgEGAY0B/wFOAQABTQH/EAABhQKU - Af8BpwHjAfgB/wFNAdMB9AH/AUIBzgHxAf8BNgHIAe4B/wEpAcIB6wH/AR4BvAHoAf8BHQGZAbwB/wEN - AQoBDwH/GAADAgEDAR8BqwERAf8BOgG7AS4B/wGqAdQBogH/AbcB2gGwAf8BqgHUAaIB/wESAZMBBgH/ - AQABKgEAAf8BAAEiAQAB/yUAATEBkAH/AQABTAHHAf8BPwHeAfwB/wEJASkBgAH/AQABHwFLAf84AAGq - ASMBqQH/AdIBOwHRAf8B1QFAAdUB/wG9AUEBvAH/Ad4BmAHdAf8BjwEXAY4B/wGdAQ0BnAH/AU8BAAFP - Af8QAAGMApsB/wGuAeYB+gH/AYYB2AH2Af8BTQHUAfQB/wFCAc0B8QH/ATYBxwHuAf8BKQHCAesB/wEk - AaABwQH/AhQBGQH/GAADBAEFATQBuAEnAf8BtAHZAa0B/wHFAeIBwAH/AbcB2gGwAf8BtwHaAbAB/wGq - AdQBogH/AQwBiAEBAf8BAAEiAQAB/yEAAUABoAH/AQIBhwHHAf8BLAHAAfAB/wEhAcsB/gH/ASIBswHd - Af8BDQEeATcB/wEAAR8BSwH/GAABqwHwAfcB/wGrAeUB6QH/AawC1QH/AawBxAHBAf8BrQG1AawB/wGu - AaQBmAH/BAABqAEgAacB/wHSAT4B0QH/AbwBQAG7Af8B7wGlAe4B/wH7AZ8B+gH/Ae8BnQHuAf8BlwEj - AZYB/wFNAQABTQH/EAABkQGiAaEB/wGyAegB/AH/AaAB4gH6Af8BhgHYAfYB/wFOAdMB8wH/AUIBzgHx - Af8BNQHIAe4B/wEoAaUBxwH/AR0BHgEjAf8YAAMCAQMDRAF6AY4BxgGEAf8BuQHcAbMB/wHDAeEBvgH/ - AcMB4QG+Af8BtwHaAbAB/wGqAdQBogH/AQMBOAEAAf8cAAEJAYABsQH/AQIBhwHIAf8BIwG6AfcB/wEl - AcIB+QH/ARsBtwH5Af8BOQHWAfsB/wEWAaYB6AH/AQ0BHQE1Af8BAAEiAYMB/zAAAacBIQGmAf8BvAFA - AbsB/wHvAaUB7gH/AfsBmwH6Af8B+wGYAfoB/wH7AZkB+gH/AecBmAHmAf8BkQEfAZAB/xAAAZQBpgGl - Af8BvQHsAfwB/wGlAeUB+wH/AZ8B4gH6Af8BhgHYAfYB/wFOAdQB9AH/AUIBzQHxAf8BLAGpAcoB/wEl - ASkBLAH/IAADRgF+AZABxwGGAf8BvgHeAbgB/wHDAeEBvgH/AbMB2QGsAf8BkAHHAYYB/wM9AWkcAAEG - AUwBuAH/ASUBwQH5Af8BIQG3AfkB/wGTAe4B/gH/AY8B7AH+Af8BIwG0AfMB/wGNAeMB/gH/ASABugHi - Af8BBQEfATwB/xwAAasB8AH3Af8BrALVAf8BrgG0AawB/wGuAZkBigH/A/0B/wHPAYgBzwH/AeIBrwHi - Af8B+wGrAfoB/wH7AZgB+gH/AfsBmAH6Af8B6gGQAekB/wHPAYgBzwH/AfQB5gH0Af8QAAGUAaYBpQH/ - Ab0B7AH8Af8BvQHsAfwB/wGyAegB/AH/Aa4B5gH6Af8BpwHkAfkB/wGgAeAB9wH/AZcB2wH1Af8BLgEz - ATcB/yQAA0cBgQGUAckBigH/Ab0B3gG3Af8BjgHGAYQB/wMwAUsgAAEKAYMBuwH/ASoBxgH5Af8BOgGK - AawB/wE6AYoBrAH/AToBigGsAf8BOgGKAawB/wE6AYoBrAH/ATMB1QH6Af8BCAEeATkB/zAAAfAB1AHw - Af8BzwGIAc8B/wHuAb4B7gH/AfsBrgH6Af8B7AGRAesB/wHPAYgBzwH/AfMB4AHyAf8UAAGUAaYBpQH/ - AZQBpgGlAf8BkwKlAf8BjwGfAZ4B/wGIApcB/wGBAo4B/wFKAoQB/wFAAUoBTAH/ATcBPgFAAf8oAAM8 - AWYBlAHJAYoB/wMlATckAAEKAYMBvAH/AS0B0gH6Af8BGwE1AYQB/wwAAR4BkAHBAf8BJAG7AeEB/wEK - ARwBNgH/NAAB8gHbAfIB/wHPAYgBzwH/AeMBrAHjAf8BzwGIAc8B/wHzAeMB8wH/YAADAQECBAADAQEC - KAABEwGIAcEB/wEXAZ0B0AH/AUsB4wH6Af8BGwGFAZ4B/wEiATUBhwH/ASIBRwGcAf8BIwG/AfQB/wEZ - AYwBqgH/AQIBKQFLAf84AAHyAdsB8gH/Ac8BiAHPAf8B8AHjAfAB/5gAARoBlAHGAf8BFQGKAcEB/wEX - AZoBzQH/AT8B1QH1Af8BQgHpAf4B/wE+AdQB8wH/ARsBkgGyAf8BCAE1AYwB/wEAAUEBogH/PAAB/gH7 - Af4B/6AAARoBlAHGAf8BFgGNAcMB/wERAYsBugH/AREBiwG6Af8BDgGIAbcB/wEPAUQBoAH/AQoBggGy - Af//AKkAAzYBWAGZAgAB/wMzAVPwAAM4AV0B1wGaARsB/wGZAgAB/wGZAgAB/wMvAUosAAMeASsDVAGu - AVkCZAHsAR4BgwGWAf8BCwE3AY0B/wEAAS4BjAH/AU4CXQHwA1YBswMlATeYAAM6AWEB1wGaARsB/wHY - AZsBHAH/AZkCAAH/AZkCAAH/AZkCAAH/Ay8BSigAAVsCXgHQARIBsAHRAf8BhAHVAegB/wGhAesB9gH/ - ATQB5AL/AQABvgHzAf8BAAGfAd4B/wEAAYsBvgH/AVsCXgHZVAABtwGiAZMB/wEkAQoBAAH/ASQBCgEA - Af8BJAEKAQAB/wEkAQoBAAH/ASQBCgEAAf8BJAEKAQAB/wEkAQoBAAH/ASQBCgEAAf8BJAEKAQAB/wEk - AQoBAAH/ASQBCgEAAf8UAAHYAZsBHQH/AdgBmwEcAf8B2AGbARwB/wGZAgAB/wGZAgAB/wGZAgAB/wGZ - AgAB/wMvAUokAAEUAY8BqgH/AQ4B1wL/AZAB6gH6Af8BoQHrAfYB/wEyAdkB9AH/AQABvAHyAf8BAAGn - AegB/wEAAZwB2gH/AQABJAGEAf8UAAMxAU0CUgFRAaEBXwJYAeMBXwJYAeMBUgJRAaEBMQIwAU0EAAMx - AU0CUgFRAaEBXwJYAeMBXwJYAeMBUgJRAaEBMQIwAU0MAAG3AaIBkwH/Af0B+wH5Af8B4QHcAdgB/wHg - AdcB0gH/Ad8BzgHDAf8B3QHIAbsB/wHbAb8BrQH/AdsBuwGnAf8B2wG7AacB/wHbAbsBpwH/Ac8BtAGj - Af8BJAEKAQAB/xQAAdgBmwEcAf8B2AGbARwB/wHpAbQBPQH/AfwB1gGvAf8BtQEkAQAB/wGZAgAB/wGZ - AgAB/wGZAgAB/wMvAUogAAEVAZEBrgH/AQ0B0gH6Af8BjQHkAfYB/wGhAesB9gH/ATEB1wHzAf8BAAG5 - Ae8B/wEAAacB6AH/AQABnAHaAf8BAAEmAYYB/xAAAzUBVQNkAecBzwG4AakB/wHrAdYByAH/AeUBywG7 - Af8BswGVAUAB/wFkAlwB5wNLAY4DZAHnAc8BuAGpAf8B6wHWAcgB/wHlAcsBuwH/AbMBlQFAAf8BZAJc - AecBNQI0AVUIAAG3AaIBkwH/A/4B/wG6AaYBmAH/AbUBoAGRAf8B+wHsAeMB/wGkAY0BPwH/AZoBgwEz - Af8B9gHWAcIB/wGIATIBHwH/AYMBLAEZAf8BzwG0AaMB/wEkAQoBAAH/FAAB2AGbARwB/wHqAbcBggH/ - AfsB2AGyAf8B/gHRAaMB/wH7AdgBsgH/Aa8BGAEAAf8BmQIAAf8BmQIAAf8BmQIAAf8DKgFBHAABGAGV - AbAB/wEPAdIB+gH/AY0B5AH0Af8BoQHrAfYB/wExAdcB8gH/AQABuQHuAf8BAAGnAegB/wEAAZwB2gH/ - AQABKQGIAf8QAANVAbIB5gHWAcsB/wNZAcICYAFcAdQDYAHUAUwBKgEhAfsBCAIAAf8BCAIAAf8BCAIA - Af8BYQJYAeYCYAFcAdQDYAHUA1kBwgG5AZwBiAH/A1UBsggAAboBpQGWAf8D/gH/A/4B/wP+Af8B/QH7 - AfkB/wH9AfcB8wH/AfsB7AHjAf8B+gHnAdsB/wH4AeEB0gH/AfcB2wHJAf8B0AG5AasB/wEkAQoBAAH/ - FAAB5wGzAT0B/wHxAcMBkQH/Af4BzwGdAv8BzQGZAf8B/gHQAZ8B/wH7AdgBsgH/AakBDwEAAf8BmQIA - Af8BmQIAAf8BmQIAAf8DBAEFGAABGgGZAbUB/wEQAdEB+wH/AY4B5AH1Af8BoQHrAfYB/wExAdcB8gH/ - AQABuQHuAf8BAAGnAegB/wEAAZwB2gH/AQABLAGKAf8QAANlAfQE/wNXAd8DHQEqA1wBzQX/Af4B9wL/ - AfEB5gH/AfoB4wHUAf8B8wHXAccB/wNKAY0DHQEqA1wB3wHvAdYBxwH/AWQCUgH0CAABvgGpAZoB/wP+ - Af8BugGmAZgB/wG0AaABkQH/A/4B/wGjAY4BPwH/AZoBgwEzAf8B+wHsAeMB/wGJATIBIAH/AYMBLAEZ - Af8B0QHBAbYB/wEkAQoBAAH/FAADRQF8AeUBsgE8Af8B9AHAAYsC/wHNAZkC/wHNAZkB/wH+AdABoQH/ - AfsB2AGyAf8BqQEPAQAB/wGZAgAB/wGZAgAB/xwAAR0BmwG3Af8BEAHQAfkB/wGNAeMB9QH/AaEB6wH2 - Af8BMwHZAfIB/wEAAbkB7gH/AQABpwHoAf8BAAGcAdoB/wEAAS4BjQH/EAADVQGyAfIB5gHeAf8DWQHC - A1wB1AFgAlwB1ANhAeIB0wG1AaIB/wFPAk0B+gHaAcABrwH/A18B8wNbAdYBYAJcAdQDWQHCAcsBsQGh - Af8DVQGyCAABwwGuAZ4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/Af0B9wHzAf8B/AHyAewB/wH7AewB4wH/ - AfoB5wHbAf8B0QHBAbYB/wEkAQoBAAH/GAADRgF/AeQBsAE6Af8B9gHEAZAC/wHNAZkC/wHNAZkB/wH+ - AdABoQH/AfsB2AGyAf8BqQEPAQAB/wGZAgAB/xwAAR8BngG6Af8BDgHQAfkB/wGNAeMB9AH/AaEB6wH2 - Af8BMAHXAfIB/wEAAbcB7gH/AQABpwHoAf8BAAGcAdoB/wEAATABjwH/EAADNQFVA2QB5wHtAeEB1wP/ - Af0C/wH3AfEB/wHYAcQBtwH/A2QB5wNLAY4DZAHnAe0B4QHXA/8B/QL/AfcB8QH/AdgBxAG3Af8DZAHn - AzUBVQgAAcgBsgGjAf8D/gH/AboBpgGYAf8BtAGgAZEB/wP+Af8BpAGOAT8B/wGZAYQBMwH/Af0B9wHz - Af8BiAEyAR8B/wGDASwBGQH/AdEBwQG2Af8BJAEKAQAB/xwAA0kBhwHjAa8BOQH/AfYBxAGQAv8BzQGZ - Av8BzQGZAf8B/gHQAaEB/wHyAckBnQH/AbABGwEAAf8cAAEgAaIBvAH/AQgBzgH3Af8BiwHjAfQB/wGh - AesB9gH/AS8B1gHyAf8BAAG3Ae4B/wEAAacB6AH/AQABnAHaAf8BAAExAZIB/xQAAzEBTQNSAaEDXwHj - A18B4wNSAaEDMQFNBAADMQFNA1IBoQNfAeMDXwHjA1IBoQMxAU0MAAHMAbYBpwH/A/4B/wP+Af8D/gH/ - A/4B/wP+Af8D/gH/Af0B+wH5Af8B/QH3AfMB/wH8AfIB7AH/AfsB7AHjAf8BJAEKAQAB/yAAA0kBhwHj - Aa8BOQH/AfYBxAGQAv8BzQGZAf8B8wHCAY4B/wHjAbABOgH/A0MBeBwAASwBqQHAAf8BFwHUAfoB/wGc - AewB+gH/AasB7wH6Af8BpgHtAfgB/wGUAecB+AH/ATIB2QH2Af8BAAG9AekB/wEEAT0BlwH/VAAB6gGq - AYsB/wHqAaoBiwH/AeoBqgGLAf8B6QGlAYQB/wHnAZcBLwH/AeYBjgEjAf8B4wE+AQsB/wHjATcBAQH/ - AeIBMwEAAf8B4gEzAQAB/wHiATMBAAH/AcgBIwEAAf8kAANJAYcB4wGvATkB/wHuAb0BigH/AeMBsAE6 - Af8DNAFUIAABgAGzAcUB/wGbAd4B6wH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5 - Af0B/wGgAd8B6gH/AScBkQGiAf9UAAHqAaoBiwL/AcIBogH/Af4BwAGfAf8B/QG9AZoB/wH7AbUBkAH/ - AfoBsAGLAf8B+AGnAT4B/wH2AaIBOAH/AfUBnQEyAf8B9QGZASsB/wHzAZUBJgH/Ac0BJgEAAf8oAANA - AW4B5QGyAT4B/wMmATgkAAM7AWMDYAHWATcBqwG6Af8BMQGjAbMB/wEtAZ0BrwH/ASwBmwGuAf8BMAGi - AbQB/wNeAdkDQAFvVAAB6gGqAYsB/wHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHpAaEBQAH/AegBmwE3 - Af8B5gGOASMB/wHlAYcBGQH/AeQBgQEPAf8B5AE8AQcB/wHjATcBAAH/AeIBMwEAAf//AP8ACgABQgFN - AT4HAAE+AwABKAMAAUADAAFAAwABAQEAAQEGAAECFgAD/4EABf8BwwIAAfABHwP/AYECAAHAAQcB8wGf - Af8DAAGAAQMB5wHPAf8BwAIAAYABAwHnAc8B/wQAAQEB5wHPAecEAAEBAecBzwHDAQEDAAEBAc8B5wGB - BAABAQHnAc8FAAEBAecBzwUAAQEB5wHPBQABAQHnAc8BAAEBAgABgAEDAfMBnwGAARMCAAGAAQMC/wHA - AT8CAAHgAQcC/wHgAX8CAAHwAR8C/wHwAf8CAAL/AfwBfwb/AfwBfwT/AfwBfwH8AX8BPwFzAv8B+AE/ - AfwBfwH5AeAB8AEHAfABHwH8AX8B/wFBAfABBwHwAQ8B/AF/AoAB8AEHAfABDwH8AX8BwQEAAfABBwHg - AQ8B+AE/Af8BAAHwAQcB4AEPAfABHwGBAQAB8AEHAeABDwHgAQ8B/wEAAfABBwH4AQ8B4AEPAeABAAHw - AQcB/AEfAeABDwH/AQEB8AEHAf4BPwHjAY8B/wGDAv8B/QF/AeABDwH/AccE/wHgAQ8B/wHvBP8B8AEf - DP8B+Af/AfABfwHwAQcE/wHgAT8B8AEHAv8BwAEDAeABHwHwAQcBwAGBAcABAwHgAQ8B8AEHAYABAAHA - AQMB4AEHAfABBwGAAQABwAEDAeABAwHwAQcBgAEAAcABAwHgAQcB8AEHAYABAAHAAQMB8AEHAfABBwGA - AQABwAEDAfgBBwHwAQcBwAGBAcABAwH8AQcB8AEHAv8BwAEDAf4BDwHwAQcC/wHAAQMB/wEfAfABBwL/ - AcABAxD/Cw== + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACm + MAAAAk1TRnQBSQFMAgEBDgEAAaQBAQGkAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABQAMAAQEBAAEgBgABQBIAgP+AAAT/A10B/wPAAf8D9AH/A9YB/wNITf8DAAH/AwAB/wFWAXkBuRH/ + gAAE/wO0Af8DJgH/AyYB/wMmAf8Dok3/AwAB/wMAAf8BVgF5AbkB/wMADf+AAAT/A/IB/wM/Af8D6AH/ + A0EB/wPoAf8BIwEJAQAB/wEjAQkBAAH/ASMBCQEAAf8BIwEJAQAB/wEjAQkBAAH/ASMBCQEAAf8BIwEJ + AQAB/wEjAQkBABH/AbcBogGTAf8BYgFIATQB/wFiAUgBNAH/AWIBSAE0Af8BYgFIATQJ/wMAAf8BVgF5 + AbkB/wFWAXkBuQH/AWIBSAE0Af8DAAn/gAAE/wP5Af8DjQH/A2YB/wNwAf8D9wH/Ad8BzgHDAf8B3QHI + AbsB/wHbAb8BrQH/AdsBuwGnAf8B2wG7AacB/wHbAbsBpwH/Ac8BtAGjAf8BIwEJAQAR/wG3AaIBkwH/ + Af0B+wH5Af8B4QHcAdgB/wHgAdcB0gH/Ad8BzgHDAf8B3QHIAbsJ/wMAAf8DfgH/AWIBSAE0Af8BYgFI + ATQB/wMABf+AAAT/A/0B/wPbAf8DJgH/A8kB/wP7Af8B+wHsAeMB/wGkAY0BPgH/AZoBgwEyAf8B9gHW + AcIB/wGIATEBHgH/AYMBKwEYAf8BzwG0AaMB/wEjAQkBABH/AbcBogGTAf8D/gH/AboBpgGYAf8BtQGg + AZEB/wH7AewB4wH/AaQBjQF9Af8BmgGDAXEJ/wMAAf8DfgH/AWIBSAE0Af8BYgFIATQB/wMAAf+AAAj/ + AboBpQGWAf8D/gH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/AfsB7AHjAf8B+gHnAdsB/wH4AeEB0gH/ + AfcB2wHJAf8B0AG5AasB/wEjAQkBABH/AboBpQGWAf8D/gH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/ + AfsB7AHjAf8B+gHnAdsJ/wMAAf8DfgH/AWIBSAE0Af8BYgFIATQB/4AACP8BvgGpAZoB/wP+Af8BugGm + AZgB/wG0AaABkQH/A/4B/wGjAY4BPgH/AZoBgwEyAf8B+wHsAeMB/wGJATEBHwH/AYMBKwEYAf8B0QHB + AbYB/wEjAQkBABH/Ab4BqQGaAf8D/gH/AboBpgGYAf8BtAGgAZEB/wP+Af8BowGOAX0B/wGaAYMBcQH/ + AfsB7AHjAf8BiQFwAV4J/wMAAf8DfgH/AWIBSAE0Af+AAAj/AcMBrgGeAf8D/gH/A/4B/wP+Af8D/gH/ + A/4B/wH9AfcB8wH/AfwB8gHsAf8B+wHsAeMB/wH6AecB2wH/AdEBwQG2Af8BIwEJAQAR/wHDAa4BngH/ + A/4B/wP+Af8D/gH/A/4B/wP+Af8B/QH3AfMB/wH8AfIB7AH/AfsB7AHjAf8B+gHnAdsJ/wMAAf8DfgH/ + gAAI/wHIAbIBowH/A/4B/wG6AaYBmAH/AbQBoAGRAf8D/gH/AaQBjgE+Af8BmQGEATIB/wH9AfcB8wH/ + AYgBMQEeAf8BgwErARgB/wHRAcEBtgH/ASMBCQEAEf8ByAGyAaMB/wP+Af8BugGmAZgB/wG0AaABkQH/ + A/4B/wGkAY4BfQH/AZkBhAFxAf8B/QH3AfMB/wGIAXABXQH/AYMBagFXAf8B0QHBAbYJ/wFiAUgBNAH/ + gAAI/wHMAbYBpwH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/Af0B+wH5Af8B/QH3AfMB/wH8AfIB7AH/ + AfsB7AHjAf8BIwEJAQAR/wHMAbYBpwH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/Af0B+wH5Af8B/QH3 + AfMB/wH8AfIB7AH/AfsB7AHjAf8BYgFIATQJ/4AACP8B6gGqAYsB/wHqAaoBiwH/AeoBqgGLAf8B6QGl + AYQB/wHnAZcBLgH/AeYBjgEiAf8B4wE9AQoB/wHjATYBAAH/AeIBMgEAAf8B4gEyAQAB/wHiATIBAAH/ + AcgBIgEAEf8B6gGqAYsB/wHqAaoBiwH/AeoBqgGLAf8B6QGlAYQB/wHnAZcBbQH/AeYBjgFhAf8B4wF8 + AUkB/wHjAXUBPwH/AeIBcQE4Af8B4gFxATgB/wHiAXEBOAH/AcgBYQEuCf+AAAj/AeoBqgGLAv8BwgGi + Af8B/gHAAZ8B/wH9Ab0BmgH/AfsBtQGQAf8B+gGwAYsB/wH4AacBPQH/AfYBogE3Af8B9QGdATEB/wH1 + AZkBKgH/AfMBlQElAf8BzQElAQAR/wHqAaoBiwL/AcIBogH/Af4BwAGfAf8B/QG9AZoB/wH7AbUBkAH/ + AfoBsAGLAf8B+AGnAXwB/wH2AaIBdgH/AfUBnQFwAf8B9QGZAWkB/wHzAZUBZAH/Ac0BZAEwCf+AAAj/ + AeoBqgGLAf8B6gGqAYsB/wHqAaoBiwH/AeoBqgGLAf8B6QGhAT8B/wHoAZsBNgH/AeYBjgEiAf8B5QGH + ARgB/wHkAYEBDgH/AeQBOwEGAf8B4wE2AQAB/wHiATIBABH/AeoBqgGLAf8B6gGqAYsB/wHqAaoBiwH/ + AeoBqgGLAf8B6QGhAX4B/wHoAZsBdQH/AeYBjgFhAf8B5QGHAVcB/wHkAYEBTQH/AeQBegFFAf8B4wF1 + AT0B/wHiAXEBOAn/gACA/4AAgP//ACkAAdMB3wHrAf8B6AH0Av8B6AH0Av8B0wHfAesB/wgAA/QB/wP0 + Af8D9QX/A/YB/wP0Af8D9A3/A/4B/wP2Af8D9QH/A/0J/xAAAe8B5gHcAf8BzgG1AZMB/wG4AZMBPgH/ + AbIBiAEsAf8BuAGSAT0B/wHOAbQBkAH/Ae4B5gHbAf94AAPfAf8B6AH0Av8BmAGkAbAB/wGYAaQBsAH/ + AegB9AL/A98B/wQAA/YB/wNcAf8DwAH/A/QB/wPWAf8DRwH/A/UJ/wP+Af8D9gH/AW0BrgHbAf8BbQGu + AdsB/wP1Af8D/QX/CAAB/QH7AfoB/wHIAawBhAH/AaEBTQEAAf8BnQFHAQAB/wGcAUUBAAH/AaQBUwEA + Af8BnQFGAQAB/wGdAUYBAAH/AZ8BTAEAAf8BxwGqAYEB/wH8AfsB+QH/HAADhgH/AxoB/wwAAxoB/wOG + Af80AAPfAf8D9AH/AUoBqAHmAf8BGgFoAbYB/wESAWgBvgH/AUIBqAHuAf8B6AH0Av8B0wHfAesB/wP6 + Af8DtAH/AyUB/wMlAf8DJQH/A6IB/wP6Bf8D/gH/A/YB/wFtAa4B2wH/AQ0BawHHAf8BDQFrAccB/wFt + Aa4B2wH/A/UB/wP9Af8EAAH8AfsB+QH/AbwBlgFDAf8BoAFKAQAB/wGhAUsBAAH/AZ4BRgEAAf8BygGq + AVQB/wH2AfEB6AH/Ac0BrwFeAf8BngFGAQAB/wGhAUsBAAH/AaEBSgEAAf8BugGUAT8B/wH8AfoB+AH/ + FAADhgH/AwAB/xcAAf8DhgH/OAABSgGoAeYB/wEaAWgBtgH/ARIBaAG+Af8BEgFoAb4B/wGYAaQBsAH/ + AegB9AL/A/4B/wPyAf8DPgH/A+gB/wNAAf8D6AH/A/4B/wP0Af8D9AH/A/QB/wGUAb0B4AH/AQ0BawHH + Af8BDQFrAccB/wENAWsBxwH/AW0BrgHbAf8D9QH/BAABzAGvAYgB/wGlAU8BAAH/AaUBTwEAAf8BpQFQ + AQAB/wGiAUoBAAH/AeYB1gG7Bf8B6wHeAcgB/wGjAUwBAAH/AaUBTwEAAf8BpQFPAQAB/wGlAU8BAAH/ + AcoBrQGEAf8UAAM0Af8DAAH/FwAB/wM0Af8wAAEjAWgBrgH/ASMBaAGuAf8BOwFkAZ0B/wE7AWQBnQH/ + ARoBaAG2Af8BGgFoAbYB/wGYAaQBsAH/AegB9Ab/A/kB/wONAf8DZQH/A28B/wP3Bf8D9AH/AQ0BawHH + Af8BDQFrAccB/wENAWsBxwH/AZQBvQHgAf8BDQFrAccB/wENAWsBxwH/AZQBvQHgAf8D9gH/AfIB6gHh + Af8BqQFWAQAB/wGqAVQBAAH/AaoBVAEAAf8BqgFUAQAB/wGnAU8BAAH/AeUB0wG2Bf8B6gHcAcMB/wGo + AVEBAAH/AaoBUwEAAf8BqgFUAQAB/wGqAVQBAAH/AakBVQEAAf8B8AHpAd4B/xAAAzQB/wMAAf8XAAH/ + AzQB/xwAA98B/wPfAf8MAAEjAWgBrgH/AbUB+gL/Ac0B9gL/Ac0B9gL/AUoBqAHmAf8BSgGoAeYB/wHo + AfQC/wHTAd8B6wX/A/0B/wPbAf8DJQH/A8kB/wP7Bf8D9AH/AQ0BawHHAf8D9AH/A/QB/wP0Af8BlAG9 + AeAB/wGUAb0B4AH/A/YB/wP+Af8B1gG+AZ0B/wGwAVsBAAH/Aa4BWAEAAf8BrwFZAQAB/wGvAVkBAAH/ + AawBVAEAAf8B5gHVAbYF/wHrAdwBxAH/Aa0BVgEAAf8BrwFYAQAB/wGvAVkBAAH/Aa4BWQEAAf8BrwFY + AQAB/wHTAbkBlgH/EwAB/wPAAf8UAAPAAf8DAAH/GAAB0wHfAesB/wHoAfQC/wHoAfQC/wHTAd8B6wH/ + CAABOwFkAZ0B/wHNAfYC/wHJAfYC/wFnAaQB0QH/AWcBpAHRAf8ByQH2Av8D5QH/BAAI/wP2Af8D9AH/ + A/QB/wP9Bf8D9AH/AQ0BawHHAf8D9AH/A/YB/wFtAa4B2wH/AW0BrgHbAf8D9AH/A/wF/wHKAakBWwH/ + AcABjgEXAf8BtQFgAQAB/wGzAVwBAAH/AbQBXgEAAf8BsgFaAQAB/wHoAdYBuAX/AewB3gHFAf8BsgFb + AQAB/wG0AV0BAAH/AbQBXgEAAf8BtAFeAQAB/wG1AV4BAAH/AcQBnwFIAf8PAAH/A00B/xwAA00B/wMA + Af8QAAPfAf8B6AH0Av8BmAGkAbAB/wGYAaQBsAH/AegB9AL/A98B/wQAATsBZAGdAf8BzQH2Av8BZwGk + AdEB/wE3AWQBoQH/ATcBZAGhAf8BZwGkAdEB/wP0Af8D3wX/A/4B/wP2Af8BbQGuAdsB/wFtAa4B2wH/ + A/UB/wP9Af8D9AH/AQ0BawHHAf8D9AH/AW0BrgHbAf8BDQFrAccB/wENAWsBxwH/AW0BrgHbAf8D9QH/ + A/0B/wHJAaYBUgH/AckBmwEpAf8BxQGUASIB/wG+AYkBDQH/AboBgAEAAf8BtwFeAQAB/wHrAdkBuwX/ + Ae8B4QHIAf8BtwFgAQAB/wG5AWIBAAH/AbkBYgEAAf8BuQFiAQAB/wG6AWIBAAH/AcMBmgE8Af8QAAMa + Af8DwAH/FAADwAH/AxoB/xAAAdMB3wHrAf8B6AH0Av8BQgGoAe4B/wESAWgBvgH/ARIBaAG+Af8BQgGo + Ae4B/wHNAfYC/wHNAfYC/wEjAWgBrgH/AbUB+gL/AUIBqAHuAf8BEgFoAb4B/wEKAWgBxwH/AQoBaAHH + Af8BjAGkAb0B/wHcAfQC/wP+Af8D9gH/AW0BrgHbAf8BDQFrAccB/wENAWsBxwH/AW0BrgHbAf8D9AH/ + A/QB/wENAWsBxwH/A/QB/wGUAb0B4AH/AQ0BawHHAf8BDQFrAccB/wENAWsBxwH/AW0BrgHbAf8D9QH/ + AdABrwGBAf8BzgGgAS4B/wHLAZwBLQH/AcwBnAEtAf8BygGZASUB/wHDAY0BEQH/AeUB1AG1Bf8B5wHY + AbwB/wG+AYMBAAH/AcABhwEEAf8BwQGIAQcB/wHCAYoBCgH/AcYBkAEQAf8BzAGoAVUB/xAAAzQB/wMa + Af8UAAMaAf8DNAH/EAAB6AH0Av8BmAGkAbAB/wESAWgBvgH/ARIBaAG+Af8BEgFoAb4B/wESAWgBvgH/ + ATsBZAGdAf8BOwFkAZ0B/wEjAWgBrgH/ASMBaAGuAf8BEgFoAb4B/wESAWgBvgH/AQoBaAHHAf8BCgFo + AccB/wGMAaQBvQH/AdwB9AL/A/YB/wFtAa4B2wH/AQ0BawHHAf8BDQFrAccB/wENAWsBxwH/AQ0BawHH + Af8BbQGuAdsB/wENAWsBxwH/AQ0BawHHAf8BDQFrAccB/wENAWsBxwH/AZQBvQHgAf8BDQFrAccB/wEN + AWsBxwH/AZQBvQHgAf8D9gH/Ad0BxwGrAf8B0wGmATcB/wHQAaIBMAH/AdABoQExAf8B0AGhATEB/wHQ + AZ8BLAH/AcsBpAFBAf8B1AHDAaUB/wHKAaQBQQH/Ac0BmwEkAf8BzgGcAScB/wHOAZwBJwH/Ac4BnAEm + Af8BzwGdASYB/wHaAcMBogH/EAADNAH/AxoB/xQAAxoB/wM0Af8QAAHoAfQC/wGYAaQBsAH/ARIBaAG+ + Af8BEgFoAb4B/wEKAWgBxwH/AQoBaAHHAf8BEgFoAb4B/wFCAagB7gH/AeoB9gL/AeoB9gL/A/YB/wP2 + Af8BjAGkAb0B/wGMAaQBvQH/A/QB/wPfAf8D9wH/AZQBvQHgAf8BDQFrAccB/wENAWsBxwH/AQ0BawHH + Af8BDQFrAccB/wENAWsBxwH/AW0BrgHbAf8D9AH/A/QB/wP0Af8D9AH/AZQBvQHgAf8BlAG9AeAB/wP2 + Af8D/gH/AfUB7wHnAf8B0QGoAUUB/wHYAakBNwH/AdUBpgE3Af8B1QGmATUB/wHUAaMBMAH/AeUBxwGR + Af8B8wHqAdgB/wHnAcsBmQH/AdMBoQEsAf8B0wGiAS8B/wHTAaEBLQH/AdUBowEsAf8BzQGdATAB/wH0 + Ae0B5AH/EAADhgH/AxoB/xQAAxoB/wOGAf8QAAHTAd8B6wH/AegB9AL/AUIBqAHuAf8BEgFoAb4B/wEK + AWgBxwH/AQoBaAHHAf8BEgFoAb4B/wESAWgBvgH/AZgBpAGwAf8B6AH0Av8D3wH/A98B/wHcAfQC/wHc + AfQC/wPfAf8EAAP+Af8D9wH/AZQBvQHgAf8BDQFrAccB/wENAWsBxwH/AQ0BawHHAf8BDQFrAccB/wEN + AWsBxwH/AW0BrgHbAf8D9QH/A/0B/wP+Af8D9wH/A/YB/wP+Bf8EAAHdAcgBqgH/Ad0BsgFGAf8B2gGr + AToB/wHZAasBOwH/AdcBpwE0Af8B8QHmAdMF/wH1Ae4B4QH/AdcBpgE0Af8B1wGnATQB/wHYAacBMgH/ + AdkBqgE3Af8B2wHBAZ4B/xgAA4YB/wMaAf8MAAMaAf8DhgH/GAAD3wH/AegB9AL/AZgBpAGwAf8BEgFo + Ab4B/wESAWgBvgH/ARIBaAG+Af8BEgFoAb4B/wGYAaQBsAH/AegB9AL/A98B/wQAA98B/wPfAf8IAAT/ + A/4B/wP3Af8BlAG9AeAB/wENAWsBxwH/AQ0BawHHAf8BDQFrAccB/wENAWsBxwH/AZQBvQHgAf8D9gH/ + A/4F/wP+Af8D/gn/BAAB/gL9Af8B2QG/AZoB/wHgAbYBTAH/Ad8BsQE/Af8B3AGtAToB/wHXAbUBXQH/ + AeIB1QG+Af8B1wG3AYAB/wHbAaoBNgH/Ad4BrgE5Af8B3gGxAUEB/wHWAbgBjQH/Af4B/QH8Af9QAAHT + Ad8B6wH/AegB9AL/AUIBqAHuAf8BEgFoAb4B/wESAWgBvgH/AUIBqAHuAf8B6AH0Av8B0wHfAesB/xgA + CP8D/gH/A/cB/wGUAb0B4AH/AQ0BawHHAf8BDQFrAccB/wGUAb0B4AH/A/YB/wP+Gf8MAAHfAcsBsQH/ + AdwBuAFdAf8B4wG4AU4B/wHjAbQBQgH/Ad0BrgE6Af8B4QGyAT4B/wHiAbYBSAH/AdsBswFUAf8B3gHI + AaoB/wL+Af0B/1gAA98B/wHoAfQC/wGYAaQBsAH/AZgBpAGwAf8B6AH0Av8D3wH/HAAM/wP+Af8D9wH/ + AZQBvQHgAf8BlAG9AeAB/wP2Af8D/h3/EAAB9gHxAesB/wHkAdQBvwH/Ad4BxQGjAf8B3gHEAZwB/wHe + AcQBoQH/AeQB0wG8Af8B9QHvAekB/2QAAdMB3wHrAf8B6AH0Av8B6AH0Av8B0wHfAesB/yAAEP8D/gH/ + A/cB/wP2Af8D/iH/WQABKgG5Af8BAAEcAUsB/wEOARcBLQH/9QABSwHHAf8BFQHNAfwB/wEHASwBhwH/ + tAADOwFlAQABIQEAAf8DOgFgNQABSwHHAf8BDgGgAdIB/wEKASIBQgH/HAADAQECAwABARsAAQEMAAEi + ASEBIgExAwABAVwAAz4BagEcAacBDgH/AQABJQEAAf8BAAEhAQAB/wM2AVgxAAFLAccB/wEXAdEB/AH/ + AQcBLAGHAf8zAAEBAwABARAAAewB0gHsAf8BQgEAAUEB/wHmAcwB5gH/AwIBAwMSARkQAAE/AUkBSwH/ + ATUBPQFAAf8BLAExATQB/wEiASUBKAH/AhgBHQH/AQ8BDQETAf8BBgECAQgB/wMAAf8DAAH/HAADPgFq + ARwBpwEOAf8BOQG7AS0B/wEAASkBAAH/AQABJgEAAf8BAAEhAQAB/wM1AVctAAFLAccB/wEQAaEB0QH/ + AQoBIgFCAf8/AAEBBAAB7QHYAe0B/wGpASABqAH/AYABAAFPAf8BRQEAAUUB/wHrAdEB6wH/FAABSAGC + AYMB/wGXAdsB9QH/ASsBqQHKAf8BKwGpAcoB/wEqAacByQH/ASIBnwHCAf8BGQGWAbkB/wERAY0BsAH/ + AwAB/xwAARsBpAENAf8BOQG7AS0B/wE5AbsBLQH/AQABKAEAAf8BAAEpAQAB/wEAASYBAAH/AQABIQEA + Af8DMAFMKQABSwHHAf8BIQHiAf0B/wEIASgBgAH/IwABAQMAAQEDAAEBAwABAQMAAQEDAAEBAwABAQQA + AegB0QHoAf8BqgEgAakB/wHMATcBywH/AU4BAAFOAf8BlgEIAZUB/wFLAQABSgH/AfAB1QHwAf8QAAFQ + AowB/wGgAeAB9wH/AUEBzQHxAf8BNAHHAe4B/wEoAcEB6wH/AR0BvAHoAf8BEgG3AeYB/wEXAZIBtgH/ + AQQBAQEGAf8cAAEcAacBDgH/ATkBuwEtAf8BOQG7AS0B/wGqAdQBogH/ARgBoAELAf8BAAEpAQAB/wEA + ASYBAAH/AQABIAEAAf8pAAFLAccB/wEoAdcB/AH/AQgBKAGAAf8kAAGrAfAB9wH/AasB4gHlAf8BrAHO + AcwB/wGtAbsBtQH/Aa4BpwGcAf8EAAHkAcoB5AH/AakBIAGoAf8B0wE7AdIB/wHUAT4B0wH/AU8BAAFO + Af8BnwEMAZ8B/wGOAQUBjQH/AU0BAAFMAf8QAAGFApQB/wGnAeMB+AH/AUwB0wH0Af8BQQHOAfEB/wE1 + AcgB7gH/ASgBwgHrAf8BHQG8AegB/wEcAZkBvAH/AQwBCQEOAf8YAAMCAQMBHgGrARAB/wE5AbsBLQH/ + AaoB1AGiAf8BtwHaAbAB/wGqAdQBogH/AREBkwEFAf8BAAEpAQAB/wEAASEBAAH/JQABMAGQAf8BAAFL + AccB/wE+Ad4B/AH/AQgBKAGAAf8BAAEeAUoB/zgAAaoBIgGpAf8B0gE6AdEB/wHVAT8B1QH/Ab0BQAG8 + Af8B3gGYAd0B/wGPARYBjgH/AZ0BDAGcAf8BTgEAAU4B/xAAAYwCmwH/Aa4B5gH6Af8BhgHYAfYB/wFM + AdQB9AH/AUEBzQHxAf8BNQHHAe4B/wEoAcIB6wH/ASMBoAHBAf8CEwEYAf8YAAMEAQUBMwG4ASYB/wG0 + AdkBrQH/AcUB4gHAAf8BtwHaAbAB/wG3AdoBsAH/AaoB1AGiAf8BCwGIAQAB/wEAASEBAAH/IQABPwGg + Af8BAQGHAccB/wErAcAB8AH/ASABywH+Af8BIQGzAd0B/wEMAR0BNgH/AQABHgFKAf8YAAGrAfAB9wH/ + AasB5QHpAf8BrALVAf8BrAHEAcEB/wGtAbUBrAH/Aa4BpAGYAf8EAAGoAR8BpwH/AdIBPQHRAf8BvAE/ + AbsB/wHvAaUB7gH/AfsBnwH6Af8B7wGdAe4B/wGXASIBlgH/AUwBAAFMAf8QAAGRAaIBoQH/AbIB6AH8 + Af8BoAHiAfoB/wGGAdgB9gH/AU0B0wHzAf8BQQHOAfEB/wE0AcgB7gH/AScBpQHHAf8BHAEdASIB/xgA + AwIBAwNEAXoBjgHGAYQB/wG5AdwBswH/AcMB4QG+Af8BwwHhAb4B/wG3AdoBsAH/AaoB1AGiAf8BAgE3 + AQAB/xwAAQgBgAGxAf8BAQGHAcgB/wEiAboB9wH/ASQBwgH5Af8BGgG3AfkB/wE4AdYB+wH/ARUBpgHo + Af8BDAEcATQB/wEAASEBgwH/MAABpwEgAaYB/wG8AT8BuwH/Ae8BpQHuAf8B+wGbAfoB/wH7AZgB+gH/ + AfsBmQH6Af8B5wGYAeYB/wGRAR4BkAH/EAABlAGmAaUB/wG9AewB/AH/AaUB5QH7Af8BnwHiAfoB/wGG + AdgB9gH/AU0B1AH0Af8BQQHNAfEB/wErAakBygH/ASQBKAErAf8gAANGAX4BkAHHAYYB/wG+Ad4BuAH/ + AcMB4QG+Af8BswHZAawB/wGQAccBhgH/Az0BaRwAAQUBSwG4Af8BJAHBAfkB/wEgAbcB+QH/AZMB7gH+ + Af8BjwHsAf4B/wEiAbQB8wH/AY0B4wH+Af8BHwG6AeIB/wEEAR4BOwH/HAABqwHwAfcB/wGsAtUB/wGu + AbQBrAH/Aa4BmQGKAf8D/QH/Ac8BiAHPAf8B4gGvAeIB/wH7AasB+gH/AfsBmAH6Af8B+wGYAfoB/wHq + AZAB6QH/Ac8BiAHPAf8B9AHmAfQB/xAAAZQBpgGlAf8BvQHsAfwB/wG9AewB/AH/AbIB6AH8Af8BrgHm + AfoB/wGnAeQB+QH/AaAB4AH3Af8BlwHbAfUB/wEtATIBNgH/JAADRwGBAZQByQGKAf8BvQHeAbcB/wGO + AcYBhAH/AzABSyAAAQkBgwG7Af8BKQHGAfkB/wE5AYoBrAH/ATkBigGsAf8BOQGKAawB/wE5AYoBrAH/ + ATkBigGsAf8BMgHVAfoB/wEHAR0BOAH/MAAB8AHUAfAB/wHPAYgBzwH/Ae4BvgHuAf8B+wGuAfoB/wHs + AZEB6wH/Ac8BiAHPAf8B8wHgAfIB/xQAAZQBpgGlAf8BlAGmAaUB/wGTAqUB/wGPAZ8BngH/AYgClwH/ + AYECjgH/AUkChAH/AT8BSQFLAf8BNgE9AT8B/ygAAzwBZgGUAckBigH/AyUBNyQAAQkBgwG8Af8BLAHS + AfoB/wEaATQBhAH/DAABHQGQAcEB/wEjAbsB4QH/AQkBGwE1Af80AAHyAdsB8gH/Ac8BiAHPAf8B4wGs + AeMB/wHPAYgBzwH/AfMB4wHzAf9gAAMBAQIEAAMBAQIoAAESAYgBwQH/ARYBnQHQAf8BSgHjAfoB/wEa + AYUBngH/ASEBNAGHAf8BIQFGAZwB/wEiAb8B9AH/ARgBjAGqAf8BAQEoAUoB/zgAAfIB2wHyAf8BzwGI + Ac8B/wHwAeMB8AH/mAABGQGUAcYB/wEUAYoBwQH/ARYBmgHNAf8BPgHVAfUB/wFBAekB/gH/AT0B1AHz + Af8BGgGSAbIB/wEHATQBjAH/AQABQAGiAf88AAH+AfsB/gH/oAABGQGUAcYB/wEVAY0BwwH/ARABiwG6 + Af8BEAGLAboB/wENAYgBtwH/AQ4BQwGgAf8BCQGCAbIB//8AqQADNgFYAZkCAAH/AzMBU/AAAzgBXQHX + AZoBGgH/AZkCAAH/AZkCAAH/Ay8BSiwAAx4BKwNUAa4BWQJkAewBHQGDAZYB/wEKATYBjQH/AQABLQGM + Af8BTgJdAfADVgGzAyUBN5gAAzoBYQHXAZoBGgH/AdgBmwEbAf8BmQIAAf8BmQIAAf8BmQIAAf8DLwFK + KAABWwJeAdABEQGwAdEB/wGEAdUB6AH/AaEB6wH2Af8BMwHkAv8BAAG+AfMB/wEAAZ8B3gH/AQABiwG+ + Af8BWwJeAdlUAAG3AaIBkwH/ASMBCQEAAf8BIwEJAQAB/wEjAQkBAAH/ASMBCQEAAf8BIwEJAQAB/wEj + AQkBAAH/ASMBCQEAAf8BIwEJAQAB/wEjAQkBAAH/ASMBCQEAAf8BIwEJAQAB/xQAAdgBmwEcAf8B2AGb + ARsB/wHYAZsBGwH/AZkCAAH/AZkCAAH/AZkCAAH/AZkCAAH/Ay8BSiQAARMBjwGqAf8BDQHXAv8BkAHq + AfoB/wGhAesB9gH/ATEB2QH0Af8BAAG8AfIB/wEAAacB6AH/AQABnAHaAf8BAAEjAYQB/xQAAzEBTQJS + AVEBoQFfAlgB4wFfAlgB4wFSAlEBoQExAjABTQQAAzEBTQJSAVEBoQFfAlgB4wFfAlgB4wFSAlEBoQEx + AjABTQwAAbcBogGTAf8B/QH7AfkB/wHhAdwB2AH/AeAB1wHSAf8B3wHOAcMB/wHdAcgBuwH/AdsBvwGt + Af8B2wG7AacB/wHbAbsBpwH/AdsBuwGnAf8BzwG0AaMB/wEjAQkBAAH/FAAB2AGbARsB/wHYAZsBGwH/ + AekBtAE8Af8B/AHWAa8B/wG1ASMBAAH/AZkCAAH/AZkCAAH/AZkCAAH/Ay8BSiAAARQBkQGuAf8BDAHS + AfoB/wGNAeQB9gH/AaEB6wH2Af8BMAHXAfMB/wEAAbkB7wH/AQABpwHoAf8BAAGcAdoB/wEAASUBhgH/ + EAADNQFVA2QB5wHPAbgBqQH/AesB1gHIAf8B5QHLAbsB/wGzAZUBPwH/AWQCXAHnA0sBjgNkAecBzwG4 + AakB/wHrAdYByAH/AeUBywG7Af8BswGVAT8B/wFkAlwB5wE1AjQBVQgAAbcBogGTAf8D/gH/AboBpgGY + Af8BtQGgAZEB/wH7AewB4wH/AaQBjQE+Af8BmgGDATIB/wH2AdYBwgH/AYgBMQEeAf8BgwErARgB/wHP + AbQBowH/ASMBCQEAAf8UAAHYAZsBGwH/AeoBtwGCAf8B+wHYAbIB/wH+AdEBowH/AfsB2AGyAf8BrwEX + AQAB/wGZAgAB/wGZAgAB/wGZAgAB/wMqAUEcAAEXAZUBsAH/AQ4B0gH6Af8BjQHkAfQB/wGhAesB9gH/ + ATAB1wHyAf8BAAG5Ae4B/wEAAacB6AH/AQABnAHaAf8BAAEoAYgB/xAAA1UBsgHmAdYBywH/A1kBwgJg + AVwB1ANgAdQBTAEqASEB+wEHAgAB/wEHAgAB/wEHAgAB/wFhAlgB5gJgAVwB1ANgAdQDWQHCAbkBnAGI + Af8DVQGyCAABugGlAZYB/wP+Af8D/gH/A/4B/wH9AfsB+QH/Af0B9wHzAf8B+wHsAeMB/wH6AecB2wH/ + AfgB4QHSAf8B9wHbAckB/wHQAbkBqwH/ASMBCQEAAf8UAAHnAbMBPAH/AfEBwwGRAf8B/gHPAZ0C/wHN + AZkB/wH+AdABnwH/AfsB2AGyAf8BqQEOAQAB/wGZAgAB/wGZAgAB/wGZAgAB/wMEAQUYAAEZAZkBtQH/ + AQ8B0QH7Af8BjgHkAfUB/wGhAesB9gH/ATAB1wHyAf8BAAG5Ae4B/wEAAacB6AH/AQABnAHaAf8BAAEr + AYoB/xAAA2UB9AT/A1cB3wMdASoDXAHNBf8B/gH3Av8B8QHmAf8B+gHjAdQB/wHzAdcBxwH/A0oBjQMd + ASoDXAHfAe8B1gHHAf8BZAJSAfQIAAG+AakBmgH/A/4B/wG6AaYBmAH/AbQBoAGRAf8D/gH/AaMBjgE+ + Af8BmgGDATIB/wH7AewB4wH/AYkBMQEfAf8BgwErARgB/wHRAcEBtgH/ASMBCQEAAf8UAANFAXwB5QGy + ATsB/wH0AcABiwL/Ac0BmQL/Ac0BmQH/Af4B0AGhAf8B+wHYAbIB/wGpAQ4BAAH/AZkCAAH/AZkCAAH/ + HAABHAGbAbcB/wEPAdAB+QH/AY0B4wH1Af8BoQHrAfYB/wEyAdkB8gH/AQABuQHuAf8BAAGnAegB/wEA + AZwB2gH/AQABLQGNAf8QAANVAbIB8gHmAd4B/wNZAcIDXAHUAWACXAHUA2EB4gHTAbUBogH/AU4CTQH6 + AdoBwAGvAf8DXwHzA1sB1gFgAlwB1ANZAcIBywGxAaEB/wNVAbIIAAHDAa4BngH/A/4B/wP+Af8D/gH/ + A/4B/wP+Af8B/QH3AfMB/wH8AfIB7AH/AfsB7AHjAf8B+gHnAdsB/wHRAcEBtgH/ASMBCQEAAf8YAANG + AX8B5AGwATkB/wH2AcQBkAL/Ac0BmQL/Ac0BmQH/Af4B0AGhAf8B+wHYAbIB/wGpAQ4BAAH/AZkCAAH/ + HAABHgGeAboB/wENAdAB+QH/AY0B4wH0Af8BoQHrAfYB/wEvAdcB8gH/AQABtwHuAf8BAAGnAegB/wEA + AZwB2gH/AQABLwGPAf8QAAM1AVUDZAHnAe0B4QHXA/8B/QL/AfcB8QH/AdgBxAG3Af8DZAHnA0sBjgNk + AecB7QHhAdcD/wH9Av8B9wHxAf8B2AHEAbcB/wNkAecDNQFVCAAByAGyAaMB/wP+Af8BugGmAZgB/wG0 + AaABkQH/A/4B/wGkAY4BPgH/AZkBhAEyAf8B/QH3AfMB/wGIATEBHgH/AYMBKwEYAf8B0QHBAbYB/wEj + AQkBAAH/HAADSQGHAeMBrwE4Af8B9gHEAZAC/wHNAZkC/wHNAZkB/wH+AdABoQH/AfIByQGdAf8BsAEa + AQAB/xwAAR8BogG8Af8BBwHOAfcB/wGLAeMB9AH/AaEB6wH2Af8BLgHWAfIB/wEAAbcB7gH/AQABpwHo + Af8BAAGcAdoB/wEAATABkgH/FAADMQFNA1IBoQNfAeMDXwHjA1IBoQMxAU0EAAMxAU0DUgGhA18B4wNf + AeMDUgGhAzEBTQwAAcwBtgGnAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/ + AfwB8gHsAf8B+wHsAeMB/wEjAQkBAAH/IAADSQGHAeMBrwE4Af8B9gHEAZAC/wHNAZkB/wHzAcIBjgH/ + AeMBsAE5Af8DQwF4HAABKwGpAcAB/wEWAdQB+gH/AZwB7AH6Af8BqwHvAfoB/wGmAe0B+AH/AZQB5wH4 + Af8BMQHZAfYB/wEAAb0B6QH/AQMBPAGXAf9UAAHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHpAaUBhAH/ + AecBlwEuAf8B5gGOASIB/wHjAT0BCgH/AeMBNgEAAf8B4gEyAQAB/wHiATIBAAH/AeIBMgEAAf8ByAEi + AQAB/yQAA0kBhwHjAa8BOAH/Ae4BvQGKAf8B4wGwATkB/wM0AVQgAAGAAbMBxQH/AZsB3gHrAf8BxQH5 + Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AaAB3wHqAf8BJgGRAaIB/1QAAeoBqgGL + Av8BwgGiAf8B/gHAAZ8B/wH9Ab0BmgH/AfsBtQGQAf8B+gGwAYsB/wH4AacBPQH/AfYBogE3Af8B9QGd + ATEB/wH1AZkBKgH/AfMBlQElAf8BzQElAQAB/ygAA0ABbgHlAbIBPQH/AyYBOCQAAzsBYwNgAdYBNgGr + AboB/wEwAaMBswH/ASwBnQGvAf8BKwGbAa4B/wEvAaIBtAH/A14B2QNAAW9UAAHqAaoBiwH/AeoBqgGL + Af8B6gGqAYsB/wHqAaoBiwH/AekBoQE/Af8B6AGbATYB/wHmAY4BIgH/AeUBhwEYAf8B5AGBAQ4B/wHk + ATsBBgH/AeMBNgEAAf8B4gEyAQAB//8A/wAKAAFCAU0BPgcAAT4DAAEoAwABQAMAAUADAAEBAQABAQYA + AQIWAAP/gQAF/wHDAgAB8AEfA/8BgQIAAcABBwHzAZ8B/wMAAYABAwHnAc8B/wHAAgABgAEDAecBzwH/ + BAABAQHnAc8B5wQAAQEB5wHPAcMBAQMAAQEBzwHnAYEEAAEBAecBzwUAAQEB5wHPBQABAQHnAc8FAAEB + AecBzwEAAQECAAGAAQMB8wGfAYABEwIAAYABAwL/AcABPwIAAeABBwL/AeABfwIAAfABHwL/AfAB/wIA + Av8B/AF/Bv8B/AF/BP8B/AF/AfwBfwE/AXMC/wH4AT8B/AF/AfkB4AHwAQcB8AEfAfwBfwH/AUEB8AEH + AfABDwH8AX8CgAHwAQcB8AEPAfwBfwHBAQAB8AEHAeABDwH4AT8B/wEAAfABBwHgAQ8B8AEfAYEBAAHw + AQcB4AEPAeABDwH/AQAB8AEHAfgBDwHgAQ8B4AEAAfABBwH8AR8B4AEPAf8BAQHwAQcB/gE/AeMBjwH/ + AYMC/wH9AX8B4AEPAf8BxwT/AeABDwH/Ae8E/wHwAR8M/wH4B/8B8AF/AfABBwT/AeABPwHwAQcC/wHA + AQMB4AEfAfABBwHAAYEBwAEDAeABDwHwAQcBgAEAAcABAwHgAQcB8AEHAYABAAHAAQMB4AEDAfABBwGA + AQABwAEDAeABBwHwAQcBgAEAAcABAwHwAQcB8AEHAYABAAHAAQMB+AEHAfABBwHAAYEBwAEDAfwBBwHw + AQcC/wHAAQMB/gEPAfABBwL/AcABAwH/AR8B8AEHAv8BwAEDEP8L diff --git a/Src/SwqlStudio/Metadata/Entity.cs b/Src/SwqlStudio/Metadata/Entity.cs index c79ba6555..f11be6387 100644 --- a/Src/SwqlStudio/Metadata/Entity.cs +++ b/Src/SwqlStudio/Metadata/Entity.cs @@ -2,7 +2,7 @@ namespace SwqlStudio.Metadata { - class Entity + public class Entity { private readonly List properties = new List(); private readonly List verbs = new List(); diff --git a/Src/SwqlStudio/Metadata/Property.cs b/Src/SwqlStudio/Metadata/Property.cs index 431256b5f..4f909e760 100644 --- a/Src/SwqlStudio/Metadata/Property.cs +++ b/Src/SwqlStudio/Metadata/Property.cs @@ -1,7 +1,7 @@  namespace SwqlStudio.Metadata { - class Property + public class Property { public string Name { get; set; } public string Type { get; set; } diff --git a/Src/SwqlStudio/ObjectExplorer/ObjectExplorer.cs b/Src/SwqlStudio/ObjectExplorer/ObjectExplorer.cs index af48eb00b..6747c7172 100644 --- a/Src/SwqlStudio/ObjectExplorer/ObjectExplorer.cs +++ b/Src/SwqlStudio/ObjectExplorer/ObjectExplorer.cs @@ -8,7 +8,6 @@ using System.ServiceModel.Security; using System.Text; using System.Threading; -using System.Web.UI.WebControls; using System.Windows.Forms; using SolarWinds.Logging; using SwqlStudio.Metadata; @@ -37,6 +36,7 @@ class ObjectExplorer : Control private TreeNodeUtils.TreeNodeBindings _treeBindings = new TreeNodeUtils.TreeNodeBindings(); // default value, so this field is never null private TreeNode _contextMenuNode; private readonly Dictionary _tableContextMenuItems; + private readonly Dictionary _tableCrudContextMenuItems; private readonly Dictionary _serverContextMenuItems; private readonly ContextMenu _verbContextMenu; private bool _isDragging; @@ -98,6 +98,7 @@ public ObjectExplorer() _tableContextMenuItems = new Dictionary(); _serverContextMenuItems = new Dictionary(); + _tableCrudContextMenuItems = new Dictionary(); _verbContextMenu = new ContextMenu(); _verbContextMenu.MenuItems.Add("Invoke...", (s, e) => OpenInvokeTab()); @@ -443,8 +444,27 @@ void _tree_MouseUp(object sender, MouseEventArgs e) if (_contextMenuNode.Tag is Entity) { var treeNodeWithConnectionInfo = _contextMenuNode as TreeNodeWithConnectionInfo; - if (treeNodeWithConnectionInfo != null) - _tableContextMenuItems[treeNodeWithConnectionInfo.Connection.Title].Show(_tree, e.Location); + if (treeNodeWithConnectionInfo != null && treeNodeWithConnectionInfo.Tag is Entity entity) + { + // crud does not make sense on indications + if (!entity.IsIndication && (entity.CanCreate || entity.CanDelete || entity.CanUpdate)) + { + var menuItem = _tableCrudContextMenuItems[treeNodeWithConnectionInfo.Connection.Title]; + + foreach (MenuItem subMenuItem in menuItem.MenuItems) + { + if (subMenuItem.Name == "create") subMenuItem.Enabled = entity.CanCreate; + if (subMenuItem.Name == "update") subMenuItem.Enabled = entity.CanUpdate; + if (subMenuItem.Name == "delete") subMenuItem.Enabled = entity.CanDelete; + } + + menuItem.Show(_tree, e.Location); + } + else + { + _tableContextMenuItems[treeNodeWithConnectionInfo.Connection.Title].Show(_tree, e.Location); + } + } } if (_contextMenuNode.Tag is IMetadataProvider) @@ -502,14 +522,28 @@ public void AddServer(IMetadataProvider provider, ConnectionInfo connection) connection.CanCreateSubscription = Convert.ToBoolean(dt.Rows[0][0]); } - var tableContextMenu = new ContextMenu(); - tableContextMenu.MenuItems.Add("Generate Select Statement", (s, e) => GenerateSelectStatement(_contextMenuNode.Tag as Entity, false)); - tableContextMenu.MenuItems.Add("Generate Select Statement (with Inherited Properties)", (s, e) => GenerateSelectStatement(_contextMenuNode.Tag as Entity, true)); + var tableContextMenuWithoutCrud = new ContextMenu(); + var tableContextMenuWithCrud = new ContextMenu(); + + var commonTableContextMenus = new[] { tableContextMenuWithCrud, tableContextMenuWithoutCrud }; + foreach(var tableContextMenu in commonTableContextMenus) + { + tableContextMenu.MenuItems.Add("Generate Select Statement", (s, e) => GenerateSelectStatement(_contextMenuNode.Tag as Entity, false)); + tableContextMenu.MenuItems.Add("Generate Select Statement (with Inherited Properties)", (s, e) => GenerateSelectStatement(_contextMenuNode.Tag as Entity, true)); + + if (connection.CanCreateSubscription) + tableContextMenu.MenuItems.Add("Subscribe", StartSubscription); + } + + tableContextMenuWithCrud.MenuItems.Add("-"); + // note: the names are crucial for disabling/enabling the menu based on operations allowed + tableContextMenuWithCrud.MenuItems.Add("Create", (s, e) => Crud(_contextMenuNode.Tag as Entity, CrudOperation.Create)).Name = "create"; + tableContextMenuWithCrud.MenuItems.Add("Update", (s, e) => Crud(_contextMenuNode.Tag as Entity, CrudOperation.Update)).Name = "update"; + tableContextMenuWithCrud.MenuItems.Add("Delete", (s, e) => Crud(_contextMenuNode.Tag as Entity, CrudOperation.Delete)).Name = "delete"; - if (connection.CanCreateSubscription) - tableContextMenu.MenuItems.Add("Subscribe", StartSubscription); - _tableContextMenuItems.Add(connection.Title, tableContextMenu); + _tableContextMenuItems.Add(connection.Title, tableContextMenuWithoutCrud); + _tableCrudContextMenuItems.Add(connection.Title, tableContextMenuWithCrud); var serverContextMenu = new ContextMenu(); serverContextMenu.MenuItems.Add("Refresh", (s, e) => RefreshServer(_contextMenuNode)); @@ -543,8 +577,11 @@ public void AddServer(IMetadataProvider provider, ConnectionInfo connection) connection.ConnectionClosed += (o, e) => { _tableContextMenuItems.Remove(connection.Title); - tableContextMenu.Dispose(); - tableContextMenu = null; + tableContextMenuWithCrud.Dispose(); + tableContextMenuWithCrud = null; + + tableContextMenuWithoutCrud.Dispose(); + tableContextMenuWithoutCrud = null; _serverContextMenuItems.Remove(connection.Title); serverContextMenu.Dispose(); @@ -668,16 +705,31 @@ private static TreeNode[] MakeEntityTreeNodes(IMetadataProvider provider, Connec private static TreeNodeWithConnectionInfo MakeEntityTreeNode(IMetadataProvider provider, ConnectionInfo connection, Entity table) { var node = new TreeNodeWithConnectionInfo(table.FullName, connection); - node.ImageKey = table.IsIndication ? "Indication" : (!table.IsAbstract ? "Table" : "TableAbstract"); + node.ImageKey = GetImageKey(table); node.SelectedImageKey = node.ImageKey; node.Tag = table; - node.ToolTipText = string.Format( - @"{0} + if (table.IsIndication) + { + node.ToolTipText += string.Format(@"{0} +Base type: {1} +CanSubscribe: {2}", + table.FullName, table.BaseType, connection.CanCreateSubscription); + } + else + { + + node.ToolTipText = string.Format( + @"{0} Base type: {1} CanCreate: {2} CanUpdate: {3} CanDelete: {4}", - table.FullName, table.BaseType, table.CanCreate, table.CanUpdate, table.CanDelete); + table.FullName, + table.BaseType, + table.CanCreate, + table.CanUpdate, + table.CanDelete); + } // Add keys AddPropertiesToNode(node, table.Properties.Where(c => c.IsKey)); @@ -695,6 +747,18 @@ private static TreeNodeWithConnectionInfo MakeEntityTreeNode(IMetadataProvider p return node; } + private static string GetImageKey(Entity table) + { + if (table.IsIndication) + return "Indication"; + else if (table.IsAbstract) + return "TableAbstract"; + else if (table.CanCreate || table.CanDelete || table.CanUpdate) + return "TableCrud"; + + return "Table"; + } + private static void AddVerbsToNode(TreeNode parent, Entity table, IMetadataProvider provider) { foreach (var verb in table.Verbs.OrderBy(v => v.Name)) @@ -748,6 +812,12 @@ private static string GetColumnIcon(Property column) return "Column"; } + private void Crud(Entity entity, CrudOperation operation) + { + var provider = FindProvider(_contextMenuNode); + ApplicationService.OpenCrudTab(operation, provider.ConnectionInfo, entity); + } + private void StartSubscription(object sender, EventArgs e) { var table = _contextMenuNode.Tag as Entity; diff --git a/Src/SwqlStudio/Resources/TableCrud.png b/Src/SwqlStudio/Resources/TableCrud.png new file mode 100644 index 000000000..6b10b41ec Binary files /dev/null and b/Src/SwqlStudio/Resources/TableCrud.png differ diff --git a/Src/SwqlStudio/SwqlStudio.csproj b/Src/SwqlStudio/SwqlStudio.csproj index b68b3f5ab..35ed34980 100644 --- a/Src/SwqlStudio/SwqlStudio.csproj +++ b/Src/SwqlStudio/SwqlStudio.csproj @@ -122,6 +122,13 @@ Component + + + UserControl + + + CrudTab.cs + @@ -233,6 +240,9 @@ ActivityMonitorTab.cs + + CrudTab.cs + EntityClassGraphForm.cs